Php mysql准备的语句和html净化器概念

Php mysql准备的语句和html净化器概念,php,mysql,prepared-statement,mysql-real-escape-string,htmlpurifier,Php,Mysql,Prepared Statement,Mysql Real Escape String,Htmlpurifier,我的网站正处于原型阶段。在我在这个网站上提问之后,在额外阅读之后,我决定使用mysql准备的语句。以我新的思维方式,我想确保我正确理解了事情,所以我的两个问题是: 如果在不受信任的数据插入到 mysql,我不需要使用mysqli\u real\u escape\u string函数。我是吗 对吧? 如果在从中提取和显示数据时使用准备好的语句 mysql数据库以html形式显示,出于安全原因,它会更好 为了使用html净化器类,所以我应该使用html净化器类。我说得对吗 你能用我的思维方式指导我吗

我的网站正处于原型阶段。在我在这个网站上提问之后,在额外阅读之后,我决定使用mysql准备的语句。以我新的思维方式,我想确保我正确理解了事情,所以我的两个问题是:

如果在不受信任的数据插入到 mysql,我不需要使用mysqli\u real\u escape\u string函数。我是吗 对吧?

如果在从中提取和显示数据时使用准备好的语句 mysql数据库以html形式显示,出于安全原因,它会更好 为了使用html净化器类,所以我应该使用html净化器类。我说得对吗

你能用我的思维方式指导我吗?我的方法有意义吗?谢谢,比尔

是的。 mysqli_real_escape_string函数与任何保护无关。 html净化器是一个好东西,但如果用户输入中没有预期的html,您可以用懒惰的htmlspecialchars函数调用替代它

关于准备好的语句,唯一需要提及的是:它们只包含基本的标量值,而对于标识符表、字段名或数组等复杂值无能为力。

是的,它包含。 mysqli_real_escape_string函数与任何保护无关。 html净化器是一个好东西,但如果用户输入中没有预期的html,您可以用懒惰的htmlspecialchars函数调用替代它

关于准备好的语句,唯一要提到的是:它们只包含基本的标量值,而对于标识符、表名、字段名或数组等复杂值无能为力

如果我在将不可信数据插入mysql时使用准备好的语句,我就不需要使用mysqli\u real\u escape\u string函数。我说得对吗

你说得对。准备好的语句有自己的转义程序

如果我在从mysql数据库获取数据并将其显示为html时使用准备好的语句,出于安全原因,最好使用html净化器类,所以我应该使用html净化器类。我说得对吗

你也是对的。当你打印你的html时,你必须确保它是安全的,所以它们是两种解决方案:激进的一种:用htmlspecialchars转义所有内容;或者更软的一种,允许安全的html标记:使用htmlpurifier

我还希望你们向你们介绍一条规则,这条规则将把你们带到一个更安全、更舒适的网站:过滤入退出

prepared语句和htmlpurifier在此转义,这意味着您将以输出可以理解的方式发送数据

rull中的过滤器使您研究用户输入的内容。日期格式就是一个很好的例子。 也许您希望他们输入一个英文格式为Y-m-d的日期。如果他们不这样做,你的网站将无法工作,因此你必须要求他们以正确的方式再次输入日期。 关于过滤,有一种方法需要记住:filter_var

如果我在将不可信数据插入mysql时使用准备好的语句,我就不需要使用mysqli\u real\u escape\u string函数。我说得对吗

你说得对。准备好的语句有自己的转义程序

如果我在从mysql数据库获取数据并将其显示为html时使用准备好的语句,出于安全原因,最好使用html净化器类,所以我应该使用html净化器类。我说得对吗

你也是对的。当你打印你的html时,你必须确保它是安全的,所以它们是两种解决方案:激进的一种:用htmlspecialchars转义所有内容;或者更软的一种,允许安全的html标记:使用htmlpurifier

我还希望你们向你们介绍一条规则,这条规则将把你们带到一个更安全、更舒适的网站:过滤入退出

prepared语句和htmlpurifier在此转义,这意味着您将以输出可以理解的方式发送数据

rull中的过滤器使您研究用户输入的内容。日期格式就是一个很好的例子。 也许您希望他们输入一个英文格式为Y-m-d的日期。如果他们不这样做,你的网站将无法工作,因此你必须要求他们以正确的方式再次输入日期。 关于过滤,有一种方法需要记住:filter_var

如果我在将不可信数据插入mysql时使用准备好的语句,我就不需要使用mysqli\u real\u escape\u string函数。我说得对吗

正确的

如果我在从mysql数据库获取数据并将其显示为html时使用准备好的语句,出于安全原因,最好使用html净化器类,所以我应该使用html净化器类。我说得对吗

使用预先准备好的语句将保护数据库不受SQL注入的影响。它对XSS攻击没有任何作用。你需要一些防御措施

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

使用白色 基于列表的过滤器是围绕一个真正的HTML解析器构建的,我认为HTML净化器就是其中之一,如果您想允许一些HTML,那么它是一个明智的选择

如果我在将不可信数据插入mysql时使用准备好的语句,我就不需要使用mysqli\u real\u escape\u string函数。我说得对吗

正确的

如果我在从mysql数据库获取数据并将其显示为html时使用准备好的语句,出于安全原因,最好使用html净化器类,所以我应该使用html净化器类。我说得对吗

