当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《strip_tags()是否容易受到脚本攻击?》经验,为你挑选了3个好方法。

是否有已知的XSS或其他攻击使其超过了

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

echo $content;

该手册有一个警告:

此函数不会修改允许使用allowable_tags的标记上的任何属性,包括恶意用户在发布将向其他用户显示的文本时可能滥用的样式和onmouseover属性.

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

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

Chris Shiflett似乎说这是安全的:

使用成熟解决方案

尽可能使用成熟的现有解决方案,而不是尝试创建自己的解决方案.像strip_tags()和htmlentities()这样的函数是不错的选择.

它是否正确?请尽可能引用来源.

我知道HTML净化器,htmlspecialchars()等.我不是在寻找消毒HTML的最佳方法.我只想知道这个具体问题.这是想出了一个理论性的问题在这里.

参考:strip_tags()PHP源代码中的实现



1> Lekensteyn..:

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

首先,关于HTML标签的一些理论:标签以后<跟非空白字符开头.如果此字符串以a开头?,则不应对其进行解析.如果此字符串以a开头!--,则将其视为注释,并且不应解析以下文本.注释终止于-->,在这样的注释中,允许使用<和之类的字符>.属性可以出现在标签中,它们的值可以选择性地用引号字符('")包围.如果存在这样的引用,则必须将其关闭,否则如果>遇到a,则不关闭该标记.

该代码text在Firefox中解释为:

text

PHP函数strip_tags在ext/standard/string.c的第4036行中引用.该函数调用内部函数php_strip_tags_ex.

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

这些函数有五种状态,在函数上面的描述中提到了三种.基于此信息和函数体,可以导出以下状态:

状态0是输出状态(不在任何标记中)

状态1表示我们在普通的html标记内(标记缓冲区包含<)

状态2表示我们在php标记内

状态3:我们来自输出状态并遇到了<!字符(标签缓冲区包含)

状态4:HTML评论内部

我们需要注意不要插入任何标签.也就是说,<后跟一个非空白字符.第4326行使用<下面描述的字符检查案例:

如果在引号内(例如),<则忽略该字符(从输出中删除).

如果下一个字符是空白字符,<则将添加到输出缓冲区.

如果在HTML标记之外,则状态变为1("HTML标记内部")并且最后一个字符lc设置为<

否则,如果在HTML标记内,则命名计数器depth会递增,并忽略该字符.

如果>在标签打开(state == 1)时满足,则in_q变为0("不在引用中")并state变为0("不在标签中").标签缓冲区被丢弃.

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

不带标签白名单的strip_tags可以安全地包含在标签之外,不允许使用任何标签.

通过"外部标签",我的意思是不在标签中outside tag.文本可能包含<,>但是,如在>< a>>.其结果是无效的HTML虽然<,>并且&仍然需要进行转义,尤其是&.这可以做到htmlspecialchars().

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

确保返回的字符串中不存在HTML标记.


所以... tldr; - 是的,`strip_tags()`是安全的吗?

2> Matthew..:

我无法预测未来的漏洞,特别是因为我还没有看过这个PHP源代码.但是,由于浏览器接受看似无效的标签(例如),过去一直存在漏洞.因此,将来有人可能会利用奇怪的浏览器行为.

除此之外,将输出作为完整的HTML块直接发送到浏览器永远不会是不安全的:

echo '
'.strip_tags($foo).'
'

但是,这不安全:

echo '';

因为可以通过"插入脚本处理程序轻松结束引用.

我认为总是将流浪转换<<(和引号相同)更安全.



3> Ludovico Gro..:

根据此在线工具,此字符串将“完全”转义,但结果是另一个恶意代码!

<script>alert('ciao');</script>

在字符串中,“真实”标签是,因为<script>单独不是标签。

我希望我是错的,或者只是因为PHP的旧版本,但是最好检查您的环境。


PHP 7.1.2中的`var_dump(strip_tags(“ << a> script> alert('ciao'); << / a> / script>”)));`=>`“ alert('ciao');”` 。似乎删除了`<`之后的所有内容,直到遇到`>`。
推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有