2011-05-03 46 views
4

我使用非常簡單的PHP代碼構建了幾個站點,並且迄今爲止這麼好,但是我碰巧發現我現在擔心主題「安全性」,我想知道在PHP中創建登錄/身份驗證過程的最佳方式是什麼關於網站用戶認證的PHP最佳實踐?

這就是我目前做的:

註冊時用戶提交電子郵件地址和密碼將被保存密碼 ,在MySQL中,作爲一個MD5的字符串,所以任何人,但用戶知道它。

當用戶登錄,我做

SELECT * FROM usertable WHERE email = $emailsubmitted AND pass = md5($passsubmitted) 

然後如果sizeof運算所得到的陣列更接零,這意味着該用戶是否存在

所以設置

session_start(); 
$_SESSION['logged'] = 'true'; 
$_SESSION[userid] = userid; 

所以對於用戶瀏覽的每一頁,我將執行檢查以查看會話變量是否存在。

底線:我想知道這是否足夠安全以及如何改進。

+0

「足夠安全」是爲了什麼?對於公告板似乎足夠了。其他:http://stackoverflow.com/questions/401656/secure-hash-and-salt-for-php-passwords – mario 2011-05-03 23:31:08

+0

您應該儘可能重新使用現有的身份驗證框架,因爲它確實很複雜。例如,看一下https://github.com/delight-im/PHP-Auth,它既是框架不可知的,也是與數據庫無關的。 – caw 2016-10-21 21:36:24

回答

3

您的SQL語句中存在注入漏洞。 (這是假設「提交」後綴表示變量沒有對其進行任何過濾)。如果惡意用戶要將'[email protected]' AND 1=1;--作爲電子郵件地址提交,他們可以使用「admin @ example.com「,而不考慮密碼。我建議確保輸入到SQL和/或使用存儲過程。我也建議只加載你絕對需要的列;它將提高查詢的速度,並允許在數據庫外暫停較少的狀態。

另外,在密碼上執行salting。如果有人從數據庫中檢索用戶的數據,密碼將成爲暴力和字典攻擊(如彩虹表)的簡單目標。如果你真的偏執狂,考慮從MD5切換到SHA或另一個散列函數。

確保在您的php.ini文件中設置了哪些變量,並將它們設置爲您所期望的值。根據這些設置,分配給$_SESSION的陣列也不安全。一些舊的Web應用程序利用了一個PHP'特性',它使查詢字符串中的變量變成了Web應用程序中的全局變量,這意味着當它執行$_SESSION['userid'] = $userid;時,如果惡意用戶將?userid=1附加到他們的查詢字符串中,他們將成爲用戶標識爲1,通常是第一個用戶(或管理員)。

+0

對不起,我應該更加精確,但在我的表單中我有一個JS來防止任何奇怪的字符,然後在我的SQL我只選擇我需要的字段。 – Francesco 2011-05-04 02:01:31

+0

另外我; m運行非常小的社區關於食物和我; m只存儲食譜,所以沒有信用卡或所以... – Francesco 2011-05-04 02:03:40

+2

@camelCase:使用Javascript進行輸入驗證是不安全的:客戶端可以忽略Javascript你寫信並強制提交表格。輸入驗證__必須在服務器端完成,並且_optionally_在客戶端。此外,無論網站提供什麼內容,__any__上下文中的安全性都很重要。尊重你的用戶,不要忽視安全。 – jmkeyes 2011-05-04 02:13:54

1

一般邏輯是好的,是的。但是,一個簡單的密碼MD5是不好的。

  • 不醃密碼會使散列開啓到彩虹表查找。

  • md5通常不被認爲是密碼的良好哈希機制。我鼓勵你看看http://www.openwall.com/phpass/

側面說明:您的SQL 似乎是開放的SQL注入。

+0

有趣的感謝! +1 – Francesco 2011-05-04 02:02:27

1

在前面提到的SQL注入的頂部我建議你不檢查,如果數組大於零,而是如果數組是相等的。

的原因是,讓我們說某人做修改數據庫,只是運行一個簡單的查詢,以清除所有的密碼,或者將它們設置爲特定條目,則等於一檢查就停止。

此外,假設多個用戶具有相同的密碼,他們莫名其妙SQL注入的用戶名或忘記檢查用戶名,然後再一次你要同檢查等於一個安全的。

歸根結底,這是一個次要的事情,但是當涉及到安全一點一滴計數。

+0

謝謝,這是我試圖收集的那種小技巧..;) – Francesco 2011-05-04 01:54:39

0

我注意到的第一件事是你應用MD5哈希到一個PHP變量。 這讓我覺得密碼在頻道上清晰可見。

你應該在這裏應用的MD5哈希客戶端與JS的例子:

http://phpjs.org/functions/md5/

如果你想添加另一層安全你也應該考慮,除了標準的哈希使用鹽。這將保護你從任何dictyonary攻擊或反向hasing(看到這一點:http://tools.benramsey.com/md5/