4

编辑如果您打算回答这个问题,请至少阅读它。不要简单地阅读标题,然后谷歌'sql injection php',并将结果粘贴为答案

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

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

我被要求审查 PHP 站点的安全性并突出显示任何主要问题。我从以前使用该站点的经验中知道,编码标准确实很糟糕(例如,跨页面重复的大量代码,变化率约为 5%,数百个未使用的变量,$var = "yes" 代替布尔值,编写的 SQL 语句进入每个脚本,默认情况下不安全(某些页面忘记验证用户)等)。审查该网站是一个痛苦的提醒,世界上有一些真正的白痴自称开发人员。

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

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

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

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

非常感谢任何输入。

4

5 回答 5

8

不。老实说,如果你不准备你的陈述,你就是在要求一个受伤的世界。

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

一位用户向您发送:username'; drop database foo;

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

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

你会有麻烦的。您将解决此问题username\''; drop database foo;

这意味着用户放置的报价被转义,并且您的报价结束了字段用户名。然后将执行 drop。这是非常不安全的。

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

于 2012-07-22T01:39:36.307 回答
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 注入。参数化查询被认为是更好的做法,但在变量中转义字符将需要较少的更改。

于 2012-07-22T01:07:12.353 回答
0

回答您的问题:不,仅删除引号不足以防止 SQL 注入。

例如,

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

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

于 2012-07-22T01:27:03.297 回答
0

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

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

但是,如果您使用 MySQL 或 9.1 之前的 PostgreSQL 版本,则字符串文字语法默认不符合 ANSI(如果重新配置,则可以),并且反斜杠字符具有特殊含义。\'这允许像680's answer这样的攻击。

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

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

于 2012-07-23T09:16:51.963 回答
-1

这个数组用于字符串替换怎么样

$search = array(" ' ", ' " ', " ` ", ' & ', ' , ', ' ; ', ' SELECT ', ' WHERE ', ' AND '); 
于 2014-07-29T10:13:52.843 回答