注入漏洞代码和分析

代码如下:

<?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()函数设置用户自定义地错误处理函数.函数用于创建运行期间地用户自己地错误处理方法.它需要先创建一个错误处理函数,然后设置错误级别. 

关于地用法:

代码如下:
function customerror($errno, $errstr, $errfile, $errline)

{

  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文件.

代码如下:
function slog($logs)
{
    $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文件.

代码如下:
$exec_commond  = ( \\s|\\s)*(exec(\\s|\\+)+(s|x)p\\w+)(\\s|\\s)*;
$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注入与几种正则表达式讲解的更多相关文章

  1. 预处理(防止sql注入的一种方式)

    <!--- 预处理(预编译) ---><?php/* 防止 sql 注入的两种方式: 1. 人为提高代码的逻辑性,使其变得更严谨,滴水不漏. 比如说 增加判断条件,增加输入过滤等,但 ...

  2. 防止 jsp被sql注入的五种方法

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  3. 防止sql注入的几种方法

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  4. Hibernate使用中防止SQL注入的几种方案

    Hibernate使用中防止SQL注入的几种方案 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数 ...

  5. 网站mysql防止sql注入攻击 3种方法总结

    mysql数据库一直以来都遭受到sql注入攻击的影响,很多网站,包括目前的PC端以及手机端都在使用php+mysql数据库这种架构,大多数网站受到的攻击都是与sql注入攻击有关,那么mysql数据库如 ...

  6. SQL注入的几种类型

    SQL注入就是: 将构造SQL语句来插入到web提交的数据之中,让其返回数据时运行自己构造的恶意SQL语句. SQL注入构造恶意SQL语句的方法有: 构造堆叠,构造闭合,构造报错,构造时间差,等等 S ...

  7. PHP实现防止SQL注入的2种方法

    PHP简单实现防止SQL注入的方法,结合实例形式分析了PHP防止SQL注入的常用操作技巧与注意事项,PHP源码备有详尽注释便于理解,需要的朋友可以参考下! 方法一:execute代入参数 $var_V ...

  8. .net防止SQL注入的一种方式

    首先也要明白一点,什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将 ...

  9. SQL注入的几种有用办法

    一.查询表中包括有多少列: 这里以DISCUZ举例说明,例如以下 select * FROM pre_forum_thread ORDER BY 80 返回,Unknown column '80' i ...

随机推荐

  1. UI4_注册登录界面

    // // ViewController.h // UI4_注册登录界面 // // Created by zhangxueming on 15/7/3. // Copyright (c) 2015年 ...

  2. java mail jar冲突

    开发环境:jdk1.6.0_25     MyEclipse-8.6     J2EE5   程序编译通过,J2EE5的库里面已经含有javaee.jar文件.里面的javax.mail包下面是jav ...

  3. 杭电ACM2097--Sky数

    这题思路很简单,把10,12,16进制数都按位相加,然后进行比较即可. http://acm.hdu.edu.cn/showproblem.php?pid=2097 <span style=&q ...

  4. 10.NFS V4.2

    这里只演示使用keytab,也就是客户端与服务端进行keberos进行安全验证连接(注意时间服务器要同步!如果不同步,Kerberos无法通过验证) server端:192.168.1.109 1.y ...

  5. Android模拟器中安装APK文件(转)

    1.平台环境:Win7系统, 安装Eclipse,android4.0(sdk) 2.随便创建个工程(HelloWorld),结果如下: 3.运行(Run HelloWorld),启动模拟器,如下所示 ...

  6. 删除 mysql (rpm)

    http://blog.csdn.net/love__coder/article/details/6894566 a)查看系统中是否以rpm包安装的mysql [root@linux ~]# rpm  ...

  7. oracle 文件导出

    $ cat me.sqlset echo offset term offset line 1000 pages 0set feedback offset heading offset trimspoo ...

  8. Maven入门指南⑤:使用Nexus搭建Maven私服

    1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...

  9. openerp学习笔记 视图更新时删除已存在的菜单或其他对象

    删除菜单示例: <delete id="base.menu_module_updates" model="ir.ui.menu"/><dele ...

  10. 浅谈 WPF布局

    我们首先来了解一下图形化用户界面(Graphic User Interface)也就是我们常常听到的GUI.举个简单的例子,同样是数据,我们可以用控制台程序加格式控制符等输出,但是这些都不如GUI来的 ...