避免意外的双htmlspecialchars编码?

时间:2013-05-20 09:37:00

标签: php html encoding

我目前正在加强我网站的安全性,并且我正在努力确保从PHP传递到HTML的每个值都能正确编码。

目前,为模板分配值会对其进行编码,但网站的某些部分是旧的,不使用模板。

我更改了我用来输出HTML以编码所有值的函数的工作方式。这适用于覆盖所有旧页面,但现在它会导致模板值的双重编码。

我改变了我用来做的编码功能:

$textToEncode = htmlspecialchars_decode($szText);
return htmlspecialchars($textToEncode, ENT_COMPAT, 'ISO-8859-1');

这可以从我所看到的情况发挥作用。通过首先对其进行解码,它将始终确保它不会进行双重编码,并且我无法想到解码未编码字符串会导致问题的任何原因。这是一个好的解决方案吗?

3 个答案:

答案 0 :(得分:8)

如果你查看手册,你会发现你正在寻找的是该函数的最后一个参数 - $double_encode = false ,默认为 true

string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] 

因此:

htmlspecialchars($textToEncode, ENT_COMPAT, 'ISO-8859-1', false);

答案 1 :(得分:6)

你只是运气不好。您要么知道字符串是否已编码。你无法察觉或猜测。如果我的意思是写“& amp;”怎么办?并且数据库中的字符串包含该值?这是原始的,未编码的字符串。但它看起来编码。

你需要跟踪编码字符串的位置,时间和原因,事后你无法可靠地弄清楚它。

如果您的某位用户在您的假设论坛中写过此内容:

  

“&”的HTML实体是“& amp;”。

然后你的解码和编码,或者@Robert建议的“智能非双重编码”,将把它变成:

  

“&”的HTML实体是“&”。

该帖子的所有含义都将丢失。

答案 2 :(得分:1)

您的解决方案是在 htmlspecialchars

中使用 double_encode 参数

来自手册:

  

当关闭double_encode时,PHP不会编码现有的html实体,默认是转换所有内容。

在PHP 5.2.3中添加了Double_encode

htmlspecialchars ( $stringToEncode, $flags, $charsetEncoding , $double_encode);