2013-07-23 67 views
0

因此,我使用Cookie來識別用戶並防止未登錄訪問的用戶。 這是頁面檢查在php中篡改的URL

 if (!isset($_COOKIE['username']) && !isset($_COOKIE['password'])) 
     { 
     header("location:clientlogin.php"); 
     } 

但是校驗碼,這僅僅是檢查的一半。這是我的問題。我的網址是格式化這樣

site.com/?Client=$Client &產品= $產品

現在擺在我做任何事情,我想確保cookie的用戶名中的鏈接的信息相匹配。我必須先從數據庫中獲取信息,我認爲,因爲$ Client是姓,而用戶名是電子郵件列。我嘗試過比較餅乾,我只是沒有做到。

其次,我要防止URL篡改,當前設置允許任何人改變$客戶端和$產品,並獲得不屬於他們的信息。但是,每當我插入這樣的檢查:

if($Client != $LastName) 
    { 
    header("location:clientlogin.php"); 
    } 

如果我已經有$客戶端(網頁開始與GET),它創建了一個重定向循環,我無法登錄。每當我登錄並重定向到該頁面時,我都會回到clienlogin.php 我猜如果我可以比較cookie用戶名(它會持續一年的時間)與實際數據,我可能能夠解決這兩個問題?

我希望我提供足夠的信息,如果你去容易對我會很酷,這是我學習上的第一個項目。

謝謝!

+1

您需要在會話中使用會話和存儲數據。 – SasaT

+0

'$ _GET','$ _POST','$ _COOKIE','$ _REQUEST'這些應該不會在PHP中被信任。 –

回答

1

@DaveChen:我沒有遇到過任何一種框架(使用任何腳本語言),也沒有一個我曾經登錄過的知名網站,它將用戶的密碼存儲在未加密的cookie中。這是迄今爲止您可以對用戶做的最危險的事情。即使在cookie上設置了SSL和httponly選項(以緩解JavaScript XSS攻擊),這也是一個非常非常糟糕的主意。

最近的「正確」的方法來完成你正在試圖做的是加密cookie內容是什麼。幾乎每個理智的網站使用的最好的方法是根本不存儲任何會話數據。客戶端的cookie只包含隨機生成的(難以暴力)會話ID - 所有數據本身都存儲在服務器上,無論是在數據庫,會話文件還是緩存服務器中。

你會被告知,使用PHP內置的會話。首先閱讀整個reference for php sessions。默認情況下,php將會話存儲在服務器上的臨時文件中 - 客戶端只獲取會話ID。

提供了部分答案您關於其他用戶確保單個用戶的數據問題的眼睛,你不會把‘客戶’在所有的查詢字符串(URL)。相反,您需要在數據庫中查找url中的'Product',以及從會話中檢索的'Client'值。因此,您的網址將變爲site.com/?Product=$Product,並使用會話中的「客戶」值,並運行同時檢查兩個值的數據庫查詢(以確保產品屬於登錄的客戶端) - 類似SELECT * FROM products where client_id = ? AND product_id = ?

+0

我想感謝大家的快速和有用的幫助!這是我最終做的: 當用戶登錄時,我執行以下操作: 'session_start(); $ _SESSION ['user'] = $ myusername;' 然後當用戶被重定向到適當的頁面時,只有產品在URL中列出。然後,代碼將比較來自會話的網址和用戶名的產品,如果它們都是有效的並且屬於同一用戶,則它將繼續顯示信息。 此方法還可以防止任何人通過更改Product變量並拉動shenanig來破壞URL。 再次感謝你們,真棒幫助! –

1

一開始不要在cookie存儲一個人的密碼。

抓住這些信息非常簡單。改用會話。請參閱here

+0

+1,但實際上這樣XSS就會發生 - 攻擊者永遠無法獲得他們的密碼。使用HTTPS不會讓任何人認爲。 –

+0

@DaveChen - 有些人使用公共電腦(圖書館/網吧等)。 –

+0

對不起,我不明白這將是一個問題。將密碼放入cookie中的唯一問題是,如果有人對它或xss達到了頂點。在這兩種情況下使用https(會話哈希與密碼)都可以防止中間人攻擊(即使在公用計算機上)。 –