我正在使用以下功能来保护我的数据库免受gets
的注入攻击等。
function filter($data) {
global $db;
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $db->real_escape_string($data);
return $data;
}
foreach($_GET as $key => $value) {
$data[$key] = filter($value);
}
问题是,我不仅要过滤$_GET
,还要过滤$_POST
。怎么做?
我可以在过滤后将值重新分配给$_GET
或$_POST
吗?我的意思是$_GET[$key] = filter($value);
而不是$data[$key] = filter($value);
..
答案 0 :(得分:6)
不要预先转义变量,只在你需要转义它们时才转义它们。
PHP过去曾这样做过。它被称为magic_quotes_gpc
。
但是它bad practice已经被弃用了,它将从下一版本的PHP中删除。
最好在你需要的时候逃避一切。你打印一个变量?逃避它。你不必记住它是否已经被转义:它不是。
答案 1 :(得分:1)
这个功能毫无意义。
并且它不会过滤任何东西
不应该这样使用。
为了保护你的数据库免受注入攻击,你不应该做这个函数中存在的大部分事情,并且应该做很多不存在的事情。
仅保护字符串(引号括起来的数据块)免受注入攻击,你必须使用$ db-> real_escape_string而不是其他。
保护其他查询部分你必须使用其他程序,因为real_escape_string对他们来说完全无用
为了保护您的应用免受“其他攻击”,您必须首先定义这个“等”。
答案 2 :(得分:0)
array_walk($_GET,'filter');
array_walk($_POST,'filter');
array_walk($_COOKIE,'filter');
答案 3 :(得分:-1)
如果您稍后在查询中使用它,您应该过滤$ key,但如果可能,您应该使用mysql预编译语句并绑定变量。
http://www.ultramegatech.com/blog/2009/07/using-mysql-prepared-statements-in-php/
您可以更改$ _GET和$ _POST。