改写Zend框架下的Escaper类,对PHP输出编码防XSS攻击

浏览:1932 最后更新:2016-07-02 00:45 分类:类库 关键字: TP Zend 编码 XSS
PHP对于XSS攻击防范的函数非常有限,而且对于不同情况的输出编码函数也没有(TP框架的函数也没有专门的编码函数,只有输入作相关的xss过滤,但要保全其字符却不可以)。查了很多才看到zend framework框架下有个zend/Escaper.php类。

它的作用:将PHP输出到页面的字符串按不同种类进行编码输出,包括:html编码、html属性编码、JS编码、CSS编码。

我试用了了下JS编码,它的严格程度是除了数字字母等字符外,其他字符一律编码成16进制符。比如:

页面JS脚本中:var x={$str};在后台PHP中要输出$str值,而这个值有可能被当作xss攻击:$str = '1;alert(2);'输到JS脚本中就是:var x=1;alert(2);上面脚本执行了xss攻击代码。

要在输出端做xss防御,必须做相应编码。针对上面的脚本有两方案:
(1)变量值两端加引号,且该值做javascript编码:var x=escape( "{$str}" ); 这种方案需要有良好的编程习惯才能做到。

(2)使用专门的编码功能函数,像zend/escaper类库中的escapeJs方法。这个功能仿照了OWASP ESAPI的javascript编码转义实现,非常严格。除了数字字母外,其他字符都使用十六进制"\xHH"的方式进行编码://我将escaper改写成适合tp使用
$str = 'l;alert(2)';
$output = new \Org\Util\Escaper();
$this->assign('var', $output->escapeJs($str));
$this->display();
JS端输出为:var y = l\x3Balert\x282\x29;我把原来zend/Escaper改写成符合TP 3.2风格的类库,将它存放在ThinkPHP/Common/Library/Org/Util/下就可以使用了。
使用示例在上面有写了。

类库中主要的几个方法:
escapeHtml($string) //html编码
escapeHtmlAttr($string) //html属性编码
escapeJs($string) //JS编码
escapeUrl($string) //url编码
escapeCss($string) //css编码
评论( 相关
后面还有条评论,点击查看>>