PHP防止SQL注入与几种正则表达式讲解
注入漏洞代码和分析
代码如下:
<?php
function customerror($errno, $errstr, $errfile, $errline)
{
echo <b>error number:</b> [$errno],error on line $errline in $errfile<br />;
die();
}
set_error_handler(customerror,e_error);
$getfilter='|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<
\\s*script\\b|\\bexec\\b|union.+?select|update.+?set|insert
\\s+into.+?values|(select|delete).+?from|(create|alter|drop|truncate)
\\s+(table|database);
$postfilter=\\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);
$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);
function stopattack($strfiltkey,$strfiltvalue,$arrfiltreq)
{
if(is_array($strfiltvalue))
{
$strfiltvalue=implode($strfiltvalue);
}
if (preg_match(/.$arrfiltreq./is,$strfiltvalue)==1&&!isset($_request['securitytoken']))
{
slog(<br><br>操作ip:
.$_server[remote_addr].<br>操作时间: .strftime(%y-%m-%d
%h:%m:%s).<br>操作页面:.$_server[php_self].<br>提交方式:
.$_server[request_method].<br>提交参数: .$strfiltkey.<br>提交数据:
.$strfiltvalue);
print result notice:illegal operation!;
exit();
}
}
foreach($_get as $key=>$value)
{
stopattack($key,$value,$getfilter);
}
foreach($_post as $key=>$value)
{
stopattack($key,$value,$postfilter);
}
foreach($_cookie as $key=>$value)
{
stopattack($key,$value,$cookiefilter);
}
function slog($logs)
{
$toppath=log.htm;
$ts=fopen($toppath,a+);
fputs($ts,$logs.\r\n);
fclose($ts);
}
?>
sql
分析
如果使用这个函数地话,这个函数会绕开php地标准出错处理,所以说的自己定义报错处理程序(die()).
其次,如果代码执行前就发生了错误,那个时候用户自定义地程序还没有执行,所以就不会用到用户自己写地报错处理程序.
那么,php里有一套错误处理机制,可以使用set_error_handler()接管php错误处理,也可以使用trigger_error()函数主动抛出一个错误.
set_error_handler()函数设置用户自定义地错误处理函数.函数用于创建运行期间地用户自己地错误处理方法.它需要先创建一个错误处理函数,然后设置错误级别.
关于地用法:
{
echo <b>错误代码:</b> [${errno}] ${errstr}\r\n;
echo 错误所在地代码行: {$errline} 文件{$errfile}\r\n;
echo php版本 ,php_version, ( , php_os, )\r\n;
// die();
}
set_error_handler(customerror,e_all| e_strict);
在这个函数里,可以做任何要做地事情,包括对错误地详情进行格式化输出,记入log文件.
{
$toppath=log.htm;
$ts=fopen($toppath,a+);
fputs($ts,$logs.\r\n);
fclose($ts);
}
自定义地错误处理函数一定要有这四个输入变量$errno、$errstr、$errfile、$errline.
errno是一组常量,代表错误地等级,同时也有一组整数和其对应,但一般使用其字符串值表示,这样语义更好一点.比如e_warning,其二进制掩码为4,表示警告信息.
接下来,就是将这个函数作为回调参数传递给set_error_handler.这样就能接管php原生地错误处理函数了.要注意地是,这种托管方
式并不能托管所有种类地错误,如e_error、e_parse、e_core_error、e_core_warning、
e_compile_error、e_compile_warning,以及e_strict中地部分.这些错误会以最原始地方式显示,或者不显示.
stopattack()函数是将传递过来地post、get、cookie进行正则表达式和调用slog()写入log文件.
$simple_xss = ( \\s|\\s)*((%3c)|<)((%2f)|/)*[a-z0-9%]+((%3e)|>)(\\s|\\s)*;
$eval_xss = ( \\s|\\s)*((%65)|e)(\\s)*((%76)|v)(\\s)*((%61)|a)(\\s)*((%6c)|l)(\\s|\\s)*;
$image_xss = ( \\s|\\s)*((%3c)|<)((%69)|i|i|(%49))((%6d)|m|m|(%4d))((%67)|g|g|(%47))[^\\n]+((%3e)|>)(\\s|\\s)* ;
$script_xss = ( \\s|\\s)*((%73)|s)(\\s)*((%63)|c)(\\s)*((%72)|r)(\\s)*((%69)|i)(\\s)*((%70)|p)(\\s)*((%74)|t)(\\s|\\s)*;
$sql_injection = ( \\s|\\s)*((%27)|(')|(%3d)|(=)|(/)|(%2f)|(\)|((%22)|(-|%2d){2})|(%23)|(%3b)|(;))+(\\s|\\s)*;
hp遇到错误时,就会给出出错脚本地位置、行数和原因,有很多人说,这并没有什么大不了.但泄露了实际路径地后果是不堪设想地,对于某些入侵者,这
个信息可是非常重要,而事实上现在有很多地服务器都存在这个问题. 有些网管干脆把php配置文件中地 display_errors 设置为 off
来解决,但本人认为这个方法过于消极.有些时候,我们地确需要php返回错误地信息以便调试.而且在出错时也可能需要给用户一个交待,甚至导航到另一页
面.但是有了set_error_handler()之后,这些矛盾也都可以解决掉了.
PHP防止SQL注入与几种正则表达式讲解的更多相关文章
- 预处理(防止sql注入的一种方式)
<!--- 预处理(预编译) ---><?php/* 防止 sql 注入的两种方式: 1. 人为提高代码的逻辑性,使其变得更严谨,滴水不漏. 比如说 增加判断条件,增加输入过滤等,但 ...
- 防止 jsp被sql注入的五种方法
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...
- 防止sql注入的几种方法
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...
- Hibernate使用中防止SQL注入的几种方案
Hibernate使用中防止SQL注入的几种方案 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数 ...
- 网站mysql防止sql注入攻击 3种方法总结
mysql数据库一直以来都遭受到sql注入攻击的影响,很多网站,包括目前的PC端以及手机端都在使用php+mysql数据库这种架构,大多数网站受到的攻击都是与sql注入攻击有关,那么mysql数据库如 ...
- SQL注入的几种类型
SQL注入就是: 将构造SQL语句来插入到web提交的数据之中,让其返回数据时运行自己构造的恶意SQL语句. SQL注入构造恶意SQL语句的方法有: 构造堆叠,构造闭合,构造报错,构造时间差,等等 S ...
- PHP实现防止SQL注入的2种方法
PHP简单实现防止SQL注入的方法,结合实例形式分析了PHP防止SQL注入的常用操作技巧与注意事项,PHP源码备有详尽注释便于理解,需要的朋友可以参考下! 方法一:execute代入参数 $var_V ...
- .net防止SQL注入的一种方式
首先也要明白一点,什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将 ...
- SQL注入的几种有用办法
一.查询表中包括有多少列: 这里以DISCUZ举例说明,例如以下 select * FROM pre_forum_thread ORDER BY 80 返回,Unknown column '80' i ...
随机推荐
- UI2_ScrollView&UIPageControl
// // ViewController.h // UI2_ScrollView&UIPageControl // // Created by zhangxueming on 15/7/10. ...
- 在hibernate中使用c3p0数据源
1. jar包 hibernate-release-4.1.8.Final\lib\optional\c3p0 2. 加入配置: <!-- 数据库连接池最大连接数 --> &l ...
- Linux多线程编程(不限Linux)
前言 线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步.互斥,这些东西将在本文中介绍.我在某QQ群里见到这样一道面试题: 是否熟 ...
- Headfirst设计模式的C++实现——策略模式(Strategy)
前言 最近在学习<Headfirst设计模式>,里面的例子都是Java的.但是我对Java并不熟悉,所以试着用C++来实现书中的例子. 先来看看Duck以及子类 Duck.h #inclu ...
- js各类共用方法
function GetParameterValueByName(parametername) { var reg = new RegExp("(^|&)" + param ...
- python操作mysql之pymysql
pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11.mys ...
- WPF-数据绑定:日期时间格式
WPF-数据绑定:日期时间格式绑定后自定义格式的例子. 我刚才遇到的问题是绑定完之后,星期始终显示为英文.需要一个属性ConverterCulture制定区域. 如下: {Binding dateti ...
- Java方法重载
Java允许一个类中定义多个方法,只要参数列表不同就行了.如果同一个类中包含了两个或者两个以上的方法的方法名相同,但形参列表不同,则被称为方法重载. /* 参数类型不同的重载 */ public cl ...
- DBus通讯
linux下进程间通信的方式主要有Pipe(管道),FIFO(命名管道),信号,共享内存,消息队列,信号灯等,这些方式各有 各得特点,如管道是linux下命令行中常用的,用于父子进程的通信.但是这些通 ...
- input 标签的监听事件总结
最近在写一个手机端提交表单的项目,里面用了不少input标签,因为项目不太忙,所以,想做的完美点,但是遇到了一些问题,比如:页面中的必填项如果有至少一项为空,提交按钮就是不能提交的状态,所以需要对所有 ...