PHP如何防止XSS攻击

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).网页不停地刷新 ‘<meta http-equiv="refresh" content="0;">‘

(2).嵌入其它网站的链接 <iframe src=http://xxxx width=250 height=250></iframe>  除了通过正常途径输入XSS攻击字符外,还可以绕过JavaScript校验,通过修改请求达到XSS攻击的目的.

<?php
//php防注入和XSS攻击通用过滤
$_GET     && SafeFilter($_GET);
$_POST    && SafeFilter($_POST);
$_COOKIE  && SafeFilter($_COOKIE);

function SafeFilter (&$arr)
{
   $ra=Array(‘/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/‘,‘/script/‘,‘/javascript/‘,‘/vbscript/‘,‘/expression/‘,‘/applet/‘
   ,‘/meta/‘,‘/xml/‘,‘/blink/‘,‘/link/‘,‘/style/‘,‘/embed/‘,‘/object/‘,‘/frame/‘,‘/layer/‘,‘/title/‘,‘/bgsound/‘
   ,‘/base/‘,‘/onload/‘,‘/onunload/‘,‘/onchange/‘,‘/onsubmit/‘,‘/onreset/‘,‘/onselect/‘,‘/onblur/‘,‘/onfocus/‘,
   ‘/onabort/‘,‘/onkeydown/‘,‘/onkeypress/‘,‘/onkeyup/‘,‘/onclick/‘,‘/ondblclick/‘,‘/onmousedown/‘,‘/onmousemove/‘
   ,‘/onmouseout/‘,‘/onmouseover/‘,‘/onmouseup/‘,‘/onunload/‘);

   if (is_array($arr))
   {
     foreach ($arr as $key => $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<meta http-equiv="refresh" content="0;">‘;
SafeFilter ($str); //如果你把这个注释掉,提交之后就会无休止刷新
echo $str;
//------------------------------php防注入和XSS攻击通用过滤-----Start--------------------------------------------//
function string_remove_xss($html) {
    preg_match_all("/\<([^\<]+)\>/is", $html, $ms);

    $searchs[] = ‘<‘;
    $replaces[] = ‘&lt;‘;
    $searchs[] = ‘>‘;
    $replaces[] = ‘&gt;‘;

    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[] = "&lt;".$value."&gt;";

            $value = str_replace(‘&amp;‘, ‘_uch_tmp_str_‘, $value);
            $value = string_htmlspecialchars($value);
            $value = str_replace(‘_uch_tmp_str_‘, ‘&amp;‘, $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(‘&quot;‘, ‘"‘, $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(‘&amp;‘, ‘&quot;‘, ‘&lt;‘, ‘&gt;‘), $string);
            if (strpos($string, ‘&amp;#‘) !== false) {
                $string = preg_replace(‘/&amp;((#(\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属性,当然也支持在代码中来开启:

<?php ini_set("session.cookie_httponly", 1);
// or session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
?>

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

<?php
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
setrawcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
?>

原文地址:https://www.cnblogs.com/mzhaox/p/11220684.html

时间: 2024-10-07 21:50:41

PHP如何防止XSS攻击的相关文章

PHP防御XSS攻击的终极解决方案

最近测试XSS攻击修复时,找到的一个比较不错的文章,分享给大家. Update20151202: 感谢大家的关注和回答,目前我从各种方式了解到的防御方法,整理如下: PHP直接输出html的,可以采用以下的方法进行过滤: 1 1.htmlspecialchars函数 2   3 2.htmlentities函数 4   5 3.HTMLPurifier.auto.php插件 6   7 4.RemoveXss函数(百度可以查到) PHP输出到JS代码中,或者开发Json API的,则需要前端在J

SQL 注入、XSS 攻击、CSRF 攻击

SQL 注入.XSS 攻击.CSRF 攻击 SQL 注入 什么是 SQL 注入 SQL 注入,顾名思义就是通过注入 SQL 命令来进行攻击,更确切地说攻击者把 SQL 命令插入到 web 表单或请求参数的查询字符串里面提交给服务器,从而让服务器执行编写的恶意的 SQL 命令. 对于 web 开发者来说,SQL 注入已然是非常熟悉的,而且 SQL 注入已经生存了 10 多年,目前已经有很成熟的防范方法,所以目前的 web 应用都很少会存在漏洞允许进行 SQL 注入攻击. 除非是入门开发人员,在开发

超强XSS攻击利器

======================================================================= BackTrack 5 R1 XSS研究之XSSer(超强XSS攻击利器)使用说明中文版 XSSer使用说明 ================================================================ 简介: ======================================================

Jsoup代码解读之六-防御XSS攻击

Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入中嵌入一段恶意脚本,对输出时的DOM结构进行修改,从而达到执行这段脚本的目的.对于纯文本输入,过滤/转义HTML特殊字符<,>,",'是行之有效的办法,但是如果本身用户输入的就是一段HTML文本(例如博客文章),这种方式就不太有效了.这个时候,就是Jsoup大显身手的时候了. 在前面,我

xss攻击

这一篇,对xss攻击进行模拟, 服务4(被攻击对象,这里将其部署在http://127.0.0.1:8004) var http = require('http'); var url = require('url'); http.createServer(function (req, res) { // 打印url var pathname = url.parse(req.url).pathname; console.log('Request for ' + pathname + ' recei

防御XSS攻击的七条原则

本文将会着重介绍防御XSS攻击的一些原则,需要读者对于XSS有所了解,至少知道XSS漏洞的基本原理,如果您对此不是特别清楚,请参考这两篇文章:<Stored and Reflected XSS Attack><DOM Based XSS> 攻击者可以利用XSS漏洞向用户发送攻击脚本,而用户的浏览器因为没有办法知道这段脚本是不可信的,所以依然会执行它.对于浏览器而言,它认为这段脚本是来自可以信任的服务器的,所以脚本可以光明正大地访问Cookie,或者保存在浏览器里被当前网站所用的敏感

textarea与XSS攻击

textarea用法 一般是用来接收用户输入,用于提交到服务器端,例如 网站的评论框. 如果此框也用于显示服务器端回传的内容,则有如下两种用法 法1 后台直接插入 <textarea><%=serverString;%></textarea> 法2 使用JS DOM接口赋值 textareaDom.value = "<%=serverString;%>" textarea content特性 即法1特性, 即使将html代码段插入text

WEB安全实战(三)XSS 攻击的防御

前言 上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全漏洞. 由于公司用的是 SpringMVC,因此,这次就主要基于 SpringMVC 来解决这些漏洞.当然,其实这些解决方案都是大同小异,对于什么环境来说根本无所谓.了解了原理,什么环境.什么语言都可以运用自如了.废话就不多说了,直接上解决方案. 解决方案 方案一 方案一主要是利用了 SpringMVC

XSS攻击:SOHU视频XSS漏洞导致其用户成为DDOS肉鸡

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的. from:http://www.incapsula.com/blog/world-largest-site-xss-ddos-zombies.html incapsula发现其一个客户遭受了应用层的DDos攻击. 大概有22000的互联网用户对其网站发起了2000万的GET请求. 

开启CSP网页安全政策防止XSS攻击

 一.简介 CSP是网页安全政策(Content Security Policy)的缩写.是一种由开发者定义的安全性政策申明,通过CSP所约束的责任指定可信的内容来源,(内容可以是指脚本.图片.style 等远程资源).通过CSP协定,可以防止XSS攻击,让web处一个安全运行的环境中. CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单.它的实现和执行全部由浏览器完成,开发者只需提供配置.CSP 大大增强了网页的安全性.攻击者即使发现了漏洞,也没法