资讯专栏INFORMATION COLUMN

PHP如何防止XSS攻击

jone5679 / 3763人阅读

摘要:防止跨站脚本攻击的方法是针对非法的代码包括单双引号等,使用函数。和这两个函数对之类的字符串支持不好都不能转化所以用和转化的字符串只能防止攻击不能防止注入攻击所有有打印的语句如,等在打印前都要使用进行过滤,这样可以防止,注意中文要写出。

PHP防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 。

在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string) 的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号(“), 不对单引号(‘)做转义.

所以,htmlspecialchars函数更多的时候要加上第二个参数, 应该这样用: htmlspecialchars($string,ENT_QUOTES).当然,如果需要不转化如何的引号,用htmlspecialchars($string,ENT_NOQUOTES).

另外, 尽量少用htmlentities, 在全部英文的时候htmlentities和htmlspecialchars没有区别,都可以达到目的.但是,中文情况下, htmlentities却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。

htmlentities和htmlspecialchars这两个函数对 "之类的字符串支持不好,都不能转化, 所以用htmlentities和htmlspecialchars转化的字符串只能防止XSS攻击,不能防止SQL注入攻击.

所有有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss,注意中文要写出htmlentities($name,ENT_NOQUOTES,GB2312) 。

(1).网页不停地刷新 ""

(2).嵌入其它网站的链接 除了通过正常途径输入XSS攻击字符外,还可以绕过JavaScript校验,通过修改请求达到XSS攻击的目的.

 $value) 
     {
        if (!is_array($value))
        {
          if (!get_magic_quotes_gpc())  //不对magic_quotes_gpc转义过的字符使用addslashes(),避免双重转义。
          {
             $value  = addslashes($value); //给单引号(")、双引号(")、反斜线()与 NUL(NULL 字符)
             加上反斜线转义
          }
          $value       = preg_replace($ra,"",$value);     //删除非打印字符,粗暴式过滤xss可疑字符串
          $arr[$key]     = htmlentities(strip_tags($value)); //去除 HTML 和 PHP 标记并转换为 HTML 实体
        }
        else
        {
          SafeFilter($arr[$key]);
        }
     }
   }
}
?>
$str = "www.90boke.com";
SafeFilter ($str); //如果你把这个注释掉,提交之后就会无休止刷新
echo $str;
//------------------------------php防注入和XSS攻击通用过滤-----Start--------------------------------------------//
function string_remove_xss($html) {
    preg_match_all("/<([^<]+)>/is", $html, $ms);
 
    $searchs[] = "<";
    $replaces[] = "<";
    $searchs[] = ">";
    $replaces[] = ">";
 
    if ($ms[1]) {
        $allowtags = "img|a|font|div|table|tbody|caption|tr|td|th|br|p|b|strong|i|u|em|span|ol|ul|li|blockquote";
        $ms[1] = array_unique($ms[1]);
        foreach ($ms[1] as $value) {
            $searchs[] = "<".$value.">";
 
            $value = str_replace("&", "_uch_tmp_str_", $value);
            $value = string_htmlspecialchars($value);
            $value = str_replace("_uch_tmp_str_", "&", $value);
 
            $value = str_replace(array("", "/*"), array(".", "/."), $value);
            $skipkeys = array("onabort","onactivate","onafterprint","onafterupdate","onbeforeactivate","onbeforecopy","onbeforecut","onbeforedeactivate",
                    "onbeforeeditfocus","onbeforepaste","onbeforeprint","onbeforeunload","onbeforeupdate","onblur","onbounce","oncellchange","onchange",
                    "onclick","oncontextmenu","oncontrolselect","oncopy","oncut","ondataavailable","ondatasetchanged","ondatasetcomplete","ondblclick",
                    "ondeactivate","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","onerror","onerrorupdate",
                    "onfilterchange","onfinish","onfocus","onfocusin","onfocusout","onhelp","onkeydown","onkeypress","onkeyup","onlayoutcomplete",
                    "onload","onlosecapture","onmousedown","onmouseenter","onmouseleave","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel",
                    "onmove","onmoveend","onmovestart","onpaste","onpropertychange","onreadystatechange","onreset","onresize","onresizeend","onresizestart",
                    "onrowenter","onrowexit","onrowsdelete","onrowsinserted","onscroll","onselect","onselectionchange","onselectstart","onstart","onstop",
                    "onsubmit","onunload","javascript","script","eval","behaviour","expression","style","class");
            $skipstr = implode("|", $skipkeys);
            $value = preg_replace(array("/($skipstr)/i"), ".", $value);
            if (!preg_match("/^[/|s]?($allowtags)(s+|$)/is", $value)) {
                $value = "";
            }
            $replaces[] = empty($value) ? "" : "<" . str_replace(""", """, $value) . ">";
        }
    }
    $html = str_replace($searchs, $replaces, $html);
 
    return $html;
}
//php防注入和XSS攻击通用过滤 
function string_htmlspecialchars($string, $flags = null) {
    if (is_array($string)) {
        foreach ($string as $key => $val) {
            $string[$key] = string_htmlspecialchars($val, $flags);
        }
    } else {
        if ($flags === null) {
            $string = str_replace(array("&", """, "<", ">"), array("&", """, "<", ">"), $string);
            if (strpos($string, "&#") !== false) {
                $string = preg_replace("/&((#(d{3,5}|x[a-fA-F0-9]{4}));)/", "&1", $string);
            }
        } else {
            if (PHP_VERSION < "5.4.0") {
                $string = htmlspecialchars($string, $flags);
            } else {
                if (!defined("CHARSET") || (strtolower(CHARSET) == "utf-8")) {
                    $charset = "UTF-8";
                } else {
                    $charset = "ISO-8859-1";
                }
                $string = htmlspecialchars($string, $flags, $charset);
            }
        }
    }
 
    return $string;
}
//------------------php防注入和XSS攻击通用过滤-----End--------------------------------------------//

