搜索
熱搜: 活動 交友 discuz
查看: 5630|回復: 0
打印 上一主題 下一主題

[PHP] [PHP]基本的SQL injection防禦 (mysql_real_escape_string, addslashes)

[複製鏈接]
跳轉到指定樓層
1#
發表於 2013-8-30 09:35:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 郭子錢 於 2013-8-30 09:47 編輯

SQL攻擊(SQL injection,中國大陸稱作SQL注入攻擊),簡稱隱碼攻擊,是發生於應用程式之資料庫層的安全漏洞。簡而言之,是在輸入的字串之中夾帶SQL指令,在設計不良的程式當中忽略了檢查,那麼這些夾帶進去的指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞。有部份人認為SQL隱碼攻擊是只針對Microsoft SQL Server而來,但只要是支援批次處理SQL指令的資料庫伺服器,都有可能受到此種手法的攻擊。

本篇文章介紹基本的SQL injection防禦:




一、啟動magic_quotes_gpc

magic_quotes_gpc是PHP內建,一項防禦SQL injection的基本手段,他會自動去將所有透過GET、POST傳值的資訊進行處理,把一些符號(例如單引號、雙引號)加入轉義符號(反斜線),藉此來避免SQL injection的問題,不過magic_quotes_gpc有個缺點就是,如果使用者傳入的資料並非是攻擊字串,可是在開啟magic_quotes_gpc的情況下他仍然會進行處理,這時候就會導致使用者的輸入資料與原本的不同,因此是否要啟動magic_quotes_gpc就看你個人選擇

啟動magic_quotes_gpc方法:

開啟你的php.ini,然後搜尋「magic_quotes_gpc」

把magic_quotes_gpc=off改成magic_quotes_gpc=on

一般預設情況下是開啟的,但小編已從PHP官方得知5.4.0版後就取消此功能!
'This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.'




二、將傳入的資料進行處理

前面講過,因為magic_quotes_gpc會對傳入的資料進行處理,有時候會處理到不該處理的資料,這時候可能會造成困擾,因此有人會將此項功能關閉,如果你把magic_quotes_gpc關閉的話也沒有關係,這裡要介紹兩個PHP的函式,可以做到跟magic_quotes_gpc一樣的效果,只是彈性更大,magic_quotes_gpc會對「所有」GET、POST都做處理,但是這裡介紹的函式是可以指定性的使用的∼

這裡要介紹的兩個函式分別是mysql_real_escape_string跟addslashes,這兩個函式功能相近,只是mysql_real_escape_string的功能更多,他會處理更多資料,而addslashes只會對「單引號、雙引號、反斜線進行處理」,至於要用哪個就看你自己的選擇,另外在使用這兩個函式之前,要先透過get_magic_quotes_gpc這個函式檢查式有有開啟magic_quotes_gpc模式,如果再開啟magic_quotes_gpc的情況下使用這兩個函式,就會造成重複處理,會出問題

兩個函式的使用都是直接將要處理的變數傳進去就可以了,另外get_magic_quotes_gpc的部份,當返回0代表沒有啟動,返回1代表有啟動




範例:
  1. echo '是否有啟動magic_quotes_gpc:' . get_magic_quotes_gpc();
  2. $content='"我"以為';
  3. echo '處理前:' . $content ;
  4. echo '使用mysql_real_escape_string處理:';
  5. echo '結果:' . mysql_real_escape_string($content);
  6. echo '使用addslashes處理:';
  7. echo '結果:' . addslashes($content);
複製代碼



addslashes

返回字符串,該字符串為了數據庫查詢語句等的需要在某些字符前加上了反斜線。這些字符是單引號(')、雙引號(")、反斜線(\)與NUL(NULL 字符)。

一個使用和addslashes()的例子是當你要往數據庫中輸入數據時,例如,將名字O'reilly的插入到數據庫中,這就需要對其進行轉義。強烈建議使用DBMS指定的轉義函數(比如MySQL的是mysqli_real_escape_string()時,PostgreSQL是pg_escape_string()),但是如果你使用的數據庫管理系統沒有一個轉義函數,並且使用\來轉義特殊字符,你可以使用這個函數。僅僅是為了獲取插入數據庫的數據,額外的\並不會插入。當PHP指令magic_quotes_sybase被被設置成上時,意味著插入'時將使用'進行轉義。

PHP5.4之前PHP指令magic_quotes_gpc的的默認是,實際上所有的GET,POST和COOKIE的數據都用被和addslashes()了。不要對已經被magic_quotes_gpc的轉義過的字符串使用和addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函數get_magic_quotes_gpc()進行檢測。

mysql_real_escape_string

This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include:


故不多作介紹。
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2026-5-22 01:16 , Processed in 0.044134 second(s), 16 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表