2010-05-27 121 views
0

我目前正在尋找的是一個簡單的,基本的登錄憑據衛生腳本。衛生腳本在php登錄憑據

我明白,我做一個函數來做到這一點,我有一個......但所有它現在所做的是帶標籤...

我我註定要使用替代?或者有沒有辦法,我可以刪除所有特殊字符和空格,並將其限制爲只有字母和數字...然後至於密碼限制它只能是字母和數字exclimation點,句點和其他特殊字符,不會影響我的SQL查詢。

請幫助:/

謝謝, 馬特

+0

怎麼會在你的用戶名或密碼的某些字符影響SQL查詢?也許你需要提出有關如何正確進行SQL查詢而不允許SQL注入的問題。提示:您可以在數據庫中存儲引號和斜槓。 – thomasrutter 2010-05-27 06:11:05

+2

切勿刪除或替換憑據中的任何字符。你必須只檢查它。然後在用戶無效的情況下通知用戶。 – 2010-05-27 06:16:01

回答

0

聽起來就像你想限制人們被允許在他們的用戶名和密碼中使用哪些字符。有點像這樣。

if (!preg_match('/^[a-zA-Z0-9_]++$/', $username)) { 
    // reject username 
} 

if (!preg_match('/^[a-zA-Z0-9\[email protected]#$%^&*_-]++$/', $password)) { 
    // reject password 
} 

在某人的憑證中悄悄替換/刪除字符是一個壞主意。您需要向他們反饋這些字符是不允許的。由於其他人已經涉及的安全原因,限制您在密碼中允許使用哪些字符也是一個壞主意。

1

如果你想串安全的SQL,用mysql_real_escape_string()

如果你想限制一個字符串到某些字符,使用正則表達式。

例如,如果您只想使用a-z,0-9和感嘆號,您可以使用。

$string = preg_replace('^[^a-z0-9!]+$', '', $string); 

這會去掉任何與正則表達式不匹配的東西。

如果你想檢查爲字符串匹配該模式,請使用preg_match()。爲了便於閱讀,您可能需要取出^,然後使用bang/not/!運算符繼續執行表達式。

如果您正在討論關於將echo設爲安全頁面的問題,請使用htmlspecialchars()。根據具體情況,您可能需要進一步清理。

請記住:如果您限制密碼中的字符,從理論的角度來看,最終用戶會更容易記住它。限制字符使得密碼暴力破解者更容易(更小的字符池來檢查),並且不應該影響他們的存儲(因爲他們應該被鹽漬和散列)。

+0

關於醃製和散列密碼的好處。 – thomasrutter 2010-05-27 06:25:57

0

首先,千萬不要過濾密碼。在離SQL查詢很近的地方應該早做哈希處理,所以它實際上會產生相反的效果,並且使得你的應用程序對用戶來說安全性較低。


$password = "hey'; --droptable"; 
$hashedPass = sha1("salt" . $password); 
// sha1 returns a alphanumerical hash of the password 
// stick the hash in the database 

如果你正在處理MySQL數據庫,mysql_real_escape_string()就像alex說的那樣好。有一件事你必須記住的方法是,你需要一個開放的連接到你的MySQL數據庫才能工作。


mysql_connect(); 
$string = "hey'; --droptable"; 
$string = mysql_real_escape_string($string); 
echo $string; // outputs "hey\' --droptable" 

有跡象表明,有一個轉義字符串方法的一些其他DBMS的API,這裏有幾個:http://au2.php.net/manual-lookup.php?pattern=escape_string&lang=en