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

2018-09-07 12:36

阅读:418

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

  文档说明:

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

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

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

   require_once(waf.php);

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

  如果想整站防注,就在网站的一个公用文件中,如数据库链接文件.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(?:89\\+\\/)\\%0acontent\\-(?:idlocationtypetransfer\\-encoding), ); $args_arr=array( xss=>[\\\\\\\;\\*\\<\\>].*\\bon[a-zA-Z]{3,15}[\\s\\r\\n\\v\\f]*\\=\\b(?:expression)\\(\\<script[\\s\\\\\\/]\\<\\!\\[cdata\\[\\b(?:evalalertpromptmsgbox)\\s*\\(url\\((?:\\#datajavascript), sql=>[^\\{\\s]{1}(\\s\\b)+(?:select\\bupdate\\binsert(?:(\\/\\*.*?\\*\\/)(\\s)(\\+))+into\\b).+?(?:from\\bset\\b)[^\\{\\s]{1}(\\s\\b)+(?:createdeletedroptruncaterenamedesc)(?:(\\/\\*.*?\\*\\/)(\\s)(\\+))+(?:table\\bfrom\\bdatabase\\b)into(?:(\\/\\*.*?\\*\\/)\\s\\+)+(?:dumpout)file\\b\\bsleep\\([\\s]*[\\d]+[\\s]*\\)benchmark\\(([^\\,]*)\\,([^\\,]*)\\)(?:declaresetselect)\\b.*@union\\b.*(?:selectall)\\b(?:selectupdateinsertcreatedeletedropgranttruncaterenameexecdescfromtabledatabasesetwhere)\\b.*(charsetasciibincharuncompressconcatconcat_wsconvexport_sethexinstrleftload_filelocatemidsubsubstringoctreverserightunhex)\\((?:master\\.\\.sysdatabasesmsysaccessobjectsmsysqueriessysmodulesmysql\\.dbsys\\.database_nameinformation_schema\\.sysobjectssp_makewebtaskxp_cmdshellsp_oamethodsp_addextendedprocsp_oacreatexp_regreadsys\\.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)==1preg_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安全过滤技巧总结》、《PHP运算与运算符用法总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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


评论


亲,登录后才可以留言!