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
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
Aug 01 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
PHP中使用cURL实现Get和Post请求的方法
Mar 13 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
Jul 03 PHP
PHP小教程之实现链表
Jun 09 PHP
将FCKeditor导入PHP+SMARTY的实现方法
Jan 15 PHP
PHP 数组基本操作小结(推荐)
Jun 13 PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 PHP
thinkphp5框架API token身份验证功能示例
May 21 PHP
laravel-admin select框默认选中的方法
Oct 03 PHP
php解析非标准json、非规范json的方式实例
May 10 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
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
python对象及面向对象技术详解
2016/07/19 Python
Python实现全角半角字符互转的方法
2016/11/28 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
python机器人行走步数问题的解决
2018/01/29 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
费用会计岗位职责
2014/01/01 职场文书
新教师工作感言
2014/02/16 职场文书
绩效考核实施方案
2014/03/18 职场文书
和解协议书
2014/04/16 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
领导班子整改方案
2014/10/25 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
初中语文教学随笔
2015/08/15 职场文书
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB