与 html 编码混淆
Confused with html encoding
我对字符编码感到困惑。
我知道人们做事的方式不同,但很多人建议您应该在输入时将输入存储在数据库中,然后在您阅读时根据您打算如何处理它来处理它。这对我来说很有意义。
因此,如果用户输入撇号、双引号或和号、小于号、大于号,这些将分别在我的数据库中写入为 ' " & < >。
现在,使用 php 读取数据,我正在 运行 通过 HTMLPurify 捕获任何注入问题的文本。
我也应该对它进行 htmlencode 吗?如果我不这样做,一切看起来都正常(在 Chrome 和 Firefox 中),但我不确定这是否正确以及它是否会在其他浏览器中正确显示?
如果我将 htmlentities 与 ENT_QUOTES 和 htmlspecialchars 一起使用,我会开始获取这些字符的代码,我相信如果查看页面源代码我应该看到这些代码,而不是在页面上用户看到了。
问题是,在没有进行编码的情况下,我看到了我想看到的内容,但是我心里有一个小问题,我没有正确地进行编码!
你有这个困惑。字符编码是您系统的一个属性。您的网站和数据库负责字符编码。
你必须决定你会接受什么。总的来说,网络已经朝着 UTF-8 的标准化方向发展。因此,如果您的网站接受用户输入和您的数据库,并且所有涉及的连接都是 UTF-8,那么您可以接受 UTF-8 输入,并且数据库中的字符集和排序规则应该适当配置。
此时您所有的网页都应该是 HTML5,因此推荐您的网页的 HEAD 部分 should at a minimum be this:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
接下来是 SQL 注射。您指定了 PHP。如果您正在使用 mysqli 或 PDO(根据我的经验,这是更好的选择)并且您正在为所有变量使用 bindParameter,那么 SQL 注入没有问题。那个问题消失了,转义输入的需要也消失了,因为您不再需要担心 SQL 语句会被混淆。 不可能了
最后,您提到了html净化器。它的存在是为了让人们可以尝试避免 XSS 和其他这种性质的攻击,当你接受用户输入时就会发生这种情况,而那些人会注入 html & js。
这始终是一个问题,具体取决于系统的性质以及您对该输出的处理方式,但正如其他人在评论中所建议的那样,您可以 运行 在输出之后对输出进行消毒和过滤您已从数据库中检索到它。坐在 php 字符串变量中没有内在的危险,直到你通过将它注入你正在服务的实时 html 页面来武器化它。
就查找不良行为者和试图扰乱您的系统的人而言,存储提交的原始输入显然要好得多。然后,当您开始了解这些漏洞利用的性质时,您可以搜索您的数据库以查找特定的东西,如果您先清理并存储结果,您将无法做到这一点。
我对字符编码感到困惑。
我知道人们做事的方式不同,但很多人建议您应该在输入时将输入存储在数据库中,然后在您阅读时根据您打算如何处理它来处理它。这对我来说很有意义。
因此,如果用户输入撇号、双引号或和号、小于号、大于号,这些将分别在我的数据库中写入为 ' " & < >。
现在,使用 php 读取数据,我正在 运行 通过 HTMLPurify 捕获任何注入问题的文本。
我也应该对它进行 htmlencode 吗?如果我不这样做,一切看起来都正常(在 Chrome 和 Firefox 中),但我不确定这是否正确以及它是否会在其他浏览器中正确显示?
如果我将 htmlentities 与 ENT_QUOTES 和 htmlspecialchars 一起使用,我会开始获取这些字符的代码,我相信如果查看页面源代码我应该看到这些代码,而不是在页面上用户看到了。
问题是,在没有进行编码的情况下,我看到了我想看到的内容,但是我心里有一个小问题,我没有正确地进行编码!
你有这个困惑。字符编码是您系统的一个属性。您的网站和数据库负责字符编码。
你必须决定你会接受什么。总的来说,网络已经朝着 UTF-8 的标准化方向发展。因此,如果您的网站接受用户输入和您的数据库,并且所有涉及的连接都是 UTF-8,那么您可以接受 UTF-8 输入,并且数据库中的字符集和排序规则应该适当配置。
此时您所有的网页都应该是 HTML5,因此推荐您的网页的 HEAD 部分 should at a minimum be this:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
接下来是 SQL 注射。您指定了 PHP。如果您正在使用 mysqli 或 PDO(根据我的经验,这是更好的选择)并且您正在为所有变量使用 bindParameter,那么 SQL 注入没有问题。那个问题消失了,转义输入的需要也消失了,因为您不再需要担心 SQL 语句会被混淆。 不可能了
最后,您提到了html净化器。它的存在是为了让人们可以尝试避免 XSS 和其他这种性质的攻击,当你接受用户输入时就会发生这种情况,而那些人会注入 html & js。
这始终是一个问题,具体取决于系统的性质以及您对该输出的处理方式,但正如其他人在评论中所建议的那样,您可以 运行 在输出之后对输出进行消毒和过滤您已从数据库中检索到它。坐在 php 字符串变量中没有内在的危险,直到你通过将它注入你正在服务的实时 html 页面来武器化它。
就查找不良行为者和试图扰乱您的系统的人而言,存储提交的原始输入显然要好得多。然后,当您开始了解这些漏洞利用的性质时,您可以搜索您的数据库以查找特定的东西,如果您先清理并存储结果,您将无法做到这一点。