2015-06-28 41 views
5

更新:已经有过一些这方面的启发反应,要点是mysql功能已被弃用,并且也是mysqli允许你使用准备好的语句。这很有道理,而且很有帮助,而在我看来,“使用mysqli”既不富有建设性,也没有帮助。注入攻击与的mysql_query成功,但失败mysqli_query

任何时候在SO上都会询问PHP和MySQL问题,并且OP的代码使用mysql_query,本能的社区反应是要评论他们应该使用mysqli函数族。

能否请您提供这样一个场景,如果我的代码是用mysql_query恶意用户可能发动成功注入攻击,但它是,如果同样的攻击尝试的挫败,但代码中使用的mysqli的功能呢?假设一个语句中的多个查询被禁用,就像典型的情况一样。

+5

这实际上是误导性的建议。 'mysqli'本身并不安全。这一切都取决于使用预准备语句→这与mysqli相当麻烦( - 但更容易与PDO一起使用)。 – mario

+1

还记得'mysql_query'已被弃用。确保人们不使用不赞成的代码编写总是很合理的建议。 – christopher

+0

这几乎似乎属于Meta,就像你开始解决你的问题一样。 –

回答

6

我已经导致相信:

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' "); 

可以用数值容易被破解的$idValue其关闭',然后添加额外的命令,如

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL"; 

虽然我知道你声明多个语句被禁用,但不那么可怕的是返回未经授权的数据,而不是直接在表中编辑数据,例如:

$idValue = "z' OR name IS NOT NULL OR name = 'x"; 

而与库MySQLi存在可能性,该方法可以prepared statements使用,这将阻止其地位只是一个变量的外部变量的演技。如:

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1"); 
mysqli->bind_param("s",$idValue); 
mysqli->execute(); 

我的bind_param理解是,变量将拥有所有的MySQL的关键字和关键转义字符从而防止安全漏洞和未授权的行返回。

这是MySQL 没有的选项。编写的声明有助于改进注入安全性,但他们不会阻止单独注射攻击,但更多应该被用作为程序员更广泛的战略的一部分。

就像身穿防弹衣不会让你立于不败之地,但会大大提高你的生存机会。 MySQLi不是一个神奇的子弹,PDO也不是,但它们将提高整体的安全级别。

MySQL也被弃用,正如Christopher所述,不再维护意味着随着其他技术的不断发展,漏洞的数量和问题只会增加。

摘要

如果你写的MySQL 我为你写的MySQL语句相同的方式语句,那么你将有来自打针没有额外的保护。但是,MySQLi提供了准备好的语句,它可以显着提高SQL注入的防御能力,但底层数据库接口本身的更改本身不会给你带来任何固有的好处或保护,除非你选择使用预准备语句

3

我想,没有这种情况。更重要的是MySQLi支持准备语句,这是防止SQL注入最可靠的方法。如果您使用旧的MySQL API,则不支持这些高级功能。 MySQL和MySQLi都具有mysql * _real_escape_string函数,它可以在不使用引号的情况下进行攻击,如1 OR 1

+1

我认为准备语句的可用性是希望从MySQL迁移到MySQLi的主要原则,准备语句的方式减少了注入机会。 – Martin