暂时忽略预准备语句和实际插入数据库的其他方式,在插入输入之前清理输入的最佳方法是什么?
function filter($s) {
return htmlentities(addslashes($s));
}
或
function filter($t) {
return mysqli_real_escape_string($t);
}
答案 0 :(得分:2)
暂时忽略预准备语句和实际插入数据库的其他方式,
好的,让我们把实际实现安全性的最佳做法放在一边......
在插入输入之前清理输入的最佳方法是什么?
这是一个奇怪的问题!如果你有mysqli,你可以使用准备好的语句,所以我不明白为什么有人不使用它们?
当然,有一小组用例需要接受用户数据并将其与SQL查询相结合。 LIMIT $foo
是一个典型的例子(最简单的解决方案:使用PHP 7,只接受int
到该参数。)
另一个例子是SELECT * FROM table WHERE id IN (2, 3, 4, 5)
。再一次,将用户输入转换为整数会删除此处的大部分攻击面。
整数很简单。串怎么样?
好吧,read this at least once。你应该非常熟悉charset攻击并确保你安全地使用安全的字符集。
只要您遵循规定的建议,是的,您可以安全地使用mysqli_real_escape_string()
或PDO::quote()
。
但严重的是,请使用准备好的陈述。如果separate data from code,则不太可能犯错误。
function filter($s) { return htmlentities(addslashes($s)); }
这不仅是防止SQLi的坏主意,而是bad idea to attempt to strip XSS on insert。
最后,SQLi和XSS解决了问题,preventing SQLi的工具和策略以及preventing XSS的工具几乎没有重叠。让他们自担风险。