Php 在HTML标记';我已经逃过XSS了

Php 在HTML标记';我已经逃过XSS了,php,security,zend-framework,xss,Php,Security,Zend Framework,Xss,我在数据库中存储了html,我需要将其输出到页面 如果我不escape()它,那么我会得到我想要的粗体格式,但我会冒着从未经scape的html源中获取XSS的风险 如果我对其进行escape(),则它将显示原始html代码粗体文本,而不是粗体文本 除了一些标签,我怎么能逃避一切?我正在考虑应用escape(),然后搜索和并取消它们的escape。这样行吗?你看到它有什么安全问题吗?我也不确定如何搜索标记。也许是什么原因 顺便说一下,escape()是Zend中的一个函数。我相信这相当于ht

我在数据库中存储了html,我需要将其输出到页面

  • 如果我不escape()它,那么我会得到我想要的粗体格式,但我会冒着从未经scape的html源中获取XSS的风险
  • 如果我对其进行escape(),则它将显示原始html代码
    粗体文本
    ,而不是粗体文本
除了一些标签,我怎么能逃避一切?我正在考虑应用escape(),然后搜索
并取消它们的escape。这样行吗?你看到它有什么安全问题吗?我也不确定如何搜索
标记。也许是什么原因


顺便说一下,escape()是Zend中的一个函数。我相信这相当于
htmlspecialchars()

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


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

htmlspecialchars\u decode()
htmlspecialchars()相反。可以取消它的scape,但是没有用于限制标记的参数


如果
html
是由用户编写的,这是一个坏主意:)

不逃避是一个好办法。如果您只将要从html转义转换回来的几个标记列为白名单,那么您就不会遇到XSS漏洞攻击

解决方案标记在这方面没有任何优势,许多失败的BBcode解析器证明了这一点


(但是,使用HTMLPurifier可能是明智的,而不是来回转换。)

您可以使用HTMLPurifier库,它将处理转义等所需的一切。下面是一个很好的视频,解释了如何将它安装到zend框架中


第二个参数中的try use是$allowed_tags

useZend_Filter_StripTags类,作为构造函数的参数,使用具有以下键的数组:

  • “allowTags”=>允许的标记
  • “allowAttribs”=>允许的属性

  • 第二部分允许您修剪所有不需要的属性,如“onClick”等,这些属性可能与
    code一样危险,但您可以将“src”留给
    或“href”留给

    创建您自己的视图帮助程序,或者您也可以使用setEscape()在controller See

    中,这就是为什么我不想使用与
    htmlspecialchars()
    完全相反的方法,而是使用一个自定义函数,该函数将只取消显示我想要的标记。