我正在尝试学习php,并希望使用一个函数来保护表单再次SQL注入! 但不知何故形成记录我的数据库每个包含任何特殊字符的数据,如'“=)/()/ * /
我的过滤功能:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data = mysql_real_escape_string($data);
return $data;
}
注册页面以获取POST数据:
foreach($_POST as $key => $value) {
$data[$key] = filter($value);
}
然后我正在尝试特殊字符和表单保存它们!我做错了什么?
答案 0 :(得分:4)
如果您想防止SQL注入,最好的方法是使用PDO和准备好的查询,其中所有用户提供的数据都通过execute()
传递,如下所示:
$stmt = $pdo->prepare("INSERT INTO foo (a_column, b_column) VALUES (:a, :b)");
$stmt->execute(array(':a' => $a, ':b' => $b));
您无需对$a
或$b
执行任何操作;无论您使用哪个数据库,PDO都会以正确的方式绑定参数。
答案 1 :(得分:2)
嗯......防止SQL注入的目的是继续允许用户键入他们喜欢的内容,而不会让服务器或其他用户面临风险。 htmlspecialchars
是一个很好的起点,因为它看起来像HTML标记并使它们变得无用。您使用的stripslashes
很好,尽管最新版本的PHP删除了魔术引号。 mysql_real_escape_string
允许您以合理安全的字符串形式在数据库中插入任何内容。
因此,您的过滤器功能应如下所示:
function filter($data) {
if( get_magic_quotes_gpc()) $data = stripslashes($data);
return trim(mysql_real_escape_string(htmlspecialchars($data));
}
现在,如果你真的想要一个过滤器,就像只允许某些字符一样,请使用preg_match
这样的正则表达式函数。
答案 2 :(得分:0)
停止使用mysql_ *函数,因为它们已被弃用。请改用PHP database objects (PDO),因为PDO允许参数绑定,以保护您免受sql注入。
您可以阅读使用PDO here
答案 3 :(得分:0)