2011-06-01 42 views
2

我将html存储在数据库中,并且需要将其输出到页面。在转义为XSS后未翻转某些HTML标记

  • 如果我不逃(),然后我得到大胆格式我想,但我跑得从转义的HTML源代码得到一个XSS的风险。
  • 如果我转义()它,那么它显示原始html代码<b>bold text</b>而不是加粗文本

我怎样才能逃脱一切,除了一些标签?我正在考虑应用escape(),然后搜索<b></b>并使其无法正常使用。这会起作用吗?你看到的任何安全问题?我也不确定我将如何搜索<b></b>标签。正则表达式可能或什么?

P.S. escape()我的意思是Zend中的一个函数。我相信这相当于htmlspecialchars()

回答

1

转义是要走的路。如果你只有白名单一对标签将被转换回html转义,那么你将不会遇到XSS漏洞。

解决方法标记没有提供任何优势,因为许多失败的BBcode解析器都证明了这一点。

(而不是来回转换的可能不过是明智的利用HTMLPurifier代替。)

1

如果数据库中的HTML标记来自您不信任的用户,您应该允许他们访问markdown或类似的“安全”编辑环境,以便他们可以准备他们想要的标记并且不允许注入HTML 。

尝试执行选择性过滤经常是错误的,并且错过攻击者可以注入恶意代码的方式。所以不要让他们写原始的HTML。

1

htmlspecialchars_decode()htmlspecialchars()相反。有可能会忽略它,但没有限制标签的参数。

如果html是由用户写它是坏主意:)

+0

这就是为什么我想不使用的'用htmlspecialchars完全相反()'和使用一个自定义函数,它只会隐藏我想要的标记。 – sameold 2011-06-01 00:27:12

1

尝试使用strip_tags在第二个参数是$ allowable_tags

1

使用Zend_Filter_StripTags类作为参数的构造函数中使用用下面的键的数组:被允许

  1. 'allowTags'=>标签
  2. “allowAttribs” =>属性被允许

这第二部分可剪裁所有不需要的attribs喜欢的“onClick”等等,其可以像<script>代码为危险的,但你可以离开“src”中的<img>或“HREF”为<a>