2012-07-06 67 views
0

我基本上是把用戶的輸入,存儲在一個MySQL數據庫中,然後輸出給同一個用戶和其他用戶。在PHP中安全的最佳方法?

現在,我申請到mysql_real_escape_string()由用戶輸入的所有的東西,每當東西呼應(然後通過AJAX顯示給用戶),我申請htmlspecialchars()

這樣好嗎?有更好的嗎?我想要一個簡單,安全的解決方案,保持文本清潔。最好是,我還想在之前保證文本進入數據庫,因爲這裏的一致性對我很重要。

謝謝!

+4

開始查看PDO – 2012-07-06 00:16:32

+2

請查看右邊「相關」列表中的一些問題。希望他們能解決你的擔憂。 – 2012-07-06 00:18:08

+0

保羅 - 我寧願使用更簡單,更熟悉的東西,但我會研究它。奧利 - 我做過了,但我認爲我的情況更具體,因爲我想在輸入數據庫之前完全過濾輸入。我基本上希望它以純文本形式存儲,並刪除了xss和注入威脅。 – Gus 2012-07-06 00:21:20

回答

2

如果您的意思是「乾淨」,如「安全」htmlspecialchars()是相當好的。您可能想要使用htmlentities(),它將編碼所有字符,而不僅僅是特殊字符。

某些字符得到htmlentities()htmlspecialchars()(那些不是Latin1的),因此您可能需要「UTF-8證明」您的輸出。您可以在PHP文檔上使用我在a comment上找到的這個函數。

// Unicode-proof htmlentities. 
// Returns 'normal' chars as chars and weirdos as numeric html entites. 
function superentities($str){ 
    // get rid of existing entities else double-escape 
    $str = html_entity_decode(stripslashes($str),ENT_QUOTES,'UTF-8'); 
    $ar = preg_split('/(?<!^)(?!$)/u', $str); // return array of every multi-byte character 
    foreach ($ar as $c){ 
     $o = ord($c); 
     if ((strlen($c) > 1) || /* multi-byte [unicode] */ 
      ($o <32 || $o > 126) || /* <- control/latin weirdos -> */ 
      ($o >33 && $o < 40) ||/* quotes + ambersand */ 
      ($o >59 && $o < 63) /* html */ 
     ) { 
      // convert to numeric entity 
      $c = mb_encode_numericentity($c,array (0x0, 0xffff, 0, 0xffff), 'UTF-8'); 
     } 
     $str2 .= $c; 
    } 
    return $str2; 
} 

至於逃跑,當它進入數據庫的數據,您可以插入到數據庫前應用ヶ輛。然後,當你輸出時,你可以再次做好測量,但一定不要加倍編碼否則你將無法讀取任何東西。這是一個例子。

//Decode existing htmlentities 
$OutputStringRaw = html_entity_decode(stripslashes($str),ENT_QUOTES,'UTF-8'); 

//Now you can apply htmlentities (or wtv else) w/o fear of double encoding. 
$OutputStringClean = htmlentities($OutputStringRaw); 

但實際上,這是最好的只是留在數據庫中的條目沒有HTML逃逸。當你插入你的數據時,可以使用PDO(這裏是an ok tutorial),或者繼續使用你一直使用的mysql_real_escape_string。

-1

您可以在輸入數據庫之前使用md5加密來保護文本。但是現在使用md5散列並不是很安全,它是可解密的。如果有人訪問你的數據庫,他們將能夠解密密碼。你可以使用我認爲是非常好的加密方法的bcrypt。