当前位置:首页 >> 网络通讯 >> 网络安全 >> 内容

PHP安全 XSS篇

时间:2013/4/19 12:10:00 作者:平凡之路 来源:xuhantao.com 浏览:

本质

 

网络上流行的攻击方式xss. 归根结底就是因为用户提交的数据被你信任的显示出来了. 为什么会信任呢? 可能是由于黑名单方式过滤有漏网之鱼. 可能是忘记转义输出了.这个就是xss攻击的本质了.

  搜狗电脑知识技巧

防范

 

了解了本质, 那防范就容易了. 对于绝大部分输出而言, 都是非富文本的. 一个htmlspecialchars函数就搞定了. 对于富文本,处理就相对复杂一些了,黑名单方式总是会有漏网之鱼,或者过滤掉了用户的正常输入. 而白名单方式, 就可以搞定所有你不喜欢的代码了~

 

观念纠错

 

我发现90%的人不知道什么时候应该进行什么操作. 比如, 我刚刚毕业就进的那家公司. 入库前, 所有数据htmlspecialchars处理. 然后,这就安全了. 事实上确实安全了. 不说多占用了多少空间,就说富文本的处理, 跨应用传递数据. 这个是行不通的.

 

还有的人, 入库前会先过滤危险代码. 这是出于什么考虑呢? 怕xss? 可xss不是发生在入库的时候呀! 如果说用户给你的数据不符合你的要求,为啥要入库. 大可提示用户, 您提交的数据不符合我们的规定格式.

 

例子

 

简单的例子PHP

 

<?php //header utf8

echo $_GET['text']; //XSS!

echo htmlspecialchars($_GET['text']); //非富文本,选择此方式输出

echo WhiteListFiter::filter($_GET['text']); //富文本,选择此方式输出 当然, 这个函数需要你自己去写. 也可以用我写好的.见下边.

白名单过滤函数

 

白名单方式过滤HTMLPHP

 

<?php

/**

 * 白名单方式过滤HTML

 * @author wclssdn@yeah.net

 *

 */

class HtmlFilter{

 

    /**

     * 白名单

     * @var array

     */

    private $whiteList = array();

 

    public function __construct(array $whiteList = array()){

        $this->whiteList = $whiteList;

    }

 

    /**

     * 添加HTML标签白名单

     * @param string $label

     */

    public function addLabel($label, array $rule = array()){

        $this->whiteList[$label] || $this->whiteList[$label] = $rule;

    }

 

    /**

     * 为标签添加过滤规则的可允许值

     * @param string $label 标签

     * @param string $attribute 属性

     * @param array $values 可允许的值

     */

    public function addValues($label, $attribute, array $values){

        if (isset($this->whiteList[$label][$attribute]['grep'])){

            unset($this->whiteList[$label][$attribute]['grep']);

        }

        $this->whiteList[$label][$attribute]['values'] = $values;

    }

 

    /**

     * 为标签添加正则过滤规则

     * @param string $label 标签

     * @param string $grep  过滤规则

     */

    public function addGrep($label, $attribute, $grep){

        if (isset($this->whiteList[$label][$attribute]['values'])){

            unset($this->whiteList[$label][$attribute]['values']);

        }

        $this->whiteList[$label][$attribute]['grep'] = $grep;

    }

 

    /**

     * 获取白名单

     * @return array

     */

    public function getWhiteList(){

        return $this->whiteList;

    }

 

    /**

     * 执行过滤

     * @param string $htmlcode

     * @return string

     */

    function filter($htmlcode){

        if (empty($htmlcode)){

            return '';

        }

        //只保留允许的标签

        $htmlcode = strip_tags($htmlcode, implode('', array_map(create_function('$key', 'return "<{$key}>";'), array_keys($this->whiteList))));

        foreach ($this->whiteList as $whiteLabel => $rule){

            $clean = ''; //某个白名单中的标签过滤后的HTML代码, 非所有标签都过滤后的HTML代码

 $unclean = $htmlcode; //正在过滤的代码, 可能是已经过滤过某些标签后的HTML代码

            $found = false;    //是否找到了标签进行处理

            while (($pos = strpos($unclean, "<{$whiteLabel}")) !== false){    //查找是否存在标签

相关文章
  • 没有相关文章
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1