<?php
/**
* 安全模块
* Email:zhangyuan@tieyou.com
* 主要针对xss跨站攻击、sql注入等敏感字符串进行过滤
* @author hkshadow
*/
class safeMode{ /**
* 执行过滤
* @param 1 linux/2 http/3 Db/ $group
* @param 保存路径以及文件名/文件名/null $projectName
*/
public function xss($group = 1,$projectName = NULL){
//正则条件
$referer = empty ( $_SERVER ['HTTP_REFERER'] ) ? array () : array ($_SERVER ['HTTP_REFERER'] );
$getfilter = "'|<[^>]*?>|^\\+\/v(8|9)|\\b(and|or)\\b.+?(>|<|=|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
$postfilter = "^\\+\/v(8|9)|\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|<\\s*img\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
$cookiefilter = "\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; // $ArrPGC=array_merge($_GET,$_POST,$_COOKIE); //遍历过滤
foreach ( $_GET as $key => $value ) {
$this->stopAttack ( $key, $value, $getfilter ,$group , $projectName);
}
//遍历过滤
foreach ( $_POST as $key => $value ) {
$this->stopAttack ( $key, $value, $postfilter ,$group , $projectName);
}
//遍历过滤
foreach ( $_COOKIE as $key => $value ) {
$this->stopAttack ( $key, $value, $cookiefilter ,$group , $projectName);
}
//遍历过滤
foreach ( $referer as $key => $value ) {
$this->stopAttack ( $key, $value, $getfilter ,$group , $projectName);
}
} /**
* 匹配敏感字符串,并处理
* @param 参数key $strFiltKey
* @param 参数value $strFiltValue
* @param 正则条件 $arrFiltReq
* @param 项目名 $joinName
* @param 1 linux/2 http/3 Db/ $group
* @param 项目名/文件名/null $projectName
*/
public function stopAttack($strFiltKey, $strFiltValue, $arrFiltReq,$group = 1,$projectName = NULL) { $strFiltValue = $this->arr_foreach ( $strFiltValue );
//匹配参数值是否合法
if (preg_match ( "/" . $arrFiltReq . "/is", $strFiltValue ) == 1) {
//记录ip
$ip = "操作IP: ".$_SERVER["REMOTE_ADDR"];
//记录操作时间
$time = " 操作时间: ".strftime("%Y-%m-%d %H:%M:%S");
//记录详细页面带参数
$thePage = " 操作页面: ".$this->request_uri();
//记录提交方式
$type = " 提交方式: ".$_SERVER["REQUEST_METHOD"];
//记录提交参数
$key = " 提交参数: ".$strFiltKey;
//记录参数
$value = " 提交数据: ".htmlspecialchars($strFiltValue);
//写入日志
$strWord = $ip.$time.$thePage.$type.$key.$value;
//保存为linux类型
if($group == 1){
$this->log_result_common($strWord,$projectName);
}
//保存为可web浏览
if($group == 2){
$strWord .= "<br>";
$this->slog($strWord,$projectName);
}
//保存至数据库
if($group == 3){
$this->sDb($strWord);
}
//过滤参数
$_REQUEST[$strFiltKey] = '';
//这里不作退出处理
//exit;
} //匹配参数是否合法
if (preg_match ( "/" . $arrFiltReq . "/is", $strFiltKey ) == 1) {
//记录ip
$ip = "操作IP: ".$_SERVER["REMOTE_ADDR"];
//记录操作时间
$time = " 操作时间: ".strftime("%Y-%m-%d %H:%M:%S");
//记录详细页面带参数
$thePage = " 操作页面: ".$this->request_uri();
//记录提交方式
$type = " 提交方式: ".$_SERVER["REQUEST_METHOD"];
//记录提交参数
$key = " 提交参数: ".$strFiltKey;
//记录参数
$value = " 提交数据: ".htmlspecialchars($strFiltValue);
//写入日志
$strWord = $ip.$time.$thePage.$type.$key.$value;
//保存为linux类型
if($group == 1){
$this->log_result_common($strWord,$projectName);
}
//保存为可web浏览
if($group == 2){
$strWord .= "<br>";
$this->slog($strWord,$projectName);
}
//保存至数据库
if($group == 3){
$this->sDb($strWord);
}
//过滤参数
$_REQUEST[$strFiltKey] = '';
//这里不作退出处理
//exit;
}
} /**
* 获取当前url带具体参数
* @return string
*/
public function request_uri() {
if (isset ( $_SERVER ['REQUEST_URI'] )) {
$uri = $_SERVER ['REQUEST_URI'];
} else {
if (isset ( $_SERVER ['argv'] )) {
$uri = $_SERVER ['PHP_SELF'] . '?' . $_SERVER ['argv'] [0];
} else {
$uri = $_SERVER ['PHP_SELF'] . '?' . $_SERVER ['QUERY_STRING'];
}
}
return $uri;
} /**
* 日志记录(linux模式)
* @param 保存内容 $strWord
* @param 保存文件名$strPathName
*/
public function log_result_common($strWord, $strPathName = NULL) {
if($strPathName == NULL){
$strPath = "/var/tmp/";
$strDay = date('Y-m-d');
$strPathName = $strPath."common_log_".$strDay.'.log';
} $fp = fopen($strPathName,"a");
flock($fp, LOCK_EX) ;
fwrite($fp,$strWord." date ".date('Y-m-d H:i:s',time())."\t\n");
flock($fp, LOCK_UN);
fclose($fp);
} /**
* 写入日志(支持http查看)
* @param 日志内容 $strWord
* @param web页面文件名 $fileName
*/
public function slog($strWord,$fileName = NULL) {
if($fileName == NULL){
$toppath = $_SERVER ["DOCUMENT_ROOT"] . "/log.htm";
}else{
$toppath = $_SERVER ["DOCUMENT_ROOT"] .'/'. $fileName;
}
$Ts = fopen ( $toppath, "a+" );
fputs ( $Ts, $strWord . "\r\n" );
fclose ( $Ts );
} /**
* 写入日志(数据库)
* @param 日志内容 $strWord
*/
public function sDb($strWord){
//....
} /**
* 递归数组
* @param array $arr
* @return unknown|string
*/
public function arr_foreach($arr) {
static $str = '';
if (! is_array ( $arr )) {
return $arr;
}
foreach ( $arr as $key => $val ) {
if (is_array ( $val )) {
$this->arr_foreach ( $val );
} else {
$str [] = $val;
}
}
return implode ( $str );
}
}
?>

