htmlentities - 如何在PHP中保持表单安全?

时间:2018-04-02 17:44:32

标签: php html-encode html-escape-characters

我有一个小型联系表格,需要主题,姓名,电子邮件和消息。所有这些领域都通过以下方式进行消毒:

function sanitize($string){
    return htmlentities($string, ENT_QUOTES, 'UTF-8');
}

我使用PHP中的mail()函数发送电子邮件,并使用subject字段作为电子邮件标题/主题。问题是在主题中我有一个引用:

I'd like to explore

但是在我清理它之后,我收到了收件箱中的电子邮件,但该单引号已经过清理,看起来像这样:

I'd like to explore

如何保证我的表单安全,但同时如何让我的电子邮件主题与单引号一致,而不是'd

3 个答案:

答案 0 :(得分:1)

使用sanitize功能存储数据,如果要显示数据,则需要将“desanitize”设置为原始格式。

$str = 'I'd like to explore';

echo html_entity_decode($str, ENT_QUOTES, 'UTF-8');

严格来说,存储任何数据都不存在安全风险。但是,如何存储数据的过程可能会导致安全问题。通常使用HTML实体将数据存储在数据库中并在以后使用它。但是存储数据的更好方法是使用预处理语句,这使得完全没必要。

问题实际上是,对于什么存储,您正在清理

答案 1 :(得分:0)

如果要在自己的网站上将用户生成的内容打印为HTML,则使用

htmlentities。用户生成的内容可能包含HTML破坏符号,因此它将字符替换为HTML实体。 (错误的'可能会终止字符串,或者如果巨魔插入</div>,您网站的整个布局都会中断。)

&#039; - 事物是',从任何html呈现引擎的角度来看,都是撇号,并且会这样显示。您可以找到a list of these entities online

该过程的反向是html_entity_decode,以便再次从中获取纯文本。

关于保护表单安全的使用案例:htmlentities不是正确的工具。

如果要使用纯文本发送该电子邮件,请将其保留为纯文本。确实,您不应该信任用户生成的内容和行为,但是您应该防止数据库插入问题(准备好的语句)并防止在表单上重复POST,以免给垃圾邮件发送垃圾邮件。

然而,将用户输入视为原始文本并将该内容作为原始文本发送并不存在固有的危害。 (如果您要发送包含用户生成内容的HTML电子邮件,那么htmlentities也会派上用场。)

答案 2 :(得分:0)

清理在上下文中完成。换句话说,你应该知道自己是什么&#34;消毒&#34;反对:SQL注入,html脚本攻击或什么不是。考虑到这一点,正确的方法是分别处理每个问题:在存储数据库时清理SQL注入,但将数据存储在接近原始数据的位置。尽你所能。这意味着数据库中的数据将被#des; desanitized&#34;。然后,根据您打算对数据执行的操作,您可以相应地处理它:发送电子邮件?只是转储内容。在网页上显示? html_entities它。

请注意&#34;优化问题&#34;在每次输出内容时不必使用消毒剂处理的意义上是不同的。如果需要的话,必须单独处理。

多年来,这已证明对我来说是一种合理的方法。