2012-08-07 47 views
7

我正在編程一個允許用戶註冊的PHP站點,並且註冊和未註冊的用戶都可以輸入他們各自的用戶名和密碼(例如smith8h4ft - j9hsbnuio)供學校網站使用。PHP - 加密其他站點的用戶名和密碼

然後,我的PHP腳本發送一些$_POST變量,下載並解析標記頁面,使得稱爲數組: marksDB = Array("subject" => Array("A", "B", "A", "C"), ...),並將其寫入重新格式化。

我的問題是: 我該如何保持用戶名和密碼的安全?

對於未註冊的用戶,我目前忘記了用戶名和密碼,並將marksDB置入$_SESSION。當用戶不活躍於例如30分鐘,marksDB被刪除。這些數據在$_SESSION中安全嗎?那麼用戶如何登錄,查看頁面一次,而不再查看它,所以腳本不會從會話中刪除marksDB?會話是否自動刪除(gc.maxlifetime)?

那麼註冊用戶呢?我希望讓所有事情都安全,但我不想讓用戶每隔30分鐘處於不活動狀態就提示密碼提示。加密如here所述的憑證是否安全,但沒有第三個用戶設置的密碼?或者我每次都要問用戶密碼?

編輯:

感謝快速回復,
@Justinᚅᚔᚈᚄᚒᚔ:我懷疑他們有一些API,但我可以問他們,只是情況
@Abid侯賽因:謝謝你非常有用的鏈接。 (謝謝你的答案)。
我會拋棄用戶的憑據,並且只解析markDB,我可能也會扔掉(註銷或不活動之後) - 在需要時再次檢索標記很便宜。

+0

這裏唯一很大的風險是會話劫持,海事組織。當權限發生變化時,您可以重新生成會話ID。 – Leri 2012-08-07 14:20:35

回答

2

如果學校網站沒有公開API(例如,using OAuth like the StackExchange sites do),那麼您的選擇是有限的。

一般來說,永遠不會是一個好主意,保持用戶的純文本憑據的時間比絕對必要的更長。對於你想象的任何可能的方式(會話劫持,被盜密鑰,解密等)都存在安全隱患。

更好的方法可能是使標記下載過程嚴格由用戶啓動。爲他們提供一個說明「檢索我的標記」的按鈕,然後通過身份驗證過程,下載標記並丟棄其憑據。每次他們「同步」時,他們都必須認證。除非標記經常週期性更改,否則不應該一次性下載所有需要的信息,然後將其安全地緩存在服務器上供以後使用。

0

會話文件是服務器端,所以它應該對客戶端不可見。但如果他們知道會話ID,他們仍然可以欺騙您的程序使用另一個會話。

對於已註冊的用戶,你可以存儲在一個數據庫密碼或文件已與(也許隨機生成一個新的,併爲每個用戶存儲),只有你知道,一個關鍵的

+1

否;你不應該*加密*密碼。你應該*散列它 - 所以即使你自己的應用程序也不能將其逆轉。 – 2012-08-07 14:24:35

+0

@AndrewBarber但他怎麼能把它發送到其他網站,除非它也使用相同的哈希? – 2012-08-07 14:37:47

+1

你剛剛回答了你自己的問題。 – 2012-08-07 14:41:00

0

會話文件進行加密後,將在一段時間後被垃圾收集器刪除,但存儲在_SESSION中的經驗法則只是您要在屏幕上輸出的存儲數據,即密碼可能不是您想要存儲在會話中的東西。會話文件可以從服務器讀取,一些惡意用戶可能劫持會話並查看他們不應該看到的內容,甚至可能看到一個var_dump($_SESSION)

如果您希望允許註冊用戶使用更長的會話,您可以定期使用JS進行頁面刷新(不一定刷新頁面,只需要一個異步請求),或者甚至可以使用ini_set增加會話時間(如果允許)。這不是必然反覆要求密碼更安全..它取決於你問的時候密碼是多麼脆弱。

另一個解決方案是讓臭名昭着的「記住我」cookie保持用戶登錄。

密碼不用於解密。加密保密。哈希進行身份驗證。

0

會話中的所有內容都是服務器端,因此其他人無法訪問。但是,會話可能會被解釋爲here

您可以在PHP.ini中增加會話的長度,或者在後臺使用定期的AJAX調用來保持會話的活躍。會話在服務器過期時被刪除。

加密密碼以便解密通常是不被接受的,除非沒有其他選擇。通過加密,不僅您,還可以訪問數據庫和/或源代碼的其他人都可以檢索密碼。

1

查看網址

http://phpsec.org/projects/guide/4.html

http://www.sitepoint.com/blogs/2004/03/03/notes-on-php-session-security/

http://talks.php.net/show/phpworks2004-php-session-security

http://segfaultlabs.com/files/pdf/php-session-security.pdf

safest way to create sessions in php

的客服也瀏覽

會話明顯比cookie更安全。但是仍然有可能竊取一個會話,因此黑客可以完全訪問該會話中的任何內容。避免這種情況的一些方法是IP檢查(它工作得很好,但是非常低,因此不可靠)和使用隨機數。通常對於隨機數,您有一個每頁「標記」,以便每個頁面檢查最後一頁的隨機數與它存儲的內容相匹配。

在任何一項安全檢查中,都會失去可用性。如果您進行了IP檢查,並且用戶位於內部網防火牆(或導致此類情況的任何其他情況)後面,而該防火牆並未爲該用戶提供穩定的IP,則每次失去IP時都必須重新進行身份驗證。隨着隨機數的增加,你會得到一個非常有趣的「點擊返回將導致此頁面中斷」的情況。

但有了cookie,黑客可以通過簡單的XSS技術簡單地竊取會話。如果您將用戶的會話ID存儲爲cookie,那麼它們也很容易受到攻擊。因此,即使會話只能透露給可以執行服務器級別攻擊的人(這需要更復雜的方法並且通常需要一些特權,如果您的服務器是安全的),您仍然需要一些額外的驗證級別根據每個腳本請求。您不應該一起使用cookie和AJAX,因爲如果cookie被盜,這會讓您更容易上街,因爲您的ajax請求可能無法獲得每個請求的安全檢查。例如,如果頁面使用一個隨機數,但該頁面從不重新加載,那麼該腳本可能只會檢查該匹配項。如果cookie持有認證方法,我現在可以使用被盜的cookie和AJAX洞去城裏做我的邪惡。