php防止sql注入示例分析和几种常见攻击正则表达式_php实例

注入漏洞代码和分析

复制代码 代码如下:

<?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()之后,这些矛盾也都可以解决掉了。

时间: 2024-10-22 06:11:09

php防止sql注入示例分析和几种常见攻击正则表达式_php实例的相关文章

Mybatis SQL注入示例的问题

问题描述 Mybatis SQL注入示例的问题 请举个例子,Mybatis怎样会出现SQL注入的问题? 应用$符号有SQL注入的风险,请问下SQL注入怎么实现? 解决方案 select * from table where id= ${id} 如果id是 1 or 1=1 则会查询所有的数据出来. 应该用#代替$ 解决方案二: sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or '1'='1'"这样的语句,有可能入侵参数校

LuManager 高危SQL注入0day分析

本文讲的是 LuManager 高危SQL注入0day分析,2015年9月7日阿里云盾态势感知系统捕获到LuManager系统的0day一枚,经证实,该漏洞一旦被黑客利用可直接以最高权限登陆后台,上传webshell, 控制系统数据库.操作虚拟主机,后果不堪设想. 阿里云安全攻防对抗团队在第一时间通知厂商,厂商迅速响应,于8日上午发布安全更新并致谢阿里云安全. 在此次事件过程中,正是基于云盾态势感知系统灵敏的漏洞捕获能力.阿里云与厂商的快速沟通响应以及厂商负责任的态度,得以保证了阿里云用户不受该

LuManager高危SQL注入0day分析

2015年9月7日阿里云盾态势感知系统捕获到LuManager系统的0day一枚,经证实,该漏洞一旦被黑客利用可直接以最高权限登陆后台,上传webshell, 控制系统数据库.操作虚拟主机,后果不堪设想. 作者:云盾攻防对抗团队 - 千霄 LuManager是一种基于FreeBSD.Zijidelu.Debian.Centos.Ubuntu等Linux/Unix系统的网站服务器管理软件,目前有大量国内用户使用.云盾攻防对抗团队捕获0day后第一时间通知厂商,厂商迅速响应,于8日上午发布安全更新并

Joomla 3.4.3版本 SQL注入漏洞分析

0x00 漏洞分析 漏洞触发的代码位于:/administrator/components/com_contenthistory/models/history.php,getListQuery()函数内: 通过SQL及报错信息,可以知道我们的注入payload被插入到了红色框部分内.跟进getState()函数,位于libraries/legacy/model/legacy.php文件内,代码如下: 从函数参数和官方注释,可以知道,getState()函数功能是获取一个model的属性及属性对应

Wordpress4.2.3提权与SQL注入漏洞分析

这是这几天一直关注的漏洞了,wordpress上个礼拜发布的4.2.4版本,其中提到修补了可能存在的SQL漏洞和多个XSS. Check point也很快发出了分析,我也来分析与复现一下最新的这个漏洞.   0x01 GP混用造成的越权漏洞 首先,说明一下背景.wordpress中用户权限分为订阅者.投稿者.作者.编辑和管理员. 权限最低的是订阅者,订阅者只有订阅文章的权限,wordpress开启注册后默认注册的用户就是订阅者.国内很多知名网站,如Freebuf,用户注册后身份即为“订阅者”.

php防止sql注入简单分析_php技巧

本文实例分析了php防止sql注入简单方法.分享给大家供大家参考.具体如下: 这里只说一个简单的方法 防止Sql注入的方法有很多,这里要说的其实就是漏洞演练平台Dvwa里的一种方式 直接看high级别的就可以了 $id = $_GET['id']; $id = stripslashes($id); $id = mysql_real_escape_string($id); if (is_numeric($id)){ $getid = "SELECT first_name,last_name FRO

PHP登录中的防止sql注入方法分析

  防止sql注入这些细节问题一般是出现在大意程序员或者是新手程序员了,他们未对用户提交过来的数据进行一些非常过滤从而导致给大家测试一下就攻破了你的数据库了,下面我来简单的一个用户登录未进行安全配置可能出现的sql注入方法,下面一起来看看吧. 比如以下一段登录的代码:  代码如下   if($l = @mysql_connect('localhost', 'root', '123')) or die('数据库连接失败'); mysql_select_db('test'); mysql_set_c

PHP中自带函数过滤sql注入代码分析

    为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes.(php.ini magic_quotes_gpc).如果magic_quotes_gpc选项启用,那么输入的字符串中的单引号,双引号和其它一些字符前将会被自动加 上反斜杠.     但Magic Quotes并不是一个很通用的解决方案,没能屏蔽所有有潜在危险的字符,并且在许多服务器上Magic Quotes并没有被启用.所以,我们还需要使用其它多种

sql注入原理分析与web暴力破解密码代码

如果发生这种方式的sql注入,一定是程序内部使用的sql拼接,并且没有对用户的输入的表单参数过滤或者没有对url参数过滤.      对于sql的拼接,基本上有两种方式:      1,如  sql = "select * from table where id=" + 输入参数;   形式         此种最好防范,只须要对输入参数进行数字验证,如果忽略此处验证,后果也是最严重,就算你对参数进行 单引号过滤,等号过滤,sql关键字过滤 也于事无补.         如果没有数字验