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 ...
随机推荐
- iOS中-Qutarz2D详解及使用
在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...
- 【转载】#323 - A Generic Class is a Template for a Class
A generic classs is a class that takes one or more type parameters, which it then uses in the defini ...
- ./configure:command not found 解决方法
有些下载下来的源码没有MAKEFILE文件,但是会有MAKEFILE.IN 和 configure, MAKEFILE文件则由后两个文件生成. 如果执行: $./configure 提示错误:./ ...
- CP30 ---DataSource连接池的创建过程
1.参看CP30文档quickStart 如下具体创建步骤 public DataSource getDs() throws Exception { //创建连接池对象 ComboPooledData ...
- Java线程角度的内存模型和volatile型变量
内存模型的目标是定义程序中各个变量的访问 规则,即在虚拟机中将变量(包括实例字段,静态字段和构成数组对象的元素,不包括局部变量与方法参数,因为后者是线程私有的)存储到内存和从内存中取出变量这样的底层细 ...
- .NET中的 枚举
我理解的枚举就是编程中约定的一个"可选值":例如QQ的在线状态,分别有 在线,Q我吧,隐身,忙碌等等...我觉得这就是一个枚举. 1.普通枚举 1) 实例 public en ...
- MySQL触发器 Update触发Insert失败
今天工作需要,想要实现将仅对状态更新的表进行历史记录显示,于是考虑在原表中建立触发器,将更新的内容同时写入另一张表 于是进行测试 --建立测试表CREATE TABLE `triggletest_tr ...
- C++实现设计模式之 — 简单工厂模式
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4251756.html 所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字 ...
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码(转)
OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...
- mysql删除、修改字段默认值
alter table表名alter column字段名drop default; (若本身存在默认值,则先删除) alter table 表名 alter column 字段名 set defaul ...