php安全之防注入详细介绍

那么我们如果在我们提交的数据中进行过滤是不是能够避免这些问题呢?
于是我们使用正则就构建如下函数:

 代码如下 复制代码

/*
函数名称:inject_check()
函数作用:检测提交的值是不是含有SQL注射的字符,防止注射,保护服务器安全
参 数:$sql_str: 提交的变量
返 回 值:返回检测结果,ture or false
函数作者:heiyeluren
*/

function inject_check($sql_str) 

     return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str);    // 进行过滤 

 } 

 

我们函数里把 select,insert,update,delete, union, into, load_file, outfile /*, ./ , ../ , ' 等等危险的参数字符串全部过滤掉,那么就能够控制提交的参数了,程序可以这么构建:

 代码如下 复制代码

<?php 

if (inject_check($_GET['id'])) 

     exit('你提交的数据非法,请检查后重新提交!'); 

else 

    $id = $_GET['id']; 

    echo '提交的数据合法,请继续!'; 

?> 

假设我们提交URL为:a.php?id=1,那么就会提示:
"提交的数据合法,请继续!"
如果我们提交 a.php?id=1%27 select * from tb_name
就会出现提示:"你提交的数据非法,请检查后重新提交!"

那么就达到了我们的要求。

但是,问题还没有解决,假如我们提交的是 a.php?id=1asdfasdfasdf 呢,我们这个是符合上面的规则的,但是呢,它是不符合要求的,于是我们为了可能其他的情况,我们再构建一个函数来进行检查:

 代码如下 复制代码

/*
函数名称:verify_id()
函数作用:校验提交的ID类值是否合法
参 数:$id: 提交的ID值
返 回 值:返回处理后的ID
函数作者:heiyeluren
*/

function verify_id($id=null) 

   if (!$id) { exit('没有提交参数!'); }    // 是否为空判断 

   elseif (inject_check($id)) { exit('提交的参数非法!'); }    // 注射判断 

   elseif (!is_numeric($id)) { exit('提交的参数非法!'); }    // 数字判断 

   $id = intval($id);    // 整型化 

  

   return  $id; 

呵呵,那么我们就能够进行校验了,于是我们上面的程序代码就变成了下面的:

<?php 

if (inject_check($_GET['id'])) 

     exit('你提交的数据非法,请检查后重新提交!'); 

else 

    $id = verify_id($_GET['id']);    // 这里引用了我们的过滤函数,对$id进行过滤 

    echo '提交的数据合法,请继续!'; 

?> 

好,问题到这里似乎都解决了,但是我们有没有考虑过post提交的数据,大批量的数据呢?
比如一些字符可能会对数据库造成危害,比如 ' _ ', ' % ',这些字符都有特殊意义,那么我们如果进行控制呢?还有一点,就是当我们的php.ini里面的magic_quotes_gpc = off 的时候,那么提交的不符合数据库规则的数据都是不会自动在前面加' '的,那么我们要控制这些问题,于是构建如下函数:

 代码如下 复制代码

/*
函数名称:str_check()
函数作用:对提交的字符串进行过滤
参 数:$var: 要处理的字符串
返 回 值:返回过滤后的字符串
函数作者:heiyeluren
*/

function str_check( $str ) 

   if (!get_magic_quotes_gpc())    // 判断magic_quotes_gpc是否打开 

   { 

      $str = addslashes($str);    // 进行过滤 

 } 

     $str = str_replace("_", "_", $str);    // 把 '_'过滤掉 

     $str = str_replace("%", "%", $str);    // 把' % '过滤掉 

    

   return $str;  

OK,我们又一次的避免了服务器被沦陷的危险。

最后,再考虑提交一些大批量数据的情况,比如发贴,或者写文章、新闻,我们需要一些函数来帮我们过滤和进行转换,再上面函数的基础上,我们构建如下函数:

 代码如下 复制代码

/*
函数名称:post_check()
函数作用:对提交的编辑内容进行处理
参 数:$post: 要提交的内容
返 回 值:$post: 返回过滤后的内容
函数作者:heiyeluren
*/

