<?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. iOS开发-简单获取View截图图像(Quartz2D)

    1. 先指定图像的大小 UIGraphicsBeginImageContext(view.frame.size); 2. 在指定的区域绘制图像 [view drawViewHierarchyInRec ...

  2. JPA联合主键@EmbeddedId使用详解附查询例子

    花了2个小时的时间解决这个问题,网上资料太少,记录下     详情看源文件TBicPrmCompute,TBicPrmComputePK package com.isoftstone.core.dom ...

  3. Linux 常用命令速查

    0x001 .在指定文件夹下递归查询包含一个字符串的文件(列出的文件内容片段) grep -r   “要查找的串”    文件路径   如  : grep -r  "helloworld&q ...

  4. Filter介绍,运行顺序,实例

    Filter介绍 Filter可觉得是Servlet的一种"变种",它主要用于对用户请求进行预处理,也能够对HttpServletResponse进行后处理,是个典型的处理链. 它 ...

  5. ORM进阶之Hibernate 的三大对象

    ORM进阶之 ORM简单介绍 ORM进阶之Hibernate 简单介绍及框架搭 ORM进阶之Hibernate 的三大对象 我们在上一篇博客中讲到了怎样搭建一个Hibernate框架, 提到Hiber ...

  6. ie6、ie7下JSON.parse JSON未定义的解决方法

    解决方法一: var jsons = req.responseText; var s; if (typeof(JSON) == 'undefined'){ s = eval("(" ...

  7. Zigbee-CC2530开发板协议栈-改动发射功率

      CC2530 控制输出功率的寄存器是 TXPOWER: 推荐功率设置: 协议栈默认的设置是 0xd5,为了扩展信号传输的距离,我把TXPOWER寄存器值改为0xf5, 此时输出功率为4.5dBm. ...

  8. RHEL 7 安装MariaDB

    RedHat Enterprise Linux 7開始.系统盘中自带的数据库为MariaDB,安装的过程例如以下: 1. 挂载安装盘镜像:mount /dev/cdrom /mnt 2. 创建yum源 ...

  9. iOS_绘制带删除线的Label

    效果图例如以下: 一个带删除线的文本标签,继承自UILabel 自绘代码过程例如以下: 1,重写控件的drawRect方法 2,首先得到上下文对象 3,设置颜色,并指定是填充(Fill)模式还是笔刷( ...

  10. Atitit.linux 内核 新特性 新功能

    Atitit.linux 内核 新特性 新功能 1.  Linux 3.2内核新特性 2012-02-12 22:41:471 1.1. EXT4:支持更大的块2 1.2. BTRFS:更快的数据清理 ...