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

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

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

    SELECT * FROM posts WHERE postid = and (select length(adminname) from admin
        limit )>

    就這樣通過對數據庫字段長度的邏輯判斷獲得了存儲管理員賬號和密碼的表名和列名下一步就可以通過對管理員賬號和密碼的每個字符的ASCII碼的判斷來獲得管理員賬號了例如當前管理員的賬號為admin在浏覽器上訪問http:///bugs/egphp?id= and (select ascii(substr(adminname)) from admin limit )=可以使網頁正常顯示這是因為當前管理員賬號為admin通過使用ascii函數和substr函數來獲取第一個字母的ASCII碼為 當SQL中的邏輯成立時頁面就可以正常地顯示了

    漏洞防護措施

    前面所述的攻擊方法雖然很煩瑣但是只要有充足的時間完全可以通過前面所示的PHP代碼來獲取管理員的賬號和密碼並對網站數據進行修改解決這一問題的方法很簡單就是對通過地址欄傳入的參數的值進行判斷或者格式化處理如以下代碼所示
    <?php
    $id = (int)$_GET[id];         //通過對id參數進行數據類型轉換過濾掉非法SQL字符
    $sql = SELECT * FROM posts WHERE postid = $id;//定義SQL
    echo SQL: $sql<br>;                       //輸出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!;
    }
    ?>

    上面的代碼首先將傳入的參數的值轉換為整型數據然後再放入SQL語句中執行這一簡單的舉措可以將地址欄中的非數字字符全部過濾掉大大增強了系統的安全性

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


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