茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1729118 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00080.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

PHP特區 : [教學]在PHP中,寫入SQL語法時,是不是怕碰到單引號(')或是雙引號(")呢?

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[教學]在PHP中,寫入SQL語法時,是不是怕碰到單引號(')或是雙引號(")呢?
事實上PHP團隊都幫我們想好了!
只要你把magic_quotes_gpc設定成On就可以了!
在哪裡設定呢?
請找到你的php.ini
修改如下:
; Magic quotes for incoming GET/POST/Cookie data.
;magic_quotes_gpc = Off
;原本可能是Off低,把他改成像下面這樣On起來就好了!
magic_quotes_gpc = On

而,php.ini中,還有其他類似的「quotes 」功能,順便介紹如下:
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off


最後是Wiki上的說明:
PHP的魔術引號(magic quotes)功能可以自動處理使用者輸入字串中的跳脫字元,有效避免SQL隱碼攻擊(SQL injection),但是因為不是每個使用者的輸入都會寫入到資料庫,處理這些沒有寫入資料庫的字串便浪費了效能。此外不是每個PHP環境都會開啟魔術引號,程式設計時需要便需要對不同的伺服器環境做因應,造成程式設計上的麻煩。魔術引號功能預計將會於PHP 6時取消。
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[教學]magic_quotes 個人實做的解決方案
如果PHP6真的把 magic_quotes 給拿掉的話,我們又要怎麼辦呢!?
事實上,PHP早就提出方案了:
http://php.mirror.camelnetwork.com/manual/hk/function.htmlentities.php
http://php.mirror.camelnetwork.com/manual/hk/function.htmlspecialchars.php
這裡做個示範:
<?php
$str = "A 'quote' is <b>bold</b>";
echo htmlentities($str);
//這裡的輸出會是:「A 'quote' is <b>bold</b>」
echo htmlentities($str, ENT_QUOTES);
//如果單引號宇雙引號都處理的話,輸出會是:「A 'quote' is <b>bold</b>」
?> 

這裡有中文的說明:
http://www.php5.idv.tw/modules.php?mod=books&act=show&shid=577
http://www.php5.idv.tw/modules.php?mod=books&act=show&shid=578
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]PHP防止注入
冷日:前面說到了『magic_quotes_gpc』這個東西,事實上她最重要的功能,是要防止「SQL Injection」這個東西,下面有一篇討論這個的文章。

PHP防止注入
剛剛在測試自己正在寫的小型PHP博客系統的時候,突然想到數據的安全性,於是在留言裡面測試一些特殊字符的時候等字符,發現果然導致數據提交異常。於是在網上搜索mysql防注入的方法,找到3個PHP函數,各個PHP函數的功能差異和使用限制轉載如下,以備忘:

以前還真沒有關注過這面的事情。自己在寫的時候都是用了一個很簡單的函數

PHP代碼
<?php
function escape($str){
    if(function_exists('mysql_escape_string')){
         return mysql_escape_string($str);
    }elseif( function_exists(...real_escape...)){
       //real_escape
    }else{
        if(MAGIC_QUOTER ....判斷){
             return $str
        }else{
            return addslashes($str);
        }
    }
}

但是這篇文章卻告訴我,原來這三個函數的功能各有不同,前兩個我當然知道,但如果沒有加載mysql庫,這兩個功能是都用不上的,當然,現在有PDO的prepare然後setParam當然是很方便,mysqli函數也有這種功能。如果沒有呢?怎麼辦?下面這篇文章告訴你上面三個函數的區別
來源:http://www.akii.org/2009-08/php-in-the-addslashes-mysql_real_escape_string-and-mysql_escape_string-the-difference-between/

SQL注入攻擊是黑客攻擊網站最常用的手段。如果你的站點沒有使用嚴格的用戶輸入檢驗,那麼常容易遭到SQL注入攻擊。SQL注入攻擊通常通過給站點數據庫提交不良的數據或查詢語句來實現,很可能使數據庫中的紀錄遭到暴露,更改或被刪除。

為了防止SQL注入攻擊,PHP自帶一個功能可以對輸入的字符串進行處理,可以在較底層對輸入進行安全上的初步處理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc選項啟用,那麼輸入的字符串中的單引號,雙引號和其它一些字符前將會被自動加 上反斜槓\。

但Magic Quotes並不是一個很通用的解決方案,沒能屏蔽所有有潛在危險的字符,並且在許多服務器上Magic Quotes並沒有被啟用。所以,我們還需要使用其它多種方法來防止SQL注入。

許多數據庫本身就提供這種輸入數據處理功能。例如PHP的MySQL操作函數中有addslashes()、 mysql_real_escape_string()、mysql_escape_string()等函數,可將特殊字符和可能引起數據庫操作出錯的字 符轉義。那麼這三個功能函數之間有什麼卻別呢?下面我們就來詳細講述下。

雖然國內很多PHP程序員仍在依靠addslashes防止SQL注入,還是建議大家加強中文防止SQL注入的檢查。addslashes的問題在 於黑客 可以用0xbf27來代替單引號,而addslashes只是將0xbf27修改為0xbf5c27,成為一個有效的多字節字符,其中的0xbf5c仍會 被看作是單引號,所以addslashes無法成功攔截。

當然addslashes也不是毫無用處,它是用於單字節字符串的處理,多字節字符還是用mysql_real_escape_string吧。

另外對於php手冊中get_magic_quotes_gpc的舉例:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[『lastname』]);
} else {
$lastname = $_POST[『lastname』];
}

最好對magic_quotes_gpc已經開放的情況下,還是對$_POST[』lastname』]進行檢查一下。

再說下mysql_real_escape_string和mysql_escape_string這2個函數的區別:
mysql_real_escape_string 必須在(PHP 4 >= 4.3.0, PHP 5)的情況下才能使用。否則只能用 mysql_escape_string ,兩者的區別是:mysql_real_escape_string 考慮到連接的當前字符集,而mysql_escape_string 不考慮。

總結一下:

* addslashes() 是強行加\;
* mysql_real_escape_string() 會判斷字符集,但是對PHP版本有要求;
* mysql_escape_string不考慮連接的當前字符集。

原文出處:PHP防止注入 - Mouselife——鼠标生活
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|