我目前正在加强我网站的安全性,并且我正在努力确保从PHP传递到HTML的每个值都能正确编码。
目前,为模板分配值会对其进行编码,但网站的某些部分是旧的,不使用模板。
我更改了我用来输出HTML以编码所有值的函数的工作方式。这适用于覆盖所有旧页面,但现在它会导致模板值的双重编码。
我改变了我用来做的编码功能:
$textToEncode = htmlspecialchars_decode($szText);
return htmlspecialchars($textToEncode, ENT_COMPAT, 'ISO-8859-1');
这可以从我所看到的情况发挥作用。通过首先对其进行解码,它将始终确保它不会进行双重编码,并且我无法想到解码未编码字符串会导致问题的任何原因。这是一个好的解决方案吗?
答案 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);