2



,我的网站正处于原型阶段。在我在这个网站上问了这个问题之后,经过额外的阅读,我决定使用mysql prepared statements.

以我的新思维方式,我想确保我正确理解了这些事情,所以我的两个问题是:

  1. 如果我在将不受信任的数据插入 mysql 期间使用准备好的语句,我不需要使用mysqli_real_escape_string function. 我对吗?

  2. 如果我在从 mysql db 获取数据并将数据显示为 html 时使用准备好的语句,(出于安全原因)使用 html 净化器类会更好,所以我应该使用 html 净化器类。我对吗?

    你能指导我的思维方式吗?我的方法有意义吗?

    谢谢,BR

4

4 回答 4

1

是的,它确实。
mysqli_real_escape_string 函数无论如何都与任何保护无关。
html 净化器是个好东西,但htmlspecialchars()如果用户输入中没有 HTML,你可以用惰性函数调用代替它。

关于准备好的语句,唯一需要提及的是:它们仅涵盖基本的标量值,无法应对复杂的值,例如标识符(表和字段名称)或数组。

于 2013-02-20T09:16:47.153 回答
1

如果我在将不受信任的数据插入 mysql 期间使用准备好的语句,我不需要使用 mysqli_real_escape_string 函数。我对吗?

你明白了。准备好的语句有自己的转义程序。

如果我在从 mysql db 获取数据并将数据显示为 html 时使用准备好的语句,(出于安全原因)使用 html 净化器类会更好,所以我应该使用 html 净化器类。我对吗?

你也是对的。当您打印您的 html 时,您必须确保它是安全的,因此它们是两种解决方案:激进的一种htmlspecialchars:使用htmlpurifier.

我还希望您向您介绍一条规则,该规则将带您进入一个安全且更舒适的网站:filter in escape out。

准备好的声明并htmlpurifier在这里“逃脱”,这意味着您将以您的输出可以理解的方式发送数据。

部分规则中的过滤器使您可以研究用户输入的内容。一个很好的例子是日期格式。也许您希望他们以英文格式 Ymd 输入日期。如果他们不这样做,您的网站将无法运行,因此您必须要求他们以正确的方式再次输入日期。关于过滤,有一种方法要记住:filter_var

于 2013-02-20T09:19:46.573 回答
1

如果我在将不受信任的数据插入 mysql 期间使用准备好的语句,我不需要使用 mysqli_real_escape_string 函数。我对吗?

正确的

如果我在从 mysql db 获取数据并将数据显示为 html 时使用准备好的语句,(出于安全原因)使用 html 净化器类会更好,所以我应该使用 html 净化器类。我对吗?

使用准备好的语句将保护您的数据库免受 SQL 注入。它对 XSS 攻击没有任何作用。你需要某种防御措施。

由于“保护数据库”和“保护 HTML”是完全不同的问题,因此选择一个解决方案与选择另一个解决方案无关。

使用围绕真正的 HTML 解析器构建的基于白名单的过滤器(我假设 HTML 净化器就是其中之一)是一个明智的选择(如果你想允许一些HTML)。

于 2013-02-20T09:20:19.663 回答
1

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.

于 2013-02-20T09:33:02.467 回答