只有 运行 HTML (PHP)

Only run HTML (PHP)

我是带着项目问题来的;我尽量解释清楚:

我有一个文本区域,用户可以在其中写任何他们想写的东西。 问题是他们可以尝试某种恶意代码(例如 js xss) 我正在使用函数:

echo htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8');

我以为我已经解决了这个问题,但我记得用户可以输入 HTML,这是允许的。

是否已经为 运行 HTML 和其他保留为文本的功能?

根据 PHP manualhtmlspecialchars 执行以下翻译:

'&' (ampersand) becomes '&'

'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.

"'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set.

'<' (less than) becomes '&lt;'

'>' (greater than) becomes '&gt;'

您的 HTML 实际上会被翻译成安全字符。

再次阅读您的问题后(​​因为它不是很清楚),我想也许您希望 HTML 标签实际上保留为 HTML 标签,这意味着 <b>bold</b> 不会得到翻译成&lt;b&gt;bold&lt;/b&gt;

为此,您可能需要在 htmlspecialchars:

之后使用 str_replace
$result = htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8');
$result = str_replace(array("&lt;","&gt;"), array("<",">"), $result);
echo $result;

或者您可以通过 str_replace:

翻译 &'(单引号)和 "(双引号)
echo str_replace(array("&", "\"", "'"), array("&amp;", "&quot;", "&#039;"), $topic->getMessage());

无限可能。

htmlspecialchars 可以,但不能完全安全地插入 mysql。

对于 mysql 最好使用准备好的语句,如下所述: http://bobby-tables.com/php.html

对于页面中的输出(不插入数据库),htmlspecialchars 就足够了...前提是您在打印前不对其进行解码。

正如 CBroe 所建议的,您可以使用 http://htmlpurifier.org/ 来清理 html 并避免数据库中出现垃圾,但您仍然必须使用准备好的语句。

另请阅读:http://php.net/manual/en/pdo.prepared-statements.php