2012-07-29 48 views
1

可能重複:
Best way to prevent SQL Injection in PHP保存HTML數據庫 - ヶ輛

我的網站上我有一些HTML內容,用戶有時必須數據庫保存。什麼是安全的方式來做到這一點(我不希望我的數據庫處於危險之中,或者稍後會從數據庫中調用該代碼的用戶)。

所以我讀的是:

使用htmlentities在數據庫中的數據保存和html_entity_decode將數據從數據庫中進行解碼。這是否足夠安全,還是應該使用別的東西?

+0

嘛,我不僅對數據庫的擔憂,也用於從數據庫中顯示html。 – SomeoneS 2012-07-29 09:11:53

+0

這是[一個完全不同的問題](http://stackoverflow.com/questions/3129899/what-are-the-common-defenses-against-xss)(以及在將內容插入HTML文檔之前解決的問題,而不是就在將內容插入數據庫之前)。 – Quentin 2012-07-29 09:14:32

回答

5

假設您使用字符串轉義和/或預處理語句,HTML標記不會對您的數據庫造成任何損害。將HTML標記顯示給用戶時,會帶來危險,就像有人向您要顯示的標記中注入了不雅的HTML,然後您的手上就會發生XSS攻擊。

如果您不是在逃避或使用準備好的語句,那麼幾乎所有來自外部的數據都可能是危險的。

+0

我還沒有聽說過「prerpared語句」,但我發現這個函數: 'function make_safe($ variable){ \t $ variable = stripslashes($ variable); $ variable = mysql_real_escape_string(trim($ variable)); \t $ variable = htmlspecialchars($ variable); return $ variable; }' 這是否足夠逃脫? – SomeoneS 2012-07-29 09:10:24

+1

很可怕!不要使用它。 – GordonM 2012-07-29 09:10:59

+0

爲什麼?那麼它應該看起來如何? (我曾用這個代碼清理用戶註冊數據):s – SomeoneS 2012-07-29 09:13:33

0

你可能想看看PHP函數mysql_real_escape_string() ...更多在這個帖子:strip_tags enough to remove HTML from string?

下面是一個例子...

// scrub string ... call with sanitize($blah,1) to allow HTML 
function sanitize($val, $html=0) { 
    if (is_array($val)) { 
     foreach ($val as $k=>$v) $val[$k] = sanitize($v, $html); 
     return $val; 
    } else { 
     $val = trim($val); 
     if (!$html) { 
      $val = strip_tags($val); 
      $pat = array("\r\n", "\n\r", "\n", "\r"); 
      $val = str_replace($pat, '<br>', $val); // newlines to <br> 
      $pat = array('/^\s+/', '/\s{2,}/', '/\s+\$/'); 
      $rep = array('', ' ', ''); 
      $val = preg_replace($pat, $rep, $val); // remove multiple whitespaces 
     } 
     return mysql_real_escape_string($val); // escape stuff 
    } 
} 
+1

你錯了,錯了.. – 2012-07-29 09:05:38

+1

精心製作並且有用 – neokio 2012-07-29 09:08:49

+2

1)mysql_real_escape_string與HTML標記無關,而是確保字符串被正確引用。 2)如果您想清理或去除HTML,請使用正確的工具(htmlentities/htmlspecialchars/strip_tags),並且不要制定您自己的臨時解決方案。 3)mysql_ *已過時,並且在所有名稱中都被棄用。如果你仍然在使用它們,那麼請切換到mysqli或pdo – GordonM 2012-07-29 09:10:28