PHP实现的防止跨站和xss攻击代码【来自阿里云】


Posted in PHP onJanuary 29, 2018

本文实例讲述了PHP实现的防止跨站和xss攻击代码。分享给大家供大家参考,具体如下:

文档说明:

1.将waf.php传到要包含的文件的目录

2.在页面中加入防护,有两种做法,根据情况二选一即可:

a).在所需要防护的页面加入代码

require_once('waf.php');

就可以做到页面防注入、跨站

如果想整站防注,就在网站的一个公用文件中,如数据库链接文件config.inc.php中!

添加require_once('waf.php');来调用本代码

常用php系统添加文件

PHPCMS V9 \phpcms\base.php
PHPWIND8.7 \data\sql_config.php
DEDECMS5.7 \data\common.inc.php
DiscuzX2   \config\config_global.php
Wordpress   \wp-config.php
Metinfo   \include\head.php

b).在每个文件最前加上代码

在php.ini中找到:

Automatically add files before or after any PHP document.

auto_prepend_file = waf.php路径;

PHP文件 waf.php

<?php
/*云体检通用漏洞防护补丁v1.1
更新时间:2013-05-25
功能说明:防护XSS,SQL,代码执行,文件包含等多种高危漏洞
*/
$url_arr=array(
'xss'=>"\\=\\+\\/v(?:8|9|\\+|\\/)|\\%0acontent\\-(?:id|location|type|transfer\\-encoding)",
);
$args_arr=array(
'xss'=>"[\\'\\\"\\;\\*\\<\\>].*\\bon[a-zA-Z]{3,15}[\\s\\r\\n\\v\\f]*\\=|\\b(?:expression)\\(|\\<script[\\s\\\\\\/]|\\<\\!\\[cdata\\[|\\b(?:eval|alert|prompt|msgbox)\\s*\\(|url\\((?:\\#|data|javascript)",
'sql'=>"[^\\{\\s]{1}(\\s|\\b)+(?:select\\b|update\\b|insert(?:(\\/\\*.*?\\*\\/)|(\\s)|(\\+))+into\\b).+?(?:from\\b|set\\b)|[^\\{\\s]{1}(\\s|\\b)+(?:create|delete|drop|truncate|rename|desc)(?:(\\/\\*.*?\\*\\/)|(\\s)|(\\+))+(?:table\\b|from\\b|database\\b)|into(?:(\\/\\*.*?\\*\\/)|\\s|\\+)+(?:dump|out)file\\b|\\bsleep\\([\\s]*[\\d]+[\\s]*\\)|benchmark\\(([^\\,]*)\\,([^\\,]*)\\)|(?:declare|set|select)\\b.*@|union\\b.*(?:select|all)\\b|(?:select|update|insert|create|delete|drop|grant|truncate|rename|exec|desc|from|table|database|set|where)\\b.*(charset|ascii|bin|char|uncompress|concat|concat_ws|conv|export_set|hex|instr|left|load_file|locate|mid|sub|substring|oct|reverse|right|unhex)\\(|(?:master\\.\\.sysdatabases|msysaccessobjects|msysqueries|sysmodules|mysql\\.db|sys\\.database_name|information_schema\\.|sysobjects|sp_makewebtask|xp_cmdshell|sp_oamethod|sp_addextendedproc|sp_oacreate|xp_regread|sys\\.dbms_export_extension)",
'other'=>"\\.\\.[\\\\\\/].*\\%00([^0-9a-fA-F]|$)|%00[\\'\\\"\\.]");
$referer=empty($_SERVER['HTTP_REFERER']) ? array() : array($_SERVER['HTTP_REFERER']);
$query_string=empty($_SERVER["QUERY_STRING"]) ? array() : array($_SERVER["QUERY_STRING"]);
check_data($query_string,$url_arr);
check_data($_GET,$args_arr);
check_data($_POST,$args_arr);
check_data($_COOKIE,$args_arr);
check_data($referer,$args_arr);
function W_log($log)
{
  $logpath=$_SERVER["DOCUMENT_ROOT"]."/log.txt";
  $log_f=fopen($logpath,"a+");
  fputs($log_f,$log."\r\n");
  fclose($log_f);
}
function check_data($arr,$v) {
 foreach($arr as $key=>$value)
 {
  if(!is_array($key))
  { check($key,$v);}
  else
  { check_data($key,$v);}
  if(!is_array($value))
  { check($value,$v);}
  else
  { check_data($value,$v);}
 }
}
function check($str,$v)
{
  foreach($v as $key=>$value)
  {
  if (preg_match("/".$value."/is",$str)==1||preg_match("/".$value."/is",urlencode($str))==1)
    {
      //W_log("<br>IP: ".$_SERVER["REMOTE_ADDR"]."<br>时间: ".strftime("%Y-%m-%d %H:%M:%S")."<br>页面:".$_SERVER["PHP_SELF"]."<br>提交方式: ".$_SERVER["REQUEST_METHOD"]."<br>提交数据: ".$str);
      print "您的提交带有不合法参数,谢谢合作";
      exit();
    }
  }
}
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP面向对象编程快速入门
Oct 09 PHP
在Windows版的PHP中使用ADO
Oct 09 PHP
php 保留字列表
Oct 04 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
php按字符无乱码截取中文的方法
Mar 27 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
深入理解PHP内核(一)
Nov 10 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
Jan 07 PHP
php实现博客,论坛图片防盗链的方法
Oct 15 PHP
php的socket编程详解
Nov 20 PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 PHP
php的无刷新操作实现方法分析
Feb 28 PHP
php实现的AES加密类定义与用法示例
Jan 29 #PHP
php 判断IP为有效IP地址的方法
Jan 28 #PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 #PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
Jan 27 #PHP
PHP设计模式之注册树模式分析
Jan 26 #PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 #PHP
PHP CURL与java http使用方法详解
Jan 26 #PHP
You might like
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
js特殊字符过滤的示例代码
2014/03/05 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python获取脚本所在目录的正确方法
2014/04/15 Python
python复制与引用用法分析
2015/04/08 Python
Python实现把数字转换成中文
2015/06/29 Python
Django中的ajax请求
2018/10/19 Python
python判断完全平方数的方法
2018/11/13 Python
matplotlib实现区域颜色填充
2019/03/18 Python
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
为什么说python适合写爬虫
2020/06/11 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
汽车运用工程专业求职信
2014/06/18 职场文书
计划生育标语
2014/06/23 职场文书
七年级话题作文之执着
2019/11/19 职场文书