2012-02-25 81 views
4

可能重複:
The ultimate clean/secure function逃逸PHP GET和POST值

我在另一個線程獲悉,這段代碼是相當無用:

function getPost($s) { 
     if (array_key_exists($s, $_POST)) 
      return mysql_real_escape_string(htmlspecialchars($_POST[$s])); 
     else return false; 
    } 


    function getGet($s) { 
     if (array_key_exists($s, $_GET)) 
      return mysql_real_escape_string(htmlspecialchars($_GET[$s])); 
     else return false; 
    } 

燦有人幫助理解爲什麼以及如何讓它變得更好嗎?鏈接或引用也歡迎。

只是想不斷的提高:)

+2

請參閱[最終清潔/安全功能](http://stackoverflow.com/questions/4223980/the-ultimate-clean-secure-function)底線:批發衛生是無用的。在使用數據時對數據進行清理,使用正確的方法。 (沒有什麼能夠說明將衛生系統納入功能的基本思想,但是要編寫更少的代碼。) – 2012-02-25 17:04:30

回答

10

嗯,這是壞的一樣magic_quotes_gpc的是壞的。這是魔法,無論你是否願意,都會逃避一切。相反,處理轉義的地方,你可以改變事情沒有任何問題。所以:

function post($key) { 
    if(array_key_exists($key, $_POST)) { 
     return $_POST[$key]; 
    } 

    return false; 
} 

並做你的逃避需要的地方。否則,事情可能看起來很奇怪,而消除它們將會擊敗這一點。考慮這一點;我在文本框中輸入我的姓氏O'Hara。你想echo它回來,但你使用getPost獲取它。這是我得到的結果:

O \'哈拉

你有沒有再次htmlspecialchars呢?好吧,那麼我得到:

Ø\ ' ARA

什麼的。這發生在我身上很多,而且令人難以置信的煩人 - 請不要這樣做。

+0

嗯,我不會在所有POST值中使用它。這只是在需要時重新使用。無論如何,好的答案。謝謝 – jribeiro 2012-02-25 17:13:04

6

我不會說沒用,只是有點誤導。在使用它之前,您應該立即進行轉義,並且需要轉義。例如,如果你想將值發送回瀏覽器,你可以這樣做:

echo htmlspecialchars($_GET['name']); 

但是,如果你想將它發送到數據庫,你可以這樣做:

mysql_query(... 'INSERT INTO users VALUES ("'.mysql_real_escape_string($_GET['name']).'")'); 

與您你可以用它來解決你的問題。如果你這樣做:

echo getGet('name'); 

你打算輸出一個MySQL轉義字符串,而不是實際的名稱。

+1

該SQL插入查詢看起來有點醜陋.... – itachi 2012-02-25 17:15:39

+2

也使用'mysqli'或'PDO',而不是'mysql_'的擴展名。並使用預準備語句,而不是'mysql * _real_escape_string'。 – 2014-06-06 02:42:54