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

tom*_*umb 3 php sql security sql-injection

编辑如果您打算回答此问题,请至少阅读.不要只是阅读标题,然后谷歌的SQL注入php',并粘贴结果作为答案

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

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

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

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

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

"'".str_replace("'","''",$_POST['var_name'])."'"
Run Code Online (Sandbox Code Playgroud)

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

任何输入都非常赞赏.

Mik*_*osh 8

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

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

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

你会逃避它 username''; drop database foo;

但!如果用户这样做:username\'; drop database foo;

你会遇到麻烦.你将解决这个问题username\''; drop database foo;

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

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