xss过滤不删除codeigniter中的单引号

时间:2015-03-16 23:33:02

标签: php sql-server codeigniter xss sql-injection

我从一段时间以来一直在使用codeigniter我刚才发现sql的可能性 - 在我的脚本中注入

当用户输入

<script>alert('hi') </script> 

在我的输入字段$this->security->xss_clean($field)中删除了scipts,但它没有处理字符串的单引号。 因为我得到了查询错误

  

错误号码:37000

     

[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]'hi'附近的语法不正确。

     

SELECT * FROM account WHERE field1 ='[removed] alert('hi')[已删除]'AND field2 ='asdasd'

     

文件名:D:\ htdocs \ system \ database \ DB_driver.php

     

行号:331

这适用于典型的xss字符串,但是当用户添加1' or '1'='1

没有生成错误,查询成功运行。

我知道这可以通过str_replace("'","",$field);来解决。

我如何使用codeigniter解决这个问题?

是否存在像($config['global_xss_filtering'] = TRUE;)这样的问题的全局过滤器,因此我不必在所有输入函数中添加str_replace。

有没有办法在每次使用xss过滤清理数据时生成日志?

3 个答案:

答案 0 :(得分:3)

您尝试通过调用xss_clean来保护自己免受SQL注入。 xss_clean将保护您免受xss注入,但不会阻止sql注入。让我分解给你:

SQL注入:恶意用户输入,试图破解服务器端的数据库。用户输入将包含SQL代码。

XSS注入:恶意用户输入,试图为其他用户入侵(在大多数情况下为间谍)。用户输入将包含Javascript代码。

你需要保护自己免受两者的影响,但你应该了解其中的差异。

在codeigniter中读取this以获取SQL注入预防。您也可以使用预准备语句或flourishlib。至于防止XSS,你可以使用xss_clean,或者甚至可以用普通的PHP编写简单的代码:

public static function protectArrayAgainstXSS(&$arr) {
    foreach ($arr as $index => $a) {
        if (is_array($a)) {
            App::protectArrayAgainstXSS($arr[$index]);
        } else if ($a !== null) {
            $arr[$index] = strip_tags($a);
        }
    }
}

答案 1 :(得分:0)

xss_clean根本不适合在SQL查询中使用! XSS和SQL注入是两个独立的域。根据您的描述,它类似于strip_tags,这在SQL注入之前是完全没用的保护功能。

https://ellislab.com/codeIgniter/user-guide/database/queries.html

您必须使用escape *函数或查询参数绑定来清理SQL查询。我不使用codeigniter但这些概念是通用的。 str_replace的解决方案也不是很好的路径。

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; 
$this->db->query($sql, array(3, 'live', 'Rick')); // All three values should be escaped properly

答案 2 :(得分:0)

如果您使用CI 2,请确保您使用的是最新版本的codeigniter(2.2.1),它有一些xss clean&amp; amp;其他安全改进。

就您正在更新数据库的问题而言 - 只需使用CI活动记录。如果对数据库操作使用codeigniter活动记录,则codeigniter会自动转义查询。

还建议查看CI 3的文档,有关于xss clean和安全类的最新信息。