只有 运行 HTML (PHP)
Only run HTML (PHP)
我是带着项目问题来的;我尽量解释清楚:
我有一个文本区域,用户可以在其中写任何他们想写的东西。
问题是他们可以尝试某种恶意代码(例如 js xss)
我正在使用函数:
echo htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8');
我以为我已经解决了这个问题,但我记得用户可以输入 HTML,这是允许的。
是否已经为 运行 HTML 和其他保留为文本的功能?
根据 PHP manual,htmlspecialchars
执行以下翻译:
'&'
(ampersand) becomes '&'
'"'
(double quote) becomes '"'
when ENT_NOQUOTES is not set.
"'"
(single quote) becomes '''
(or '
) only when ENT_QUOTES is set.
'<'
(less than) becomes '<'
'>'
(greater than) becomes '>'
您的 HTML 实际上会被翻译成安全字符。
再次阅读您的问题后(因为它不是很清楚),我想也许您希望 HTML 标签实际上保留为 HTML 标签,这意味着 <b>bold</b>
不会得到翻译成<b>bold</b>
为此,您可能需要在 htmlspecialchars
:
之后使用 str_replace
$result = htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8');
$result = str_replace(array("<",">"), array("<",">"), $result);
echo $result;
或者您可以通过 str_replace
:
翻译 &
、'
(单引号)和 "
(双引号)
echo str_replace(array("&", "\"", "'"), array("&", """, "'"), $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
我是带着项目问题来的;我尽量解释清楚:
我有一个文本区域,用户可以在其中写任何他们想写的东西。 问题是他们可以尝试某种恶意代码(例如 js xss) 我正在使用函数:
echo htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8');
我以为我已经解决了这个问题,但我记得用户可以输入 HTML,这是允许的。
是否已经为 运行 HTML 和其他保留为文本的功能?
根据 PHP manual,htmlspecialchars
执行以下翻译:
'&'
(ampersand) becomes'&'
'"'
(double quote) becomes'"'
when ENT_NOQUOTES is not set.
"'"
(single quote) becomes'''
(or'
) only when ENT_QUOTES is set.
'<'
(less than) becomes'<'
'>'
(greater than) becomes'>'
您的 HTML 实际上会被翻译成安全字符。
再次阅读您的问题后(因为它不是很清楚),我想也许您希望 HTML 标签实际上保留为 HTML 标签,这意味着 <b>bold</b>
不会得到翻译成<b>bold</b>
为此,您可能需要在 htmlspecialchars
:
str_replace
$result = htmlspecialchars($topic->getMessage(), ENT_QUOTES, 'UTF-8');
$result = str_replace(array("<",">"), array("<",">"), $result);
echo $result;
或者您可以通过 str_replace
:
&
、'
(单引号)和 "
(双引号)
echo str_replace(array("&", "\"", "'"), array("&", """, "'"), $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