PHP防sql注入方法总结分析

1、php提交数据过滤的基本原则 

1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就搞定了。其实在涉及到变量取值时,intval()函数对字符串的过滤也是个不错的选择。

2)在php.ini中开启magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以把get,post,cookie里的引号变为斜杠。magic_quotes_runtime对于进出数据库的数据可以起到格式话的作用。其实,早在以前注入很疯狂时,这个参数就很流行了。

 代码如下 复制代码

<?
if ( isset($_POST["f_login"] ) )
{
  // 连接数据库...
  // ...代码略...
 
  // 检查用户是否存在
  $t_strUname = $_POST["f_uname"];
  $t_strPwd = $_POST["f_pwd"];
  $t_strSQL = "SELECT * FROM tbl_users WHERE username='$t_strUname' AND password = '$t_strPwd' LIMIT 0,1";

  if ( $t_hRes = mysql_query($t_strSQL) )
  {
    // 成功查询之后的处理. 略...
  }
}
?>

<html><head><title>sample test</title></head>
<body>
<form method=post action="">
  Username: <input type="text" name="f_uname" size=30><br>
  Password: <input type=text name="f_pwd" size=30><br>

  <input type="submit" name="f_login" value="登录">
</form>
</body>

3)在使用系统函数时,必须使用escapeshellarg(),escapeshellcmd()参数去过滤,这样你也就可以放心的使用系统函数。

4)对于跨站,strip_tags(),htmlspecialchars()两个参数都不错,对于用户提交的的带有html和php的标记都将进行转换。比如尖括号"<"就将转化为 "<"这样无害的字符。

 代码如下 复制代码
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
strip_tags($text,);

5)对于相关函数的过滤,就像先前的include(),unlink,fopen()等等,只要你把你所要执行操作的变量指定好或者对相关字符过滤严密,我想这样也就无懈可击了。

2、PHP简单的数据过滤

1)入库:  trim($str),addslashes($str)
2)出库:  stripslashes($str)
3)显示:  htmlspecialchars(nl2br($str))

一、 注入式攻击的类型

可能存在许多不同类型的攻击动机,但是乍看上去,似乎存在更多的类型。这是非常真实的-如果恶意用户发现了一个能够执行多个查询的办法的话。本文后面,我们会对此作详细讨论。

果你的脚本正在执行一个SELECT指令,那么,攻击者可以强迫显示一个表格中的每一行记录-通过把一个例如"1=1"这样的条件注入到WHERE子句中,如下所示(其中,注入部分以粗体显示):

 代码如下 复制代码

SELECT * FROM wines WHERE variety = 'lagrein' OR 1=1;'

正如我们在前面所讨论的,这本身可能是很有用的信息,因为它揭示了该表格的一般结构(这是一条普通的记录所不能实现的),以及潜在地显示包含机密信息的记录。
一条更新指令潜在地具有更直接的威胁。通过把其它属性放到SET子句中,一名攻击者可以修改当前被更新的记录中的任何字段,例如下面的例子(其中,注入部分以粗体显示):

 代码如下 复制代码

UPDATE wines SET type='red','vintage'='9999' WHERE variety = 'lagrein'

通过把一个例如1=1这样的恒真条件添加到一条更新指令的WHERE子句中,这种修改范围可以扩展到每一条记录,例如下面的例子(其中,注入部分以粗体显示):

 代码如下 复制代码

UPDATE wines SET type='red','vintage'='9999 WHERE variety = 'lagrein' OR 1=1;'

最危险的指令可能是DELETE-这是不难想像的。其注入技术与我们已经看到的相同-通过修改WHERE子句来扩展受影响的记录的范围,例如下面的例子(其中,注入部分以粗体显示):
 

 代码如下 复制代码
DELETE FROM wines WHERE variety = 'lagrein' OR 1=1;'

二、 多个查询注入
多个查询注入将会加剧一个攻击者可能引起的潜在的损坏-通过允许多条破坏性指令包括在一个查询中。在使用MySQL数据库时,攻击者通过把一个出乎意料之外的终止符插入到查询中即可很容易实现这一点-此时一个注入的引号(单引号或双引号)标记期望变量的结尾;然后使用一个分号终止该指令。现在,一个另外的攻击指令可能被添加到现在终止的原始指令的结尾。最终的破坏性查询可能看起来如下所示:
代码如下:

 代码如下 复制代码

SELECT * FROM wines WHERE variety = 'lagrein';
GRANT ALL ON *.* TO 'BadGuy@%' IDENTIFIED BY 'gotcha';'

这个注入将创建一个新的用户BadGuy并赋予其网络特权(在所有的表格上具有所有的特权);其中,还有一个"不祥"的口令被加入到这个简单的SELECT语句中。如果你遵循我们在以前文章中的建议-严格限制该过程用户的特权,那么,这应该无法工作,因为web服务器守护程序不再拥有你撤回的GRANT特权。但是从理论上讲,这样的一个攻击可能给予BadGuy自由权力来实现他对你的数据库的任何操作。

下面分享一个自己写的

 代码如下 复制代码

function phpsql_show($str){
 $str = stripslashes($str);
 $str = str_replace("\", "", $str);
 $str = str_replace("/", "/", $str);
 $str = str_replace(" ", " ", $str);
 $str = str_replace(",", ",", $str);
 return $str;
}
function phpsql_post($str){
 $str = stripslashes($str);
 $str = str_replace("|", "|", $str);
 $str = str_replace("<", "<", $str);
 $str = str_replace(">", ">", $str);
 $str = str_replace("&nbsp;", " ", $str);
 $str = str_replace(" ", " ", $str);
 $str = str_replace("(", "(", $str);
 $str = str_replace(")", ")", $str);
 $str = str_replace("`", "`", $str);
 //$str = str_replace("'", "'", $str);
 $str = str_replace('"', """, $str);
 $str = str_replace(",", ",", $str);
 $str = str_replace("$", "$", $str);
 $str = str_replace("", "\", $str);
 $str = str_replace("/", "/", $str);
 return $str;
}
function phpsql_replace($str){
 $str = stripslashes($str);
 $str = str_replace("'", "'", $str);
 return $str;
}

总结一下:

* addslashes() 是强行加;
* mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;
* mysql_escape_string不考虑连接的当前字符集。

dz中的防止sql注入就是用addslashes这个函数,同时在dthmlspecialchars这个函数中有进行一些替换$string = preg_replace(/&((#(d{3,5}|x[a-fA-F0-9]{4}));)/, &1,这个替换解决了注入的问题,同时也解决了中文乱码的一些问题

时间: 2024-10-31 18:07:22

PHP防sql注入方法总结分析的相关文章

实践有效的网站防SQL注入方法(二)

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 姊妹篇"<实践有效的网站防SQL注入(一)>"跟大家交流了防止sql注入的黄金方法,从开发入手,在两个层次解决,我想如果大家按照介绍的步骤都能够做到,我想大家应该能够做到很好的防御效果.但我们说,没有100%的安全,网站的微小功能变动或升级都可能会对全局造成影响,这也就是为什么eesafe网站安全联盟收录的网站

实践有效的网站防SQL注入方法(一)

中介交易 SEO诊断 淘宝客 云主机 技术大厅 几年前,网站中大多数都存在sql注入.sql注入在这几年可以说已经被广大网站管理者所认知,并在搭建网站的时候都能注意到网站防注入这一问题,但为什么我们EeSafe现在收录的网站中,还是有很大一部分存在sql注入问题?我想并不是由于网站站长不知道sql注入的危害(危害我这里就不说了,大家可以去百度等搜索引擎上查找),而是由于网站对于像sql注入这样的问题的防范和发掘不够深造成的,这里我把防范sql的黄金方法和大家交流一下,应该能够在网站防止安全漏洞的

NET防SQL注入方法

SQL语句 利用SqlCommand传参数的方法: string strSQL="SELECT * FROM [user] WHERE user_id=@id";SqlCommand cmd = new SqlCommand();cmd.CommandText = strSQL;cmd.Parameters.Add("@id",SqlDbType.VarChar,20).Value=Request["id"].ToString(); 过滤禁止运行

php 防sql注入方法详解(1/4)

. magic_quotes_gpc = off 时的注入攻击 magic_quotes_gpc = off 是 php教程 中一种非常不安全的选项.新版本的 php 已经将默认的值改为了 on.但仍有相当多的服务器的选项为 off.毕竟,再古董的服务器也是有人用的. 当magic_quotes_gpc = on 时,它会将提交的变量中所有的 '(单引号)."(双号号).(反斜线).空白字符,都为在前面自动加上 .下面是 php 的官方说明:  代码如下: magic_quotes_gpc bo

asp.net防sql注入多种方法与实例代码应用(1/4)

asp教程.net防sql注入多种方法与实例代码应用 清除Request方法的注入问题         static string[] get_sql_a()         {             string Sql_1 = "exec|insert+|select+|delete|update|count|master+|truncate|char|declare|drop+|drop+table|creat+|creat+table";             string

jquery过滤特殊字符&#039;,防sql注入的实现方法_jquery

今天写的代码给项目经理看了下,因为之前没有考虑sql注入的问题,然后在他测试我的code的时候,打了一个"'",然后我的程序就挂了! 于是乎,我在网上找到了一个验证并过滤文本框的jquery! 先上图: PS:这里用@#测试,因为'太小了,都看不清楚了! 具体的jquery代码: <script type="text/javascript" language="javascript"> $(document).ready(functi

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

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

discuz防SQL注入程序代码

discuz 是一套通用的 PHP 社区论坛软件系统,在国内占有大量的用户群体,是做论坛的首选系统,在很早的时候就用 discuz 做论坛系统,感触最深的应该就是论坛的安全问题了,以前使用的时候,经常会有大量的信息进行注入,真是防不胜防. 好在 discuz 系统的更新很迅速,每一次的安全问题很快就得到了更新,而最头疼的问题恐怕就是 sql 的注入了,其实不只 discuz 系统,互联网上进行网络攻击的 SQL 注入是很可怕的,虽然 discuz 系统现有的安全问题已经非常完善了,但因为系统功能

EasyASP v2.2新功能介绍(1):Easp是如何实现防sql注入的

EasyASP终于到v2.2了,目前还在完善手册,群里有很多人问如何使用的问题 ,所以打算在写手册的同时写一些新功能的介绍,方便使用Easp 的童鞋们快速 进入状态.说实话,看到这么多人还在写ASP.还在支持Easp,觉得蛮难得的, 所以也一直没有丢下Easp的开发,还是希望Easp能给最后的ASPer们一点微薄的 帮助. EasyASP v2.2的改动比较大,放弃了不少原来我觉得不好用的方法,当然, 更多的是加入了不少我觉得会用得很哈屁的新功能.这是这个系列的第一篇文章 ,准备讲讲EasyAS