我正在尝试学习php,并想使用一个函数来保护免受SQL注入!但不知何故,格式记录我的数据库中包含任何特殊字符的每个数据,如'"=)/()/*/
我的filter函数:
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;
}注册页面以获取发布数据:
foreach($_POST as $key => $value) {
$data[$key] = filter($value);
}然后我尝试特殊的字符和形式保存它们!我做错了什么?
发布于 2012-07-24 08:29:40
如果您想防止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都会以正确的方式绑定参数。
发布于 2012-07-24 08:31:49
呃..。防止SQL注入的要点是继续允许用户键入他们喜欢的任何内容,而不会将服务器或其他用户置于危险之中。htmlspecialchars是一个很好的起点,因为它接收看起来像超文本标记语言标记的东西,并将它们呈现出来。虽然最新版本的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。
发布于 2012-07-24 08:31:26
停止使用mysql_*函数,因为它们已被弃用。请使用PHP database objects (PDO),因为PDO允许参数绑定,这可以保护您免受sql注入的影响。
您可以阅读《使用PDO here》。
https://stackoverflow.com/questions/11622462
复制相似问题