首页 后端开发 php教程 谈谈​PHP防止XSS跨站脚本攻击的方法

谈谈​PHP防止XSS跨站脚本攻击的方法

Jul 17, 2020 pm 03:41 PM
xss攻击

谈谈​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).网页不停地刷新 ''

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

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

相关推荐:PHP教程

以上是谈谈​PHP防止XSS跨站脚本攻击的方法的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用PHP防御跨站脚本(XSS)攻击 如何使用PHP防御跨站脚本(XSS)攻击 Jun 29, 2023 am 10:46 AM

如何使用PHP防御跨站脚本(XSS)攻击随着互联网的快速发展,跨站脚本(Cross-SiteScripting,简称XSS)攻击是最常见的网络安全威胁之一。XSS攻击主要是通过在网页中注入恶意脚本,从而实现获取用户敏感信息、盗取用户账号等目的。为了保护用户数据的安全,开发人员应该采取适当的措施来防御XSS攻击。本文将介绍一些常用的PHP防御XSS攻击的技术

XSS漏洞的工作原理是什么? XSS漏洞的工作原理是什么? Feb 19, 2024 pm 07:31 PM

XSS攻击原理是什么,需要具体代码示例随着互联网的普及和发展,Web应用程序的安全性逐渐成为人们关注的焦点。其中,跨站脚本攻击(Cross-SiteScripting,简称XSS)是一种常见的安全漏洞,对于Web开发人员而言必须要重视。XSS攻击是通过向Web页面注入恶意的脚本代码,从而在用户的浏览器中执行,这样攻击者就能控制用户的浏览器,获取用户的敏感信

PHP数据过滤:预防XSS和CSRF攻击 PHP数据过滤:预防XSS和CSRF攻击 Jul 29, 2023 pm 03:33 PM

PHP数据过滤:预防XSS和CSRF攻击随着互联网的发展,网络安全成为人们关注的焦点之一。在网站开发中,对于用户提交的数据进行过滤和验证是非常重要的,尤其是预防XSS(跨站脚本攻击)和CSRF(跨站请求伪造攻击)攻击。本文将介绍如何使用PHP来防止这两种常见的安全漏洞,并提供一些示例代码供参考。预防XSS攻击XSS攻击是指恶意攻击者通过注入恶意脚本或代码来篡

Go语言中的跨站点脚本(XSS)攻击防范:最佳实践和技巧 Go语言中的跨站点脚本(XSS)攻击防范:最佳实践和技巧 Jun 17, 2023 pm 12:46 PM

随着互联网的快速发展,网站安全问题已经成为了网络世界中的一大难题。跨站点脚本(XSS)攻击是一种常见的安全漏洞,它利用网站的弱点,将恶意脚本注入到网页中,从而对用户的信息进行窃取和篡改。Go语言作为一种高效、安全的编程语言,为我们提供了强有力的防范XSS攻击的工具和技巧。本文将介绍一些最佳实践和技巧,帮助Go语言开发者有效地预防和解决XSS攻击。对所有输入进

Java开发中常见的网络安全问题及解决方法 Java开发中常见的网络安全问题及解决方法 Oct 09, 2023 pm 06:36 PM

Java开发中常见的网络安全问题及解决方法摘要:随着互联网的普及,网络安全问题日益凸显。在Java开发过程中,我们需要考虑如何保护网络通信的安全性。本篇文章将介绍一些常见的网络安全问题,并提供相应的解决方法和代码示例。一、跨站脚本攻击(XSS)XSS攻击是指通过将恶意脚本注入到网页中,获取用户敏感信息的一种攻击手段。为防止XSS攻击,我们可以使用常规的输入检

PHP语言开发中如何避免SQL注入和XSS攻击? PHP语言开发中如何避免SQL注入和XSS攻击? Jun 09, 2023 pm 06:27 PM

随着互联网应用越来越广泛,安全问题也越来越引人注目。在PHP开发中,SQL注入和XSS攻击是最常见的两种安全问题。本文将介绍如何避免这两种攻击方式。一、什么是SQL注入?SQL注入是指攻击者利用Web应用程序漏洞,通过输入SQL指令,使数据库服务器以超出原始设计意图外的方式运行。攻击者借助这些漏洞,可以进行恶意操作,如读写数据、获取管理员权限等。二、如何避免

学习安全防范:使用PHP避免XSS攻击 学习安全防范:使用PHP避免XSS攻击 Jun 22, 2023 am 08:48 AM

在互联网时代,随着Web应用的不断普及和发展,注入和跨站点脚本攻击(XSS)已成为安全防范工作中的一个重点。其中,XSS攻击是攻击者通过在Web页面中插入恶意脚本来实现攻击的方式,而PHP作为一种服务器端脚本语言,在Web开发中广泛应用,如何使用PHP避免XSS攻击成为了开发人员必须面对的问题。首先,了解XSS攻击的实现方式对于预防XSS攻击至关重要。XSS

ThinkPHP开发注意事项:防止XSS攻击 ThinkPHP开发注意事项:防止XSS攻击 Nov 22, 2023 pm 08:13 PM

ThinkPHP是一个流行的PHP开发框架,它提供了强大的功能和易于使用的工具,使开发人员能够快速构建高效的Web应用程序。然而,在开发过程中,我们需要注意XSS(跨站脚本攻击)这种常见的网络安全威胁。XSS攻击是通过注入恶意脚本来盗取用户信息或传播恶意软件的一种技术。本文将讨论在ThinkPHP开发过程中需要注意的一些防止XSS攻击的注意事项。首先,我们需

See all articles