6

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

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

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

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

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

从我所看到的情况来看,这已经奏效了。通过首先对其进行解码,它将始终确保它不会双重编码,而且我想不出解码未编码字符串会导致问题的任何原因。这是一个好的解决方案吗?

4

3 回答 3

12

如果您查看手册,您会发现您要查找的是函数的最后一个参数 - $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);
于 2013-05-20T09:42:51.523 回答
7

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

您需要跟踪对字符串进行编码的地点和时间以及原因,事后您无法可靠地弄清楚。

如果您的一位用户在您假设的论坛中写道:

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

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

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

那篇文章的所有意义都丢失了。

于 2013-05-20T09:40:57.663 回答
2

您的解决方案是在htmlspecialchars中使用double_encode参数

从手册:

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

在 PHP 5.2.3 中添加了 Double_encode

htmlspecialchars ( $stringToEncode, $flags, $charsetEncoding , $double_encode);
于 2013-05-20T09:42:27.443 回答