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 相关文章推荐
PHPwind整合最土系统用户同步登录实现方法
Dec 08 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
php mongodb操作类 带几个简单的例子
Aug 25 PHP
PHP实现对数组分页处理实例详解
Feb 07 PHP
Yii2中简单的场景使用介绍
Jun 02 PHP
php workerman定时任务的实现代码
Dec 23 PHP
浅谈PHP5.6 与 PHP7.0 区别
Oct 09 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 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微信红包API接口
2015/12/05 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
2017/06/30 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Django项目开发中cookies和session的常用操作分析
2018/07/03 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
Django框架验证码用法实例分析
2019/05/10 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
python绘制分布折线图的示例
2020/09/24 Python
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
中职应届生会计求职信
2013/10/23 职场文书
优秀的毕业生的自我评价
2013/12/12 职场文书
幼儿园教师备课制度
2014/01/12 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
遗产继承公证书
2014/04/09 职场文书
校园元旦活动总结
2014/07/09 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
党委工作总结2015
2015/04/27 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
golang import自定义包方式
2021/04/29 Golang
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript