自己了解php中sql注入一些方法介绍

何为注入?

比如我们在查询数据库的时候,我们通过文章的id号来取出这篇文章的所有信息。那么SQL语句可以这样写:

 代码如下 复制代码

select * from blog where id=5 

id的值通过用户的操作来传递,一般是GET方式,形如read.php?id=5。这样看起来是没有任何问题,但是如果我们稍微改下SQL语句:

 代码如下 复制代码

select * from blog where id=5 or 1=1 

1=1这个是恒等的,那么这条语句就会取出所有的文章。要修改这个只需要改一下GET的传值即可:read.php?id='5 or 1=1';注意这两个单引号...所以最简单的就是我们可以通过直接把参数改为单引号来查看这个链接是否存在注入。当然,非法用户看到所有的文章并不要紧,但是如果这个表是保存账号和密码的呢?

2.如何防范注入?

说到底,防范注入的根本就在于字符的过滤,因为非法用户一般都是通过构造URL来传值的,如果我们过滤了他传进来的非法参数,这非法的SQL语句就不会执行,那么我们也就防止网站被注入!

PHP内置的过滤字符串还是相当不错的,先看看具体代码:

 代码如下 复制代码

function safe($s) 

    if(!get_magic_quotes_gpc()) 

    { 

        if(is_array($s)) 

            foreach($s as $key=>$value) 

                $s[$key] = addslashes($value); 

        else 

            $s=addslashes($s); 

    } 

    return $s; 

 

function html_safe($s) 

    return nl2br(htmlspecialchars(safe($s) )) ; 

如果你不知道上面用到的几个内置函数,也懒了去查手册的话,那我就说下这几个函数:

magic_quotes_gpc这个称为魔术引号,如果这个功能开启,那么当向数据库中插入数据时,魔术引号所做的就是自动对所有的 GET、POST、COOKIE 数据运用 addslashes() 函数。get_magic_quotes_gpc()就是用来获取服务器上这个功能是否开启的:如果开启了,那么直接返回数据;如果没开启,那么手动对参数进行addslashes()转义。这样就可以防止双层转义~

addslashes -- 使用反斜线引用字符串。描述:string addslashes ( string str );返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线()与 NUL(NULL 字符)。 一个使用 addslashes() 的例子是当你要往数据库中输入数据时。例如,将名字 O'reilly 插入到数据库中,这就需要对其进行转义。大多数据库使用 作为转义符:O'reilly。这样可以将数据放入数据库中,而不会插入额外的 。当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 ' 时将使用 ' 进行转义。 

下面的那个htmlspecialchars就是对Html中的字符进行转换,比如说将‘&’转成‘&amp’,,将‘<’转成‘&lt’。nl2br这个是将回车换行转换成<br/>,这个在用户输入评论之类的信息时候用得比较多。

通过上面的几个函数,我们已经可以过滤一些简单的注入了。另外再说几个小的方面:

对于最开始的那个例子,实际上改进的地方很多,比如写成这样看起来应该更规范一些:

 代码如下 复制代码

SELECT * FROM `blog` WHERE `id`='$id' 

对于SQL的关键字我们用大写来表示,对于数据库中的表和字段我们用小写,另外在字段名和表名上加上“·”这个符号(键盘上数字1左边的那个键上),并且在进来的id上我们用单引号引起来。

对于这样的传进来参数是数字类型的,我们可以对$_GET到的值进行强制转换。但我更习惯这样:

 代码如下 复制代码

$id = $_GET['id']*1; //获取文章的id,用来显示文章信息 

if($id == 0){ 

echo "ERROR..."; 

exit(); 

如果一发现传进来的不是数字,那么很大可能性性是存在问题的参数,那么我们直接给出错误提示然后退出就行,这样再省得再去给非法用户执行数据库查询操作了。

最后我们看一下JBlog中的一个处理注入的地方:

includecommon.php的38行

 代码如下 复制代码

if ( !get_magic_quotes_gpc() ) { 

    $_GET = add_slashes($_GET); 

    $_POST = add_slashes($_POST); 

    $_COOKIE = add_slashes($_COOKIE); 

includefunc_global.php的194行

 代码如下 复制代码

//addslashes 

function add_slashes($string) { 

    if (!is_array($string)) return addslashes($string); 

    foreach ($string as $key => $val) { 

        $string[$key] = add_slashes($val); 

    } 

    return $string; 

 

当然,这应该只是一部分,其他的应该也大同小异。

 

时间: 2024-09-08 23:52:09

自己了解php中sql注入一些方法介绍的相关文章

Python中防止sql注入的方法详解

前言 大家应该都知道现在web漏洞之首莫过于sql了,不管使用哪种语言进行web后端开发,只要使用了关系型数据库,可能都会遇到sql注入攻击问题.那么在Python web开发的过程中sql注入是怎么出现的呢,又是怎么去解决这个问题的? 当然,我这里并不想讨论其他语言是如何避免sql注入的,网上关于PHP(博主注:据说是世界上最屌的语言)防注入的各种方法都有,Python的方法其实类似,这里我就举例来说说. 起因 漏洞产生的原因最常见的就是字符串拼接了,当然,sql注入并不只是拼接一种情况,还有

php中$_GET与$_POST过滤sql注入的方法_php技巧

本文实例讲述了php中$_GET与$_POST过滤sql注入的方法,分享给大家供大家参考.具体分析如下: 此函数只能过滤一些敏感的sql命令了,像id=1这种大家还是需要自己简单过滤了. 主要实现代码如下: 复制代码 代码如下: if (!get_magic_quotes_gpc()) { if (!empty($_GET)) { $_GET  = addslashes_deep($_GET); } if (!empty($_POST)) { $_POST = addslashes_deep($

浅析php过滤html字符串,防止SQL注入的方法

本篇文章是对php中过滤html字符串,防止SQL注入的方法进行了详细的分析介绍,需要的朋友参考下   批量过滤post,get敏感数据 复制代码 代码如下: $_GET = stripslashes_array($_GET); $_POST = stripslashes_array($_POST); 数据过滤函数 复制代码 代码如下: function stripslashes_array(&$array) {  while(list($key,$var) = each($array)) {

PHP登录环节防止sql注入的方法浅析_php技巧

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

JS代码防止SQL注入的方法(超简单)_javascript技巧

下面通过两个方面给大家介绍js代码防止sql注入的方法,非常简单实用,感兴趣的朋友参考下吧! 1.URL地址防注入: //过滤URL非法SQL字符 var sUrl=location.search.toLowerCase(); var sQuery=sUrl.substring(sUrl.indexOf("=")+1); re=/select|update|delete|truncate|join|union|exec|insert|drop|count|'|"|;|>

java持久层框架mybatis防止sql注入的方法_java

sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or '1'='1'"这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式. mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手

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

防御SQL注入的方法总结

SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入可以参见:https://en.wikipedia.org/wiki/SQL_injection SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞. 1. 演示下经典的SQL注入 我们看到:select id,no from user where id=2; 如果该语句是通过sql字符串拼接得到的,比如: Strin

php中sql注入漏洞示例

 这篇文章主要介绍了php中sql注入漏洞示例,大家在开发中一定要注意 在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等.这往往给骇客留下了可乘之机.轻则数据遭到泄露,重则服务器被拿下.    一.SQL注入的步骤   a)  寻找注入点(如:登录界面.留言板等)   b)  用户自己构造SQL语句(如:' or 1=1#,后面会讲解)   c)  将sql语句发送给数据库管理系统(DBMS)