function post_check($post) 

   if (!get_magic_quotes_gpc())    // 判断magic_quotes_gpc是否为打开 

   { 

      $post = addslashes($post);    // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 

   } 

   $post = str_replace("_", "_", $post);    // 把 '_'过滤掉 

   $post = str_replace("%", "%", $post);    // 把' % '过滤掉 

   $post = nl2br($post);    // 回车转换 

   $post= htmlspecialchars($post);    // html标记转换 

  

   return $post; 

时间: 2024-11-03 06:54:43

php安全之防注入详细介绍的相关文章

php通用防注入与注入详细说明

还有服务器和mysql教程也要加强一些安全防范. 对于linux服务器的安全设置: 加密口令,使用"/usr/sbin/authconfig"工具打开密码的shadow功能,对password进行加密. 禁止访问重要文件,进入linux命令界面,在提示符下输入: #chmod 600 /etc/inetd.conf    //改变文件属性为600 #chattr +i  /etc/inetd.conf     //保证文件属主为root #chattr –i  /etc/inetd.c

asp.net使用ODP即oracle连接方式的的防注入登录验证程序

 这篇文章主要介绍了asp.net使用ODP即oracle连接方式的的防注入登录验证程序,需要的朋友可以参考下 网上有很多SQL连接方式的登录验证,但没有oracle连接方式的,我摸索了一上午写了这个可执行的函数,分享给大家 代码如下: // 用户登录检查 public bool LoginCheck(string f_LoginName, string f_LoginPass) { bool result = false; // 正则表达式检查 if (Regex.IsMatch(f_Logi

Linux shell脚本基础学习详细介绍(完整版)

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Linux 脚本编写基础 ◆1.1 语法基本介绍1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可

PHP7 新特性详细介绍_php技巧

PHP 的学习新特性 最近做的项目使用了 php7,但感觉有很多新特性没有用起来.就想总结一下,一些可能会用到的新特性.之前使用的环境是 php5.4,所有也会有 php5.5 和 php5.6 的特性总结进来,这里只列出我觉得在项目中可能用到的特性,主要内容来自 php手册的附录. Generators (PHP 5 >= 5.5.0, PHP 7) 通过添加 yield 关键字支持了 generators,Generators 提供了一个更简单的方法实现迭代器,不需要实现 Iterator

Linux shell脚本基础学习详细介绍(完整版)第1/2页_linux shell

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Linux 脚本编写基础 ◆1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序.当编辑好脚本时,如果要执行该脚本,还必须使其可执行.要使脚本可执行:编译

PDO防注入原理分析以及使用PDO的注意事项总结_php技巧

本文详细讲述了PDO防注入原理分析以及使用PDO的注意事项,分享给大家供大家参考.具体分析如下: 我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下两个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特别注意什么?  一.为何要优先使用PDO? PHP手册上说得很清楚:Prepared statements and stored procedures Many of the more mature d

通俗易懂的php防注入代码_php技巧

介绍两种方法吧,首先请把以下代码保存为safe.php放在网站根目录下,然后在每个php文件前加include("/safe.php");即可 : php防注入代码方法一: 复制代码 代码如下: <?php //要过滤的非法字符 $ArrFiltrate=array("'",";","union"); //出错后要跳转的url,不填则默认前一页 $StrGoUrl=""; //是否存在数组中的值 fu

我的防注入代码没法用

问题描述 <%OnErrorResumeNextDimstrTemphkIfTrim(Request.QueryString)<>""ThenstrTemp=Trim(Request.QueryString)strTemp=LCase(strTemp)hk=0IfInstr(strTemp,"%")<>0thenhk=1IfInstr(strTemp,"count(")<>0thenhk=1IfInstr

SQL防注入

SQL注入实例 1.select语句 通常我们在用户登陆的时候,SQL语句如此写法: $sql=select * from users where userName='{$_POST['unm']} ' 主要是用来检查这个用户是否存在, 如果说我在用户名一栏填上: 1=1 or 1='1' 那么sql语句就变成了: select * from users where userName=1=1 or 1='1'; 你填上去试试看?可以轻松绕过验证,同样密码在输入的时候也可以如此做法 还可以如此填法