PHP中的设置
PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中

----------------------------------------------------- 
 session.cookie_httponly = 
-----------------------------------------------------

设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启:

Cookie操作函数setcookie函数和setrawcookie函数也专门添加了第7个参数来做为HttpOnly的选项,开启方法为:

老版本的PHP就不说了。没企业用了吧。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28174.html

相关文章

  • php安全问题思考

    摘要:用户提交过来的数据都是不可信的,所以,在查库或入库前需要对提交过来的数据进行过滤或字符的转换处理,以防止注入或攻击等问题。 用户提交过来的数据都是不可信的,所以,在查库或入库前需要对提交过来的数据进行过滤或字符的转换处理,以防止SQL注入或xss攻击等问题。 一、防止SQL注入 什么是SQL注入攻击? 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字...

    alphahans 评论0 收藏0
  • web 应用常见安全漏洞一览

    摘要:应用常见安全漏洞一览注入注入就是通过给应用接口传入一些特殊字符,达到欺骗服务器执行恶意的命令。此外,适当的权限控制不曝露必要的安全信息和日志也有助于预防注入漏洞。 web 应用常见安全漏洞一览 1. SQL 注入 SQL 注入就是通过给 web 应用接口传入一些特殊字符,达到欺骗服务器执行恶意的 SQL 命令。 SQL 注入漏洞属于后端的范畴,但前端也可做体验上的优化。 原因 当使用外...

    darkerXi 评论0 收藏0
  • web 应用常见安全漏洞一览

    摘要:应用常见安全漏洞一览注入注入就是通过给应用接口传入一些特殊字符,达到欺骗服务器执行恶意的命令。此外,适当的权限控制不曝露必要的安全信息和日志也有助于预防注入漏洞。 web 应用常见安全漏洞一览 1. SQL 注入 SQL 注入就是通过给 web 应用接口传入一些特殊字符,达到欺骗服务器执行恶意的 SQL 命令。 SQL 注入漏洞属于后端的范畴,但前端也可做体验上的优化。 原因 当使用外...

    Panda 评论0 收藏0
  • web安全基础

    摘要:安全基础常见的安全攻击手段有很多,比如注入,,,头攻击,攻击,重定向攻击,上传文件攻击等,其中大多数都可以通过三种方法过滤代理转义实体化来解决。个人趋向于安全狗,同时安装服务器安全狗和网站安全狗可以有效地防护攻击。 web安全基础 常见的web安全攻击手段有很多,比如SQL注入,XSS,CSRF,HTTP头攻击,cookie攻击,重定向攻击,上传文件攻击等,其中大多数都可以通过三种方法...

    starsfun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<