所以,我开始使用MySQLi扩展,因为我听说它将来会得到支持。我读到了这一点,而不是使用mysql_real_escape_string()
出于安全原因我必须使用prepare()
,例如当我在查询中使用$ _GET或$ _POST时。
这是真的吗?我看到prepare()对于创建可以更改参数的SQL查询模板很有用。因此脚本也可以在SQL级别上动态。它真的很有用。但我无法找到有关其安全措施的真实信息。它真的逃脱了邪恶的东西,并保护注射?或者我必须在编程级别处理它?</ p>
例如这段代码是安全的吗?正如您所看到的那样,使用$_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();
答案 0 :(得分:3)
准备好的参数不受注入影响,因为在解析SQL之后它们会被提供给服务器,即它们无法被解释为SQL片段,这是SQL注入攻击的基础。
在您的示例中,服务器将使用$_GET['b']
变量中的任何内容与name
数据库字段进行比较,但绝对没有方法服务器可能是欺骗将该文本解释为布尔方程,语句结束后跟一个删除,...
因此,通过设计,它不会为攻击表面提供SQL注入,这就是为什么使用预处理语句比所有类型的转义和输入清理方案都要优越。