sql 注入安全过滤-安全模块
<?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 注入安全过滤-安全模块的更多相关文章
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
- SQL注入攻防入门详解(2)
SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...
- [转]SQL注入攻防入门详解
原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...
- 总结了关于PHP xss 和 SQL 注入的问题(转)
漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,本文只是简单介绍PHP如何 ...
- 【实验吧】CTF_Web_简单的SQL注入之1
题目链接:http://ctf5.shiyanbar.com/423/web/ 简单的SQL注入之1,比2,3都简单一些.利用2 的查询语句也可以实现:1'/**/union/**/select/** ...
- 【转载】SQL注入攻防入门详解
滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园 首页 博问 闪存 联系 订阅 管理 随笔-58 评论-2028 文章-5 trackbacks-0 站长 ...
- sql 注入入门
=============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关 ...
- 关于PHP xss 和 SQL 注入的问题
漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,PHP如何有效防止这些漏洞 ...
- SQL注入漏洞技术的详解
SQL注入漏洞详解 目录 SQL注入的分类 判断是否存在SQL注入 一:Boolean盲注 二:union 注入 三:文件读写 四:报错注入 floor报错注入 ExtractValue报错注入 Up ...
随机推荐
- python之MySQL学习——防止SQL注入
python之MySQL学习——防止SQL注入 学习了:https://www.cnblogs.com/xiaomingzaixian/p/7126840.html https://www.cnblo ...
- POSTGRESQL同步——SLONY-I配置
来自:http://bbs.chinaunix.net/thread-955564-1-1.html 参考文档 http://bbs.chinaunix.net/viewthr ... page%3D ...
- 【转】原生js仿jquery一些常用方法
现在利用扩展原型的方法实现一些jquery函数: 1.显示/隐藏 ? 1 2 3 4 5 6 7 8 9 10 //hide() Object.prototype.hide = function(){ ...
- 记一次SmtpClient发送邮件引发的系列问题
前提:公司同事离职,我接手同事负责的项目. 事件:某天公司的分析人员,说软件中的邮件发送功能不能使用,总是提示"邮件发送失败". 本地能够正常发送,发布WCF到服务器IIS上,再调 ...
- Android startActivities()的使用
startActivities()和startActivity类似,也是界面跳转: Intent[] intents = new Intent[2]; intents[0] = new Intent( ...
- ARM(CM3)的汇编指令
转http://blog.csdn.net/gaojinshan/article/details/11534569 16位数据操作指令 名字 功能ADC 带进位加法(ADD with Carry) ...
- pouchdb快速入门教程
a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2p ...
- Linux tomcat安装详解(未完)
转: http://blog.csdn.net/lcyaiym/article/details/76696192
- SGDMA-----Scatter-gather DMA
Scatter-gather DMA 使用一个链表描述物理上不连续的存储空间,然后把链表首地址告诉DMA master.DMA master在传输完一块物理连续的数据后,不用发起中断,而是根据链表来传 ...
- ios 应用多语言自由切换实现
第一次进入应用获取本机语言.1.假设本机语言在软件实现语言列表里.则默认选中本机语言,可是用户还是能够选择其他语言.2.假设本机语言不在软件实现语言列表里,则默认选中英语.用户还是能够选择其他语言. ...