web常见攻击五--sql注入(sql Injection)

我是在dvwa(Damn Vulnerable Web App)上学到的这些东西,我把dvwa安装在了我的免费空间上,有兴趣的可以看看。DVWA

想要用户名和密码的可以联系我:sq371426@163.com

dvwa 用的验证是google提供的,详情见google CAPCTHE

SQL注入,简而言之,就是攻击者在输入字符串中注入sql语句,在设计不良的程序中忽略了检查,那么这些被注入的sql指令就被数据库服务器当做正常的sql语句运行,从而造成攻击。

下面以输入id查询用户为例,简述sql语句攻击。点击这里查看实例

来看下面这段代码

<?php     

if(isset($_GET['Submit'])){ 
     
    // Retrieve data 
     
    $id = $_GET['id']; 

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 
    $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); 

    $num = mysql_numrows($result); 

    $i = 0; 

    while ($i < $num) { 

        $first = mysql_result($result,$i,"first_name"); 
        $last = mysql_result($result,$i,"last_name"); 
         
        echo '<pre>'; 
        echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; 
        echo '</pre>'; 

        $i++; 
    } 
} 
?>

初学者都会写这样的代码,能够实现基本功能,在正常情况下没有任何问题。可是无法防止sql注入,因为没有对数据进行任何过滤处理。

下面这这段代码修复了这个漏洞

<?php 

if (isset($_GET['Submit'])) { 

    // Retrieve data 

    $id = $_GET['id']; 
    $id = mysql_real_escape_string($id); 

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id"; 

    $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); 
     
    $num = mysql_numrows($result); 

    $i=0; 

    while ($i < $num) { 

        $first = mysql_result($result,$i,"first_name"); 
        $last = mysql_result($result,$i,"last_name"); 
         
        echo '<pre>'; 
        echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; 
        echo '</pre>'; 

        $i++; 
    } 
} 
?>

这段代码对用mysql_real_escape_string对数据进行了过滤,保证没有异常sql符号。一般情况下这样就可以了,可是前面我们说这是用id来查询用户,id肯定是数字了,我们是否要对数字本身也进行验证呢,答案是肯定的。“

我们来看更安全的程序

<?php     

if (isset($_GET['Submit'])) { 

    // Retrieve data 

    $id = $_GET['id']; 
    $id = stripslashes($id); 
    $id = mysql_real_escape_string($id); 

    if (is_numeric($id)){ 

        $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 
        $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); 

        $num = mysql_numrows($result); 

        $i=0; 

        while ($i < $num) { 

            $first = mysql_result($result,$i,"first_name"); 
            $last = mysql_result($result,$i,"last_name"); 
             
            echo '<pre>'; 
            echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; 
            echo '</pre>'; 

            $i++; 
        } 
    } 
} 
?>

不仅对对数据进行了过滤,还对id进行了是否是数字进行了验证,这样就可以有效防止sql注入了。

当然这只是一中特殊情况,还有很多各种各样的sql注入攻击形势,推荐几篇好的sql注入文章

血腥!实况转播SQL注入全过程,让你知道危害有多大。

http://www.php.net/manual/zh/security.database.sql-injection.php

广告


JackSun

JackSun

I'm a coder.

You may also like...

No Responses

  1. 康香伯 says:

    顶起来!!不好碰到的好文章

Leave a Reply

Your email address will not be published.