2012-02-22 114 views
-1

这是在运行数据库查询之前防止SQL注入的好方法吗?使用mysql_real_escape_string和stripslashes避免SQL注入

$name = mysql_real_escape_string(stripslashes($name)); 
$age = mysql_real_escape_string(stripslashes($age)); 
$location = mysql_real_escape_string(stripslashes($location)); 

在此先感谢!

+3

为什么你需要'stripslashes'以及如何使用[PDO](http://php.net/manual/en/book.pdo.php)? – 2012-02-22 11:34:55

+0

简短的回答 - 不,不是。不要使用'mysql_ *'函数,但使用PDO,就像@Click建议的那样。 – 2012-02-22 11:38:42

+0

你的代码打破了最近/正确配置(魔术引号禁用)PHP安装中包含反斜杠的任何字符串。切勿无条件使用'stripslashes'。只有当'get_magic_quotes_gpc()'存在并返回'true'时才使用它! – ThiefMaster 2012-02-22 12:27:12

回答

4

这回答得好:

所以,你能做什么呢?解决方案是使用准备好的语句,其中 几乎所有的PHP数据库扩展都支持,而MySQL(ext/mysql)和SQLite2(ext/sqlite)的例外是 。 因此,为了安全起见,我建议使用PDO接口与 这些数据库进行会谈,或者在MySQL使用较新的MySQLi (ext/mysqli)扩展的情况下。这些接口提供了准备好的语句 支持,它允许在查询结构和查询参数之间进行分隔。

因此,要安全一侧,不要单独依靠mysql_real_escape_string,使用准备好的语句要好得多。

+2

这个答案为什么downvoted?它提供了关于'mysql_real_escape_string'的有用信息,以及何时失败。至少downvoter可能已经评论他们认为是错误的答案。 – 2012-02-22 11:38:13

+0

那么,你发布的链接是通过在一个非常特殊的情况下转向mysql_ *来推断观点。为什么有人需要甚至允许多字节字符,当他们的mysql字符集不应该支持它?虽然PDO似乎以自己的方式处理这个问题,但是mysql_ *如何被证明不太安全? – 2012-02-22 12:48:23

+0

@ N.B。 Alshanetsky描述的安全漏洞是非常深奥的(曾用过GBK字符集?),并且可以通过设置正确的连接编码来解决。我同意'mysql_()'库已经过时,使用PDO是优越的,但是完全可以用它创建安全的查询,所以“使用PDO确定”是不正确的。另外,“使用PDO”已经成为一个真正有害的模因 - 我最近与一些人长时间讨论过任何*查询都被自动保护,因为他使用了PDO,给他留下了一个巨大的注入漏洞。 – 2012-02-22 13:15:55

相关问题