我从一段时间以来一直在使用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过滤清理数据时生成日志?
答案 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和安全类的最新信息。