熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

PHP網絡開發詳解:SQL注入漏洞[1]

2013-11-15 12:42:58  來源: PHP編程 
    ——此文章摘自《完全手冊PHP網絡開發詳解》定價 特價 詳細>>http://tracklinktechcn/?m_id=dangdang&a_id=A&l=&l_type= width= height= border= nosave>

    SQL注入是網絡攻擊的一種常見手法攻擊者通過對頁面中的SQL語句進行拼組來獲得管理賬號密碼及更多的其他信息這種攻擊方法對於網站的危害是非常大的

    SQL注入攻擊的一般方法

    以下代碼是一個簡單的數據輸出頁面該頁面通過從浏覽器地址欄獲得參數來顯示相應的內容
    <?php
    $id = $_GET[id];                    //獲得參數
    $sql = SELECT * FROM posts WHERE postid = $id;        //定義SQL
    mysql_connect(localhost root);           //連接服務器
    mysql_select_db(guestbook);                    //連接數據庫
    $rs = mysql_query($sql);                     //執行SQL
    if(mysql_numrows($rs))                     //如果記錄存在則輸出
    {
        $row_rs = mysql_fetch_assoc($rs);
        echo TOPIC: $row_rs[topic]<br>;
    }
    else               //否則提示錯誤
    {
        echo Record not found!;
    }
    ?>

    上面的代碼通過獲得id參數的值來進行數據查詢並在頁面上顯示相應的數據信息如果數據無法從數據庫中找到則顯示相應的錯誤信息例如從浏覽器上訪問http:/// bugs/egphp?id=可以獲得如下結果
    Topic: This is a test!!

    這裡SQL注入的方法是通過對id參數的賦值來構造一個用戶自定義的SQL語句給程序執行來實現的例如從浏覽器上訪問http:///bugs/egphp?id= and =仍然可以看到上面的結果但是此時程序實際上執行的SQL語句如下所示
    SELECT * FROM posts WHERE postid = and =

    可以看出由於程序簡單地將id參數放置在SQL語句中實際上程序已經允許用戶自由地運行SQL語句了從浏覽器上訪問http:///bugs/egphp?id= and =可以看到頁面的運行結果如下所示
    Record not found!

    這是因為程序執行了如下的SQL語句致使記錄沒有成功返回而造成的
    SELECT * FROM posts WHERE postid = and =

    有了這一基礎就可以通過猜測存儲管理員的用戶名和密碼的表名和列名來對網站進行SQL注入攻擊了例如當前用於存儲管理員用戶的數據表名為admin在浏覽器上訪問http:///bugs/egphp?id= and (select length(adminname) from admin limit )>可以使PHP程序對admin表進行查詢並獲得當前用於存儲管理員賬號和密碼的列名如果上面的訪問可以使頁面內容正常顯示則說明猜測正確實際上上面的訪問執行了下面的SQL語句

right>[]  [http://developcsaicn/web/htm>]  


From:http://tw.wingwit.com/Article/program/PHP/201311/21468.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.