sql 注入安全过滤-安全模块的更多相关文章

  1. SQL注入攻防入门详解

    =============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...

  2. SQL注入攻防入门详解(2)

    SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...

  3. [转]SQL注入攻防入门详解

    原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...

  4. 总结了关于PHP xss 和 SQL 注入的问题(转)

    漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,本文只是简单介绍PHP如何 ...

  5. 【实验吧】CTF_Web_简单的SQL注入之1

    题目链接:http://ctf5.shiyanbar.com/423/web/ 简单的SQL注入之1,比2,3都简单一些.利用2 的查询语句也可以实现:1'/**/union/**/select/** ...

  6. 【转载】SQL注入攻防入门详解

    滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园  首页  博问  闪存    联系  订阅 管理 随笔-58 评论-2028 文章-5  trackbacks-0 站长 ...

  7. sql 注入入门

    =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关 ...

  8. 关于PHP xss 和 SQL 注入的问题

    漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,PHP如何有效防止这些漏洞 ...

  9. SQL注入漏洞技术的详解

    SQL注入漏洞详解 目录 SQL注入的分类 判断是否存在SQL注入 一:Boolean盲注 二:union 注入 三:文件读写 四:报错注入 floor报错注入 ExtractValue报错注入 Up ...

随机推荐

  1. struts2设置文件上传大小

    利用struts2想要设置或者限制上传文件的大小,可以在struts.xml配置文件里面进行如下配置: <constant name="struts.multipart.maxSize ...

  2. linux后台启动命令-的原因

    linux后台启动命令-的原因 学习了:https://blog.csdn.net/saife/article/details/78276014 学习了:https://www.ibm.com/dev ...

  3. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何获取标准驱动器扭矩值获取电流值

    双击某个驱动器(以松下伺服驱动器为例),在Process Data中,注意默认显示了PDO mapping1的数据(Error code, status word等)   注意左侧,2和3分别表示了与 ...

  4. 使用Tornado实现Ajax请求

    Ajax,指的是网页异步刷新,一般的实现均为js代码向server发POST请求,然后将收到的结果返回在页面上.   这里我编写一个简单的页面,ajax.html <html> <h ...

  5. easyui required 提交验证

    使用easyui时,对于提交验证,不不过在标签属性中加入data-options=required:true这句话这么来的.还须要另外加上才写东西能够把验证完整实现 1.设置from的属性 <f ...

  6. LoadRunner测试AJAX

    什么是AJAX? Ajax, shorthand for Asynchronous JavaScript and XML, is a web development technique for cre ...

  7. css选择器和xpath对照表

  8. Python基础--人们一些最爱的标准库(random time)

    Python继续! random 包括返回随机数的函数. 这里跟C++一样,产生的是伪随机数,并非全然随机数. random中一些重要的函数: random() 返回0<n<=1的随机数n ...

  9. 程序员的笔记工具——Markdown

    安利一款轻量级的标记语言——Markdown 如上,Markdown作为一门语言,十分钟即可入门,熟练以后麻麻再也不用担心我在文章排版上浪费时间了!! 入门资源可参考如下回答(建议拣一条完整的看完上手 ...

  10. 【转】原生js仿jquery一些常用方法

    现在利用扩展原型的方法实现一些jquery函数: 1.显示/隐藏 ? 1 2 3 4 5 6 7 8 9 10 //hide() Object.prototype.hide = function(){ ...