我一直在使用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);
}
}
}
适合在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 和安全类的最新信息。