2010-07-08 50 views
4

您好我撰寫的正則表達式我的網站的密碼字段,併產生了擔憂:一套針對網站的有效字符的密碼

是否有任何字符我應該阻止進入用戶?如果是這樣,爲什

還是隻是爲了逃避危險字符,如=和'處理數據時是否足夠? 這個主題似乎很好,列出了逃脫這些,PHP的功能,如果你願意。

謝謝!

回答

7

我散列用戶輸入的任何密碼,所以我不在乎他們輸入什麼,它永遠不會觸及我的數據庫,並且不會造成任何傷害。 MD5($ _ POST [ '密碼'])

其他領域是一個不同的故事......

mysql_real_escape_string()是在逃避查詢數據的巨大作用。

+2

+1 Hashing也是一個好點。 – TNi 2010-07-08 19:53:23

+0

多數民衆贊成好 - 沒有MD5和SHA1得到破解,但? – 2010-07-08 19:57:59

+1

破解?..如果有人進入你的數據庫,他們可能能夠谷歌上一些解密的密碼,但他們必須首先正確嗎?完全分開的問題......在SQL入口之前對它進行哈希處理將消除PASSWORD本身被用於sql注入或損害您的站點的可能性。 – Fosco 2010-07-08 20:02:52

1

不應限制密碼。讓用戶決定。

至於轉義數據庫入口的字符,不需要;只要做一些研究SQL Injection

1

你特別注意什麼?如果它是SQL注入,那麼你不應該依賴轉義用戶提供的參數,你應該使用參數化查詢。

http://us.php.net/manual/en/mysqli-stmt.bind-param.php

+0

一切,所以我想如果哈希是唯一的安全選項,那麼SQL注入現在是較少關注 – 2010-07-08 20:00:50

+0

SQL注入在這種情況下仍然是密碼以外的任何其他事情的一個巨大的關注。什麼時候你會有一個單獨的密碼的SQL查詢? – TNi 2010-07-08 20:03:19

+0

我同意 - 謝謝。雖然有很多代碼需要查看 - 這是我必須熟悉的一頁,以防止注入? – 2010-07-08 20:11:58

3

像其他人已經表示,它保存到數據庫將意味着你不必擔心用戶輸入的前散列用戶密碼。

雖然我們討論哈希的問題,但您可能還想考慮在哈希之前向密碼添加「鹽」。 salt是一個隨機字符串(例如,用戶的電子郵件地址),這將有助於提高生成的散列的唯一性(具有相同密碼的不同用戶將生成沒有鹽的相同散列)。

欲瞭解更多信息,採取的讀取:http://phpsec.org/articles/2005/password-hashing.html

+0

許多很好的答案 - 謝謝我正在尋找一個很好的鹽教程 – 2010-07-08 20:25:46

-2

我使用的密碼MD5/Hash和Base64編碼的功能,所以我還沒有真正照顧他們,只要他們符合最低要求進入...建議使用強類型密碼。

function get_rnd_iv($iv_len) 
    { 
     $iv = ''; 
     while ($iv_len-- > 0) { 
      $iv .= chr(mt_rand() & 0xff); 
     } 
     return $iv; 
    } 

    function md5_encrypt($string_value, $salt_key, $iv_len = 16) 
    { 
     $string_value .= "\x13"; 
     $n = strlen($string_value); 
     if ($n % 16) $string_value .= str_repeat("\0", 16 - ($n % 16)); 
     $i = 0; 
     $enc_text = get_rnd_iv($iv_len); 
     $iv = substr($salt_key^$enc_text, 0, 512); 
     while ($i < $n) { 
      $block = substr($string_value, $i, 8)^pack('H*', md5($iv)); 
      $enc_text .= $block; 
      $iv = substr($block . $iv, 0, 512)^$salt_key; 
      $i += 16; 
     } 
     return urlencode(base64_encode($enc_text)); 
    } 

    function md5_decrypt($enc_text, $salt_key, $iv_len = 16) 
    { 
     $enc_text = urldecode(base64_decode($enc_text)); 
     $n = strlen($enc_text); 
     $i = $iv_len; 
     $string_value = ''; 
     $iv = substr($salt_key^substr($enc_text, 0, $iv_len), 0, 512); 
     while ($i < $n) { 
      $block = substr($enc_text, $i, 8); 
      $string_value .= $block^pack('H*', md5($iv)); 
      $iv = substr($block . $iv, 0, 512)^$salt_key; 
      $i += 16; 
     } 
     return preg_replace('/\\x13\\x00*$/', '', $string_value); 
    } 
+0

謝謝 - 這將有助於我的鹹求天地:) – 2010-07-08 20:26:14

+1

所有這些代碼的目的是什麼?爲什麼不只是md5/sha1(pass.salt)? – 2010-07-08 20:29:33

+0

這將是一個可重複使用的模式,可以放在一個類的內部或用作包含...在這種方法中,您可以不斷重用md5/sha1/base64_encode方法... 不知道爲什麼你評價爲負值時這是一個堅實的解決方案。您也可以使用它來附加散列數據來驗證/驗證查詢字符串數據。您還可以使用unix datetime對其進行進一步編碼,以便編碼數據僅在實例化日期有效。 :) – 2010-07-09 02:46:53