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

xss filtering not removing single quotes in codeigniter

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

当用户输入时

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

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

Error Number: 37000

[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'hi'.

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

Filename: D:\htdocs\system\database\DB_driver.php

Line Number: 331

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

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

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

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

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

有什么方法可以在每次数据被 xss 过滤后生成日志吗?

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

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

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

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

你需要保护自己免受两者的侵害,但你应该了解其中的区别。

阅读this for SQL injection prevention in codeigniter. You can also use prepared statements, or 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);
        }
    }
}

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

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

还建议查看 CI 3 的文档,其中有更多关于 xss clean 和安全性 class 的最新信息。