这种str_replace的使用是否足以防止SQL注入攻击?

时间:2012-07-22 01:02:54

标签: php sql security sql-injection

修改如果您打算回答此问题,请至少阅读一下。不要只是阅读标题,然后谷歌的SQL注入php',并将结果粘贴为答案

首先,我很清楚有很多资源可用于如何最好地防止SQL注入,但我的问题是关于是否只需要很少的努力即可。

我签约的组织最近被告知,他们之前的承包商开发的合作伙伴(PHP)网站被发现存在重大安全问题(我个人最喜欢的是在URL中使用字符串'Emergency',您可以获得未经身份验证的访问网站中的任何页面...)

我被要求检查PHP站点的安全性并突出显示任何主要问题。我从之前的网站经验中了解到,编码标准确实非常糟糕(例如,大约5%变化的页面中有大量代码重复,数百个未使用的变量,$ var =“是”代替布尔值,编写的SQL语句在每个脚本中,默认情况下不安全(某些页面忘记验证用户),等等。回顾这个网站是一个痛苦的提醒,世界上有一些真正的白痴称自己为开发者。

由于这些代码质量问题,我只想强调严重和半严重的安全问题。如果我注意到该网站的每个问题,我的审核都需要数周时间。

我不是SQL注入专家,但我理解你必须能够在注入任何其他类型的语句之前关闭现有查询的引用字符串。以下代码行是否足够?

"'".str_replace("'","''",$_POST['var_name'])."'"

我对改进或更改代码的建议不感兴趣,只是在这种情况下是否可以通过$ _POST ['var_name']进行SQL注入。如果您不熟悉PHP str_replace 将第一个参数的所有实例替换为第二个,而不仅仅是第一个实例。

任何输入都非常赞赏。

5 个答案:

答案 0 :(得分:8)

没有。老实说,如果你没有准备好你的陈述,那么你就是在想要一个受伤的世界。

仅仅因为你用引号来逃避引号,你就不会保护自己。想一想:

用户发送给您:username'; drop database foo;

您将以username''; drop database foo;

转义它

但是!如果用户执行:username\'; drop database foo;

你会遇到麻烦。您将为username\''; drop database foo;

解决此问题

表示用户放置的报价已转义,您的报价结束了字段用户名。然后执行掉落。这非常不安全。

您需要确保准备语句或应用quote命令,例如PDO::quotemysqli_real_escape_string作为这些转义特殊字符。

答案 1 :(得分:1)

您有两个选项 - 转义unsafe_variable中的特殊字符,或使用参数化查询。

$safe_variable = mysql_real_escape_string($_POST["user-input"]);


$mysqli = new mysqli("server", "username", "password", "database_name");    
$unsafe_variable = $_POST["user-input"];
$stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)");

两者都可以保护您免受SQL注入。参数化查询被认为是更好的实践,但是在变量中转义字符将需要更少的更改。

答案 2 :(得分:0)

回答你的问题:不,只是删除引号不足以阻止SQL注入。

例如,

"SELECT * FROM user_table WHERE userid=$userid AND password=$password"

如果$password包含“垃圾OR 1”或类似的东西,可能会出错。因此,如果他们的查询格式错误,删除引号将无济于事。

答案 3 :(得分:0)

这取决于您的数据库服务器及其配置。

'加倍到''是转义字符串文字内容的ANSI标准方式,而应该就足够了。

但是,如果您在9.1之前使用MySQL或PostgreSQL版本,则字符串文字语法默认情况下不符合ANSI(如果重新配置,则可以是ANSI符合),反斜杠字符具有特殊含义。这允许像680的答案中的\'之类的攻击。<​​/ p>

此外,如果您将字节字符串传递给数据访问函数,并且您的数据库恰好使用东亚字符编码,那么str_replace会在'上替换{ {1}}可能是多字节序列的一部分,最后是高字节后跟'':第一个引号作为多字节序列的一部分被吃掉,然后第二个引号关闭字符串。 (这不会发生在UTF-8中,它旨在避免尾随低字节。)

对您正在使用的数据库使用适当的转义调用(例如mysql_real_escape_string),或者更好,使用参数化查询,意味着您不必了解这些模糊和烦人的边缘情况。

答案 4 :(得分:0)

这个数组用于字符串替换

$search = array(" ' ", ' " ', " ` ", ' & ', ' , ', ' ; ', ' SELECT ', ' WHERE ', ' AND '); 
相关问题