2013-05-31 88 views
-1

我的mysql_real_escape_string PHP文檔頁面上閱讀此評論:逃逸cookie值以防止SQL注入

也不要忘記查詢數據庫之前轉義$ _COOKIE數組。在Firefox中,您可以編輯Cookie並插入並注入有害的SQL查詢。

<?php 
    foreach ($_COOKIE as $key => $value) { 
    if(get_magic_quotes_gpc()) $_COOKIE[$key]=stripslashes($value); 
    $_COOKIE[$key] = mysql_real_escape_string($value); 
    } 
?> 

我是正確的思維我只有這樣做,如果我在查詢中使用這些cookie值?因此,如果沒有sql語句使用這些cookie的值,那麼不需要像上面那樣轉義cookie?

我使用的mysql_query不準備語句(該公司所有室內代碼我與用途的mysql_query工作)

+0

這將是一個毫無意義的操作。 strip_slashes和mysql_real_escape_string是** NOT **彼此反轉,並且此代碼可能會雙/三/.../ N次轉義數據,每次運行。您只能在查詢中立即使用/引用要立即使用的數據,而不是「可能稍後」,然後您不會用引用的版本覆蓋原始數據。 –

回答

2

你只需要一次記住這個概念:當您連接一個字符串轉換成一個特殊的文本格式,需要根據在級聯的時刻,格式逃脫它。價值從何而來並不重要。在連接它們之前或之後,您不會將值轉義,但當您做時。你不會僅僅因爲掩蓋逃脫你的cookie值。當你將它放入SQL查詢的時候,你就想逃避一個值。餅乾沒有特殊情況;提醒需要在那裏已經夠難過了。

您的代碼始終是:

$sql = sprintf("SELECT ... WHERE foo = '%s'", mysql_real_escape_string($var)); 

這不是:

$var = mysql_real_escape_string($var); 

// 100 lines of irrelevant code 

$sql = "SELECT ... WHERE foo = '$var'"; 

The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

0

難道我就在思考我只有當我在使用這些cookie的 值做到這一點查詢?因此,如果沒有sql語句使用來自這些 cookie的值,那麼不需要像上面那樣轉義cookie?

是的,當然;)

我使用的mysql_query不準備語句(所有 點播服務公司代碼,我與用途的mysql_query工作)

嘗試進行遷移準備語句與PDO或mysqli

如果您無法遷移:請注意,您必須建立mysql連接之前你叫mysql_real_escape_string()!這是因爲該函數使用當前的連接編碼來正確地轉義字符串。如果您之後連接,則轉義可能是錯誤的。

2

我是否正確思考我只需要這樣做,如果我在查詢中使用這些cookie值?

是...... ish。

你不應該用只適合填充MySQL查詢的數據覆蓋超全局變量。在最後一刻和本地變量中進行轉義。

無論如何還有better ways to defend against SQL injection然後變量轉義。

我使用的mysql_query不準備語句(所有公司室內代碼我與用途的mysql_query工作)

我建議首先遷移過程。如果您想要升級到未包含已廢棄庫的未來版本的PHP,則必須一次性完成所有操作,這樣做會更輕鬆。

1
  1. 是的,你是正確的,這只是在數據庫查詢中使用它們時才需要的。
  2. 不,你絕對不應該在全球做全部餅乾。
  3. 不,你不應該在SQL查詢中連接cookie值,使用預準備語句。
  4. mysql_real_escape_string已棄用其整個家庭的mysql_功能自PHP 5.5以來。改爲使用PDO或MySQLi。並使用它們的準備語句來刪除有關SQL注入的所有疑慮。
  5. 您可以編輯的Cookie,每瀏覽器,而不僅僅是Firefox。
0

這個提醒是告訴你,即使你自己設置它們,你也不能相信你從cookies獲得的值,因爲任何人都可以改變它們。所以,是的。

當然,你不應該使用mysql_函數和所有這些,但我認爲你知道(也必須在較舊的應用程序中使用它們)。