最安全的现代数据库插入过滤器?

时间:2016-06-07 08:14:58

标签: php mysql database security sql-injection

暂时忽略预准备语句和实际插入数据库的其他方式,在插入输入之前清理输入的最佳方法是什么?

function filter($s) { return htmlentities(addslashes($s)); }

function filter($t) { return mysqli_real_escape_string($t); }

1 个答案:

答案 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的工具几乎没有重叠。让他们自担风险。