我基本上是把用戶的輸入,存儲在一個MySQL數據庫中,然後輸出給同一個用戶和其他用戶。在PHP中安全的最佳方法?
現在,我申請到mysql_real_escape_string()
由用戶輸入的所有的東西,每當東西呼應(然後通過AJAX顯示給用戶),我申請htmlspecialchars()
。
這樣好嗎?有更好的嗎?我想要一個簡單,安全的解決方案,保持文本清潔。最好是,我還想在之前保證文本進入數據庫,因爲這裏的一致性對我很重要。
謝謝!
我基本上是把用戶的輸入,存儲在一個MySQL數據庫中,然後輸出給同一個用戶和其他用戶。在PHP中安全的最佳方法?
現在,我申請到mysql_real_escape_string()
由用戶輸入的所有的東西,每當東西呼應(然後通過AJAX顯示給用戶),我申請htmlspecialchars()
。
這樣好嗎?有更好的嗎?我想要一個簡單,安全的解決方案,保持文本清潔。最好是,我還想在之前保證文本進入數據庫,因爲這裏的一致性對我很重要。
謝謝!
如果您的意思是「乾淨」,如「安全」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。
您可以在輸入數據庫之前使用md5加密來保護文本。但是現在使用md5散列並不是很安全,它是可解密的。如果有人訪問你的數據庫,他們將能夠解密密碼。你可以使用我認爲是非常好的加密方法的bcrypt。
開始查看PDO – 2012-07-06 00:16:32
請查看右邊「相關」列表中的一些問題。希望他們能解決你的擔憂。 – 2012-07-06 00:18:08
保羅 - 我寧願使用更簡單,更熟悉的東西,但我會研究它。奧利 - 我做過了,但我認爲我的情況更具體,因爲我想在輸入數據庫之前完全過濾輸入。我基本上希望它以純文本形式存儲,並刪除了xss和注入威脅。 – Gus 2012-07-06 00:21:20