2017-07-11 61 views
1

我对字符编码感到困惑。与html编码混淆

我知道人们以不同的方式做事,但许多人建议您在输入数据库时​​将输入存储在数据库中,然后在阅读时根据您打算使用的内容进行处理。这对我有意义。

因此,如果用户输入一个单引号,双引号或符号,小于,大于号,这些将在我的数据库写为'“分别& <>。

现在,读数据php,我通过HTMLPurify运行文本,以捕捉任何注入问题。

我还应该htmlencode吗?如果我不这样做,一切似乎都没问题(在Chrome和Firefox中),但我不确定这是否正确并将它在其他浏览器中正确显示?

如果我使用htmlentities与E NT_QUOTES和htmlspecialchars,我开始得到这些字符的代码,我相信这是我应该看到的,如果看看页面源,但不是在用户看到的页面上。

问题是,没有做编码,我看到了我想看到的东西,但是在我的脑海里有这样的小窍门,我没有正确地做它!

+1

这可能会被标记为脱离主题,因为它完全基于意见。您可能想要用代码示例来更改具体的问题。 – Difster

+1

将用户输入存储为“原样”,但在输出之前对其进行消毒(例如,如果要防止XSS)。你不需要HTML编码任何东西。 – Terry

+0

将数据作为实际数据 - 即,如果它是通过HTML,将其忽略。然后其他应用程序可以使用它。 –

回答

1

你有这个困惑。字符编码是您的系统的一个属性。您的网站和数据库负责字符编码。

你必须决定你会接受什么。总的来说,网络已经走向了UTF-8的标准化。因此,如果您的网站接受用户输入和您的数据库,并且所涉及的所有连接都是UTF-8,那么您可以接受为UTF-8的输入,并且应该适当配置数据库中的字符集和排序规则。

此时所有网页应该是HTML5,所以你should at a minimum be this页的推荐HEAD部分:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"/> 

接下来你有SQL注入。你指定了PHP。如果你正在使用mysqli或PDO(在我的经验中,这是更好的选择),并且你正在为所有变量使用bindParameter,所以没有SQL注入的ISSUE。这个问题消失了,并且需要转义输入消失,因为您不再需要担心SQL语句可能会感到困惑。 这是不可能的了。

最后,你提到了htmlpurifier。这样做的目的在于让人们可以尝试避免XSS和其他性质的漏洞,这些漏洞会在您接受用户输入时发生,并且这些人会注入html & js。

根据系统的性质以及您对输出的处理方式,这总是会成为问题,但正如其他人在注释中所建议的那样,您可以在检索完输出后在输出上运行清理程序和筛选器来自数据库。坐在一个PHP字符串变量里面,没有内在的危险,直到你通过将它注入到你正在服务的一个实时HTML页面来实现武器化。

在寻找不良演员和试图混淆你的系统的人方面,你显然更好地存储提交的原始输入。然后,当你了解这些漏洞的性质时,你可以搜索你的数据库寻找特定的东西,如果你先清理并存储结果,你将无法做到这一点。