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 的最新信息。
我从一段时间以来一直在使用 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 的最新信息。