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 ...
随机推荐
- ClassNotFoundException和 NoClassDefFoundError区别验证
首先NoClassDefFoundError是一个错误,而ClassNotFoundException是一个异常 NoClassDefFoundError产生的原因: 如果JVM或者Classload ...
- 解决Spark集群无法停止
执行stop-all.sh时,出现报错:no org.apache.spark.deploy.master.Master to stop,no org.apache.spark.deploy.work ...
- 基于Maven的SpringBoot项目实现热部署的两种方式
转载:http://blog.csdn.net/tengxing007/article/details/72675168 前言 JRebel是JavaEE中比较流行的热部署插件,可快速实现热部署,节省 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-Switch Case语句是否会自动跳转到下一个
在C#中,每一个case后面必须有break,所以输出1,也就是如果a=0,则只会执行case=0的那一段,当等于1之后不会继续. 在TwinCAT中,虽然CASE语句没有break,但是实际上不 ...
- libevent2源码分析之三:信号的初始化流程
libevent2对信号的响应也进行了封装,使之与socket操作一样对外提供统一的接口.这里的信号一般指linux的信号.由于信号与socket相关的编程接口有较大的不同,因此在内部实现也有一些区别 ...
- python操作xml文件
一.什么是xml? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. abc.xml <?xml version="1.0&q ...
- Linux LVM逻辑卷配置过程详解(创建、扩展、缩减、删除、卸载、快照创建)(未完)
转:http://blog.csdn.net/xuanfeng407/article/details/51465472
- unity, 自定义类中使用print
在unity脚本中自定义c#类,而且不继承MonoBehaviour的话,若还想在其中使用print函数,可以用MonoBehaviour.print(...).
- PCIE博文链接
http://blog.csdn.net/mao0514/article/category/1518607/1
- [ci]项目规划-后续
几个方面来写 1,搭建gitlab 配邮箱 域名等使之好用 2,搭建jenkins –yum,安装常见插件 3,搭建sonar,汉化 4,安装sonar-scanner 0,实现sonar ...