使用预先准备好的语句将保护数据库不受SQL注入的影响。它对XSS攻击没有任何作用。你需要一些防御措施

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


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

1如果您使用准备好的语句插入数据,则不需要在其中转义引号和其他特殊字符。基本上,可以防止SQL注入。但是,您仍然需要清理数据,使其不包含XSS攻击。您正处于正确的轨道上,因为您正在研究HTML净化器。此外,您需要编写业务逻辑代码来验证数据,以确保它确实是您所期望的类型检查、范围检查等

2理论上,在向用户显示数据之前,您应该对数据进行清理,HTML净化器可以完成此任务。然而,在实践中,您会注意到HTML净化器是一个相当沉重的库,因此不适合在每次显示数据时使用。一个性能更好的解决方案是在数据插入数据库之前对其运行HTML净化器,然后在没有额外验证的情况下显示数据。您实际上是在尝试确保您的数据库是干净的,因为如果数据库是干净的,那么来自那里的任何东西都肯定是干净的。总的来说,这也是一种很好的安全方法

您的验证程序应该类似于:

if( ! isValid( $rawData ) ) {
    return;
}
$purifiedData = htmlPurifier( $rawData );
mysql_prepared_insert( $purifiedData );

当然,这只是一种方法。有许多方法可以实现良好的安全性和数据清理。另外,理解为什么要使用HTML净化器也很重要。当您希望允许用户发布一些HTML标记(但不是全部)时,应该使用它。如果您想阻止所有HTML,那么htmlspecialchars函数将以一种更有效的方式完成这项任务。HTML净化器是好的,当你有一个白名单的标签,你想允许和阻止一切其他。您还可以使用它去除所有标记,而不是转义它们,因此使文本看起来比经过htmlspecialchars后稍微好一些。

1如果使用准备好的语句插入数据,则不需要转义其中的引号和其他特殊字符。基本上,可以防止SQL注入。但是,您仍然需要清理数据,使其不包含XSS攻击。您正处于正确的轨道上,因为您正在研究HTML净化器。此外,您需要编写业务逻辑代码来验证数据,以确保它确实是您所期望的类型检查、范围检查等

2理论上,在向用户显示数据之前,您应该对数据进行清理,HTML净化器可以完成此任务。然而,在实践中,您会注意到HTML净化器是一个相当沉重的库,因此不适合在每次显示数据时使用。一个性能更好的解决方案是在数据插入数据库之前对其运行HTML净化器,然后在没有额外验证的情况下显示数据。您实际上是在尝试确保您的数据库是干净的,因为如果数据库是干净的,那么来自那里的任何东西都肯定是干净的。总的来说,这也是一种很好的安全方法

您的验证程序应该类似于:

if( ! isValid( $rawData ) ) {
    return;
}
$purifiedData = htmlPurifier( $rawData );
mysql_prepared_insert( $purifiedData );

当然,这只是一种方法。有许多方法可以实现良好的安全性和数据清理。另外,理解为什么要使用HTML净化器也很重要。当您希望允许用户发布一些HTML标记(但不是全部)时,应该使用它。如果您想阻止所有HTML,那么htmlspecialchars函数将以一种更有效的方式完成这项任务。HTML净化器是好的,当你有一个白名单的标签,你想允许和阻止一切其他。您还可以使用它去除所有标记,而不是转义它们,因此使文本看起来比通过htmlspecialchars后稍微好一些。

现在我必须查找html净化器。对于你的问题1是的,如果你使用bind,你就不需要在SQL注入时逃避它们。这就引出了你的2个问题。您仍然应该对用户输入进行加密。这可以通过html净化器类来完成
编辑javascript/Referer等html代码。但是在检索时,这应该已经在插入/更新时被桑提茨化了,那么在检索时你就不需要再次桑提茨了。我不是说这是个坏主意。我知道你在我的第二个问题中明确指出的困境。所以我需要咨询这个网站的专家。谢谢。嗯,这是一种常见的方式,允许bbcodes并杀死除纯文本以外的所有东西。如果数据库中的所有内容都是由您控制的函数编写的,请在插入之前剥离/净化它们。如果你不能确定数据库里面是什么,或者通常不讨厌双重纯化+代码的想法,也可以在检索时进行。对于你的问题1是的,如果你使用bind,你就不需要在SQL注入时逃避它们。这就引出了你的2个问题。您仍然应该对用户输入进行加密。这可以通过html净化器类剥离不需要的html代码(如javascript/Referer)来完成。但是在检索时,这应该已经在插入/更新时被桑提茨化了,那么在检索时你就不需要再次桑提茨了。我不是说这是个坏主意。我知道你在我的第二个问题中明确指出的困境。所以我需要咨询这个网站的专家。谢谢。嗯,这是一种常见的方式,允许bbcodes并杀死除纯文本以外的所有东西。如果数据库中的所有内容都是由您控制的函数编写的,请在插入之前剥离/净化它们。如果您不能确定数据库中的内容,或者通常不喜欢双重纯化+代码的想法,也可以在检索时执行此操作。>mysqli\u real\u escape\u string函数与任何保护无关。什么如果您不使用prepared语句,它将保护您的查询。>mysqli\u real\u escape\u string函数与任何保护都无关。什么如果您不使用预先准备好的语句,它会保护您的查询。