1)如果您使用准备好的语句插入数据,则不需要在其中转义引号和其他特殊字符。基本上,您可以防止 SQL 注入。但是,您仍然需要清理数据,使其不包含 XSS 攻击。当您正在研究 HTML Purifier 时,您走在正确的轨道上。此外,您需要编写业务逻辑代码来验证您的数据,以确保它确实是您所期望的(类型检查、范围检查等)。
2)理论上,您应该在向用户显示之前对数据进行清理,HTML 净化器可以执行此任务。然而,在实践中,您会注意到 HTML 净化器是一个非常重的库,因此不适合在每次显示数据时使用。一个性能更好的解决方案是在数据插入数据库之前对数据运行 HTML 净化器,然后在不进行额外验证的情况下显示它。您实际上是在尝试确保您的数据库是干净的,因为如果数据库是干净的,那么来自那里的任何东西也肯定是干净的。一般来说,这也是一种很好的安全方法。
您的验证程序应类似于:
if( ! isValid( $rawData ) ) {
return;
}
$purifiedData = htmlPurifier( $rawData );
mysql_prepared_insert( $purifiedData );
当然,这只是一种方法。有许多方法可以实现良好的安全性和清理数据。此外,了解为什么要使用 HTML Purifier 也很重要。当您希望允许您的用户发布一些HTML 标签(但不是全部)时,您应该使用它。如果您想阻止所有HTML,那么该htmlspecialchars
函数将以更有效的方式完成任务。当您拥有要允许并阻止其他所有标签的白名单时,HTML 净化器非常有用。您还可以使用它来剥离所有标签而不是转义它们,从而使文本看起来比经过htmlspecialchars
.