这是否可以防止SQL注入攻击?
function sanitize($value) {
// Stripslashes
if (is_array($value)) {
if (get_magic_quotes_gpc()) {
$value = array_map("stripslashes", $value);
}
$value = array_map("mysql_real_escape_string", $value);
} else {
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
$value = mysql_real_escape_string($value);
}
return $value;
}
$_REQUEST = array_map('sanitize', $_REQUEST);
$_GET = array_map('sanitize', $_GET);
$_POST = array_map('sanitize', $_POST);
$_COOKIE = array_map('sanitize', $_COOKIE);
我可以添加什么来清理()来防止跨站点脚本? 还有哪些其他渠道可以让攻击者插入恶意代码?
答案 0 :(得分:2)
单字答案是“是”。但是:
$value
是包含其他数组的数组,则无法正确处理。你应该循环$value
对你找到的每个数组进行sanitize
的递归调用。最后,有人可以破坏您的应用程序的其他方式是跨站点脚本(也称为CSS或XSS)和跨站点请求伪造(CSRF)。 SO和互联网上有很多资源可以用来加快速度。作为起点,针对XSS的保护涉及在您输出的任何内容上调用htmlspecialchars
,而针对CSRF的保护涉及要求特权用户在您的站点上执行的每项操作的特定于会话的ID代码。
阵列安全sanitize
版本
function sanitize($value) {
if (is_array($value)) {
foreach($value as &$item) {
$item = sanitize($item);
}
} else {
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
$value = mysql_real_escape_string($value);
}
return $value;
}
<强>更新强>
为了提高知名度:Bjoern与这个问题(What's the best method for sanitizing user input with PHP?)的链接非常好。
答案 1 :(得分:2)
没有
使用PHP Data Objects或者...使用Database Abstraction Layer或......执行此操作的某个框架。
不要自己编写,因为:
答案 2 :(得分:1)
如果在之后应用了数据库连接,那么它会正确地转义初始输入数据。
现在,您将无法使用此类转义值进行HTML输出。它不能防止二阶SQL注入(查询数据库,然后按原样使用这些值进行第二次查询)。更重要的是,大多数应用程序都在处理输入值。如果你进行任何类型的重写或字符串匹配,你可以撤消一些转义。
因此,为什么通常建议在汇编查询之前应用转义权限。尽管如此,代码本身对于一般情况是有用的,如果你不能重写遗留代码的大量则是可取的。
答案 3 :(得分:0)
您应该添加html_entities。大多数情况下,您将$ _POST变量放入文本框中,例如:
<textarea><?php echo $_POST['field']; ?></textarea>
他们可以通过填写并做任何他们想做的事来弄乱你的HTML。