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数据流应用的简单例子
Jun 01 PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 PHP
php中的静态变量的基本用法
Mar 20 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
php中数据库连接方式pdo和mysqli对比分析
Feb 25 PHP
php实现源代码加密的方法
Jul 11 PHP
php实现CSV文件导入和导出
Oct 24 PHP
Yii控制器中操作视图js的方法
Jul 04 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
Dec 03 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 PHP
如何用Laravel包含你自己的帮助函数
May 27 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使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
在html页面上拖放移动标签
2010/01/08 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
JS定义网页表单提交(submit)的方法
2015/03/20 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
Python中规范定义命名空间的一些建议
2016/06/04 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
有关Python的22个编程技巧
2018/08/29 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
python函数不定长参数使用方法解析
2019/12/14 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
Python面试题:如何用Python来发送邮件
2016/03/15 面试题
学校食堂采购员岗位职责
2013/12/05 职场文书
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书