php - strip_tags() 是否容易受到脚本攻击?

标签 php html security xss strip-tags

是否存在已知的 XSS 或其他攻击使其无法通过

$content = "some HTML code";
$content = strip_tags($content);

echo $content;

?

manual有一个警告:

This function does not modify any attributes on the tags that you allow using allowable_tags, including the style and onmouseover attributes that a mischievous user may abuse when posting text that will be shown to other users.

但这仅与使用 allowable_tags 参数有关。

没有设置允许的标签strip_tags() 是否容易受到任何攻击?

Chris Shiflett似乎说它是安全的:

Use Mature Solutions

When possible, use mature, existing solutions instead of trying to create your own. Functions like strip_tags() and htmlentities() are good choices.

这是正确的吗?如果可能,请引用来源。

我知道 HTML 净化器、htmlspecialchars() 等。我不是在寻找净化 HTML 的最佳方法。我只是想知道这个具体问题。这是提出的一个理论问题here .

引用:strip_tags() implementation in the PHP source code

最佳答案

顾名思义,strip_tags应删除所有 HTML 标记。我们可以证明它的唯一方法是分析源代码。下一个分析适用于 strip_tags('...')调用,没有白名单标签的第二个参数。

首先,关于 HTML 标签的一些理论:标签以 < 开头后跟非空白字符。如果此字符串以 ? 开头, 它should not be parsed .如果此字符串以 !-- 开头,它被视为注释,并且不应解析以下文本。评论以 --> 结束。 , 在这样的评论中,像 < 这样的字符和 >被允许。属性可以出现在标签中,它们的值可以选择用引号字符( '" )包围。如果存在这样的报价,则必须关闭,否则如果 >遇到,标签没有关闭。

代码 <a href="example>xxx</a><a href="second">text</a>在 Firefox 中被解释为:

<a href="http://example.com%3Exxx%3C/a%3E%3Ca%20href=" second"="">text</a>

PHP 函数 strip_tags line 4036 of ext/standard/string.c 中引用.该函数调用 internal function php_strip_tags_ex .

存在两个缓冲区,一个用于输出,另一个用于“内部 HTML 标记”。一个名为 depth 的计数器保存开尖括号的数量 (<)。
变量 in_q包含引号字符( '" )(如果有)和 0否则。最后一个字符存储在变量 lc 中.

函数有五种状态,其中三种在函数上面的描述中提到。根据这些信息和函数体,可以推导出以下状态:

  • 状态0是输出状态(不在任何标签中)
  • 状态 1 表示我们在一个普通的 html 标签内(标签缓冲区包含 <)
  • 状态 2 表示我们在一个 php 标签内
  • 状态 3:我们来自输出状态,遇到了 <!字符(标签缓冲区包含 <! )
  • 状态 4:在 HTML 注释内

我们只需要注意不能插入任何标签。也就是说,<后跟一个非空白字符。 Line 4326< 检查一个案例字符如下所述:

  • 如果在引号内(例如 <a href="inside quotes"> ),则 <字符被忽略(从输出中删除)。
  • 如果下一个字符是空白字符, <被添加到输出缓冲区
  • 如果在 HTML 标记之外,状态变为 1 ("inside HTML tag") 和最后一个字符 lc设置为 <
  • 否则,如果在 HTML 标签内,计数器名为 depth递增,字符被忽略。

如果 >在标签打开时满足( state == 1 ),in_q变成 0 ("不在报价中") 和 state变成 0 (“不在标签中”)。 标记缓冲区被丢弃。

属性检查(对于 '" 等字符)在被丢弃的标记缓冲区上完成。所以结论是:

strip_tags without a tag whitelist is safe for inclusion outside tags, no tag will be allowed.

“外部标签”是指不在 <a href="in tag">outside tag</a> 中的标签中。 .文本可能包含 <>但是,如 >< a>> .结果不是有效的 HTML,< , >&仍然需要逃脱,尤其是 & .这可以通过 htmlspecialchars() 来完成.

strip_tags 的描述没有白名单参数将是:

Makes sure that no HTML tag exist in the returned string.

关于php - strip_tags() 是否容易受到脚本攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5788527/

相关文章:

php - 连接mssql后utf-8无法插入mysql

php - 如何在 json 中传递变量数组并检索它

php - 在PHP mysql中将状态从未解决标记为已解决

javascript - 动态样式 ListView

使用其他提供商身份验证服务(例如 Soundcloud)时 token 身份验证的安全性?

php - Ratchet socket ws 到 wss

php - SQL内连接性能问题

html - 如何用随机锯齿获得撕纸效果?

windows - Windows 批处理文件末尾的简单插入符 (^) 占用所有内存

Java Applet Com 端口