我已经导致相信:
$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注入的防御能力,但底层数据库接口本身的更改本身不会给你带来任何固有的好处或保护,除非你选择使用预准备语句。
这实际上是误导性的建议。 'mysqli'本身并不安全。这一切都取决于使用预准备语句→这与mysqli相当麻烦( - 但更容易与PDO一起使用)。 – mario
还记得'mysql_query'已被弃用。确保人们不使用不赞成的代码编写总是很合理的建议。 – christopher
这几乎似乎属于Meta,就像你开始解决你的问题一样。 –