php如何防sql注入,PHP如何防止SQL注入

2021-10-25 21:57:27 字數 1741 閱讀 6364

一、 引言

php是一種力量強大但相當容易學習的伺服器端指令碼語言,即使是經驗不多的程式設計師也能夠使用它來建立複雜的動態的web站點,

然後,我們討論php指令碼實現中的普遍存在的脆弱性。我們將解釋如何保護你的指令碼免於sql注入,防止跨站點指令碼化和遠端執行,並且阻止對臨時檔案及會話的」劫持」。

二、 什麼是sql注入

如果你打算永遠不使用某些資料的話,那麼把它們儲存於乙個資料庫是毫無意義的;因為資料庫的設計目的是為了方便地訪問和運算元據庫中的資料。但是,如果只是簡單地這樣做則有可能會導致潛在的災難。這種情況並不主要是因為你自己可能偶然刪除資料庫中的一切;而是因為,當你試圖完成某項」無辜」的任務時,你有可能被某些人所」劫持」-使用他自己的破壞性資料來取代你自己的資料。我們稱這種取代為」注入」。

其實,每當你要求使用者輸入構造乙個資料庫查詢,你是在允許該使用者參與構建乙個訪問資料庫伺服器的`命令。一位友好的使用者可能對實現這樣的操作感覺很滿意;然而,一位惡意的使用者將會試圖發現一種方法來扭曲該命令,從而導致該被的扭曲命令刪除資料,甚至做出更為危險的事情。作為乙個程式設計師,你的任務是尋找一種方法來避免這樣的惡意攻擊。

三、 sql注入工作原理

構造乙個資料庫查詢是乙個非常直接的過程。典型地,它會遵循如下思路來實現。僅為說明問題,我們將假定你有乙個葡萄酒資料庫**」wines」,其中有乙個欄位為」variety」(即葡萄酒型別):

1. 提供乙個表單-允許使用者提交某些要搜尋的內容,php如何防止sql注入》(讓我們假定使用者選擇搜尋型別為」lagrein」的葡萄酒。

2. 檢索該使用者的搜尋術語,並且儲存它-通過把它賦給乙個如下所示的變數來實現:

$variety = $_post['variety'];

因此,變數$variety的值現在為:

lagrein

3. 然後,使用該變數在where子句中構造乙個資料庫查詢:

$query = 「select * from wines where variety=』$variety』」;

所以,變數$query的值現在如下所示:

select * from wines where variety=』lagrein』

4. 把該查詢提交給mysql伺服器。

5. mysql返回wines**中的所有記錄-其中,欄位variety的值為」lagrein」。

到目前為止,這應該是乙個你所熟悉的而且是非常輕鬆的過程。遺憾的是,有時我們所熟悉並感到舒適的過程卻容易導致我們產生自滿情緒。現在,讓我們再重新分析一下剛才構建的查詢。

1. 你建立的這個查詢的固定部分以乙個單引號結束,你將使用它來描述變數值的開始:

$query = 」 select * from wines where variety = 『」;

2. 使用原有的固定不變的部分與包含使用者提交的變數的值:

$query .= $variety;

3. 然後,你使用另乙個單引號來連線此結果-描述該變數值的結束:

$ query .= 「『」;

於是,$query的值如下所示:

select * from wines where variety = 『lagrein』

這個構造的成功依賴使用者的輸入。在本文示例中,你正在使用單個單詞(也可能是一組單詞)來指明一種葡萄酒型別。因此,該查詢的構建是無任何問題的,並且結果也會是你所期望的-乙個葡萄酒型別為」lagrein」的葡萄酒列表。現在,讓我們想象,既然你的使用者不是輸入乙個簡單的型別為」lagrein」的葡萄酒型別,而是輸入了下列內容(注意包括其中的兩個標點符號):

lagrein』 or 1=1;

PHP防SQL注入

php防sql注入攻擊 收藏 沒有太多的過濾,主要是針對php和mysql的組合。一般性的防注入,只要使用php的 addslashes 函式就可以了。以下是一段copy來的 php post sql injection post get sql injection get function sql...

PHP防SQL注入

php防sql注入攻擊 收藏 沒有太多的過濾,主要是針對php和mysql的組合。一般性的防注入,只要使用php的 addslashes 函式就可以了。以下是一段copy來的 php post sql injection post get sql injection get function sql...

php如何防sql注入,php如何預防sql注入

在查詢資料庫時需要防止sql注入 實現的方法 php自帶了方法可以將sql語句轉義,在資料庫查詢語句等的需要在某些字元前加上了反斜線。這些字元是單引號 雙引號 反斜線 與 nul null 字元 推薦學習 php程式設計從入門到精通 string addslashes string str 該函式返...