XSS 过滤不会删除代码点火器中的单引号


xss filtering not removing single quotes in codeigniter

我一直在使用codeigniter,我刚刚发现了在我的脚本中注入SQL - 的可能性

当用户输入时

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

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

错误号:37000

[Microsoft][ODBC SQL Server Driver][SQL Server]"hi"附近的语法不正确。

选择 * 从帐户,其中字段 1 = '[已删除]警报('HI') [已删除]' 和字段 2 = 'asdasd'

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

行号:331

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

未生成错误,查询成功运行。

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

如何使用编码点火器解决此问题?

这个问题是否有任何全局过滤器,例如 ( $config['global_xss_filtering'] = TRUE; )这样我就不必在所有输入函数上添加str_replace。

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

您尝试通过调用 xss_clean 来保护自己免受 SQL 注入的侵害。 xss_clean将保护您免受XSS注入,但不会阻止SQL注入。让我分解一下:

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

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

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

阅读此内容,了解编码器中的 SQL 注入预防。您还可以使用预准备语句或 bloomlib。至于针对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);
        }
    }
}
xss_clean根本不

适合在SQL查询中使用!XSS 和 SQL 注入是两个独立的域。从您的描述来看,它类似于strip_tags,这是在SQL注入之前进行保护的完全无用的功能。

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

必须使用 escape* 函数或查询参数绑定来清理 SQL 查询。我不使用代码点火器,但这些概念是通用的。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

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

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

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