php表單提交中sql提防注入攻擊二

        上一篇文章我們講到了基本的sql注入攻擊的概念問題,想必有很多人會基本瞭解到了我們的用戶是如何做到sql注入攻擊的,以及我們表單設計將會變得很複雜嗎?這一篇我們將會真正瞭解我們前端設計人員的艱辛,僅僅是一個表格的提交,但是我們設計人員卻是要付出很多辛苦的,而此篇所講僅僅只是sql注入攻擊,對於很多漏洞以及本身系統的bug所帶來的危害,我們能做多少呢?這個下次再聊吧!!
       上一節我們知道了基本概念,和一種最爲簡單的解決辦法就是防止用戶使用一些非法字符,但是僅僅如此就可以了嗎?下面我們最爲深層次瞭解一些更爲重要的sql注入攻擊,希望對大家有所幫助!!
       如果我們的用戶是一名高級程序員,他會深知一些別人不知道信息,比如GET,SESSION這些php自帶的大數組,他們會給我們的程序員帶來很多方便的操作,但是一旦這些數據落入到我們的用戶手中,結果會變成什麼呢?
   
 防止用戶操縱 GET 變量
     我們看下面一段簡單代碼:
<?php
$pid = $_GET[’pid’];
//we create an object of a fictional class Page
$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page
?>
這段代碼是從用戶的url下捕獲到用戶想要進入的pid新網頁,並且進行動態生成新的網頁。嘻嘻 我們的用戶會非常乖地看着他們url這麼正常地跳轉嗎?我不知道,你也不知道,如果當時的url是這樣的www.XXXX.com/template.php?pid=33 這個時候網速不太好了,網頁就是刷不出來,我們的用戶看到後面寫了33,一時間興趣來了,將pid=33,改成了pid=331怎麼辦,有些人當然明白這樣會跳到指定網頁或者網頁不存在提示錯誤,而這一切的前提都是在我們的用戶還不知道我們的後臺文件存儲是如何做的情況下,或者說我們的用戶還是不夠聰明不能造成語意上的攻擊,可是如果一個高手來了,輸入別的東西,比如輸入 SQL 命令或某個文件的名稱(比如 /etc/passwd),或者搞別的惡作劇,比如輸入長達 3,000 個字符的數值,那麼會發生什麼呢?
在這種情況下,要記住基本規則,不要信任用戶輸入。應用程序開發人員知道 template.php 接受的個人標識符(PID)應該是數字,所以可以使用 PHP 的 is_numeric() 函數確保不接受非數字的 PID

    接下來我們接着再看一段代碼,這段代碼所蘊含的sql的注入攻擊可能比較高明,一看至少是一些程序員在做的事情。

    防止表單遠程提交

<?php
if ($_POST[’submit’] == “go”){
//strip_tags
$name = strip_tags($_POST[’name’]);
$name = substr($name,0,40);
//clean out any potential hexadecimal characters
$name = cleanHex($name);
//continue processing….
}

function cleanHex($input){
$clean = preg_replace(”![\][xX]([A-Fa-f0-9]{1,3})!”, “”,$input);
return $clean;
}
?>
<form action=”<?php echo $_SERVER[’PHP_SELF’];?>” method=”post”>
<p><label for=”name”>Name</label>
<input type=”text” name=”name” id=”name” size=”20″ maxlength=”40″/></p>
<input type=”hidden” name=”table” value=”users”/>
<input type=”hidden” name=”action” value=”create”/>
<input type=”hidden” name=”status” value=”live\”/>
<p><input type=”submit” name=”submit” value=”go”/></p>
</form>

     注意,隱藏變量之一暴露了表名:users。還會看到一個值爲 create 的 action 字段。只要有基本的 SQL 經驗,就能夠看出這些命令可能控制着中間件中的一個 SQL 引擎。想搞大破壞的人只需改變表名或提供另一個選項,比如 delete。

現在還剩下什麼問題呢?遠程表單提交。

Web 的好處是可以分享信息和服務。壞處也是可以分享信息和服務,因爲有些人做事毫無顧忌。

     以 表單爲例。任何人都能夠訪問一個 Web 站點,並使用瀏覽器上的 File > Save As 建立表單的本地副本。然後,他可以修改 action 參數來指向一個完全限定的 URL(不指向 formHandler.php,而是指向 http://www.yoursite.com/formHandler.php,因爲表單在這個站點上),做他希望的任何修改,點擊 Submit,服務器會把這個表單數據作爲合法通信流接收。

首先可能考慮檢查 $_SERVER[’HTTP_REFERER’],從而判斷請求是否來自自己的服務器,這種方法可以擋住大多數惡意用戶,但是擋不住最高明的黑客。這些人足夠聰明,能夠篡改頭部中的引用者信息,使表單的遠程副本看起來像是從您的服務器提交的。

處理遠程表單提交更好的方式是,根據一個惟一的字符串或時間戳生成一個令牌,並將這個令牌放在會話變量和表單中。提交表單之後,檢查兩個令牌是否匹配。如果不匹配,就知道有人試圖從表單的遠程副本發送數據。

     要創建隨機的令牌,可以使用 PHP 內置的 md5()、uniqid() 和 rand() 函數,具體的使用還希望大家可以多參考一下php文檔和相關資料,希望我們可以共同進步


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章