2011-09-03 36 views
1

所以,我开始使用MySQLi扩展,因为我听说它将来会被支持。我读了一下,而不是使用mysql_real_escape_string()出于安全原因,我必须使用prepare(),例如,当我在查询中使用$ _GET或$ _POST时。MySQLi准备是出于安全原因?

这是真的吗?我发现prepare()对于可以更改参数的SQL查询模板非常有用。所以脚本也可以在SQL级别上动态变化。它非常有用。但我无法找到有关其安全措施的真实信息。它真的逃脱了邪恶的东西,并防止注射?或者我必须在编程层面上处理它?

例如此代码是否安全?正如你可以看到它使用$_GET来填充模板,所以如果MySQLi准备工作不正常,那么它会非常危险。

$stmt = $mysqli->prepare('SELECT description,title FROM menu WHERE name = ?'); 

$stmt->bind_param('s', $n); 

$n = $_GET['b']; 

$stmt->bind_result($meta_description,$meta_title); 
$stmt->execute(); 

回答

3

准备参数免疫注射,因为他们可以提供给SQL被解析服务器后,即没有办法,他们可以解释为SQL片段,这是一个SQL注入攻击的基地。

在你的榜样无论是在$_GET['b']变量将被服务器用于与name数据库中的字段进行比较,但有绝对没有办法服务器可能被欺骗,解释该文本为一个布尔方程,最终的声明,然后说删除,...

因此,通过设计它不提供SQL注入攻击面,这就是为什么使用预准备语句远远优于各种转义和输入清理方案。

+2

我想补充一点,使用带占位符的预处理语句的结果通常以更快的代码执行,因为客户端和服务器的工作量较少,因为它们不需要花费时间转义和反转义数据。此外,服务器仅在准备好时才分析SQL语句:在此之后,将其用于多个查询的速度会更快。 – snap

+0

谢谢你的快速回答! :) –