2010-05-09 260 views
1

在我的CMS我有index.php,其中客戶端必須輸入用戶名和密碼。如果他們是正確的,他會移動到admin.php,cms所在的位置。安全問題

但現在黑客可以進入cms/admin.php,所以我現在的安全性很糟糕。我可以使用$_SESSION變量。

index.php - 我可以給一定的參考價值$ _SESSION [ '成功']:

$_SESSION['success'] = TRUE,並在admin.php的只是驗證

admin.php 

if($_SESSION['success'] == TRUE) 
{ 
    my script here... 
} 
else header("Location: index.php"); 

,但我想沒有豐富SESSION這種效果。 你可以給我一個主意,我該怎麼做?

謝謝

+5

會議是要走的路。你爲什麼不想使用會話? – knittl 2010-05-09 07:53:22

+0

以及爲什麼投票? – Simon 2010-05-09 16:03:53

+1

不知道爲什麼你被低估了。這是一個合法的問題。 +1 – mpen 2010-05-09 19:36:07

回答

5

Web應用程序的安全性真的很深。首先,您需要使用會話或會話的等效實現。

用戶登錄,您需要將會話ID及其用戶名存儲在cookie和數據庫中。在數據庫中,你還需要存儲一些關於它們的信息,比如他們的用戶代理,這樣你就可以知道他們的會話是否被劫持。有些人存儲IP地址。如果用戶使用來自移動設備的應用程序,這將不起作用,因爲他們的IP地址可能會頻繁刷新。

每次用戶加載管理頁面時,請確認它們具有有效的會話和用戶cookie,並且有權使用該頁面。然後驗證請求是否從使用您存儲的有關該用戶的信息開始的同一臺計算機上發出。

對於您在管理頁面中放入的可導致管理操作的每個表單或鏈接,請添加具有唯一標識符的隱藏字段或值。可能導致管理操作的頁面上每個項目的一個標識符。當您生成這些標識符時,將它們與他們正在識別的操作一起存儲在數據庫中。這稱爲隨機數,它將隨每個管理請求一起提交(例如更新記錄或刪除用戶或從您的銀行賬戶轉賬)。當請求被服務時,服務器應該檢查nonce是否與數據庫中存儲的內容匹配,然後將其除掉。如果不匹配,則可能是通過跨站點請求僞造攻擊提出請求。

這些只是與認證用戶進行交互時需要記住的一些事情,當然還有其他一些事情需要注意,比如XSS。

安全非常困難,雖然您的Web應用程序可能不保證防彈安全策略,但您應該向用戶承擔責任,以保護其密碼和個人信息。有關(更多)更多信息,請參閱OWASP

1

您發佈的代碼是錯誤的和無意義的。 (應該是== true,爲什麼你允許他在錯誤上查看你的腳本,而不是成功?)

更重要的是,爲什麼你不想使用會話?您需要以某種方式驗證用戶身份,並且需要存儲某種狀態,以便每次更改頁面時都不必強制用戶登錄。

+0

)'錯誤',只是變量的名稱,但你是真的,它看起來很糟糕。 我不想使用SESSION,因爲在我的主機上,它不能正常工作。有時候,當我向很多頁面發送消息時,它會失去價值,我無法解決原因。所以我只想知道其他可能的解決方案 – Simon 2010-05-09 07:57:47

+1

更改主機。您無法使用損壞的工具構建工作事物,並且期望它是可靠和安全的。 – 2010-05-09 09:46:27

3

不,你不想這樣做沒有會議。其他的做法,cookies和referrer,和鎖定屏幕門一樣安全。

+0

錯誤...會話取決於Cookie ... – Quentin 2010-05-09 07:57:53

+1

會話取決於* a * cookie,通常會進行適當的散列。它們不依賴於名爲「isadmin」的cookie值爲「true」的cookie。 – 2010-05-09 08:02:40

+1

會話不僅僅取決於Cookie,我認爲Ignacio指的是「愚蠢」使用Cookie和引薦來源,而不是手動實施會話。 – 2010-05-09 08:12:09

1

你有兩個選擇:在每次請求

  1. 進行身份驗證(使用HTTP認證,該瀏覽器不可見確實在背景中)
  2. 進行一次身份驗證,然後儲存在用戶計算機上的某種關鍵的維護在服務器上提到它

第一個作品,但它不太安全和用戶友好。第二個是會議的內容;如果你試圖自己重新實現它,那麼你很有可能會遇到一些安全漏洞。是否有任何實際的理由你不想使用會話?

+0

是的,有時候我失去了SESSION變量的價值,它只發生在某些事情上,而我無法修復它 – Simon 2010-05-09 08:03:07

+1

檢查你的代碼,這可能是你的錯誤;也許不會調用'session_start'。你也可以嘗試設置PHP來使用基於文件的會話,而不是基於數據庫的會話(反之亦然)。 – Tgr 2010-05-09 08:09:49

1

爲了能夠實現您自己的安全系統,您需要能夠跨越請求跟蹤用戶,換句話說,能夠擁有用戶狀態。會話是在PHP中執行此操作的方式。您可以使用內置會話,也可以自己實現自定義會話。這兩個選項中的後者更加困難,並且可能對您的情況沒有好處。

要記住關於PHP中的會話的一個關鍵事項是,您始終必須爲每個請求啓動它們。你應該有一個全局的包含文件,也許某種配置文件。我建議你把你的session_start();放在那個文件的頂部附近,以確保它對每個請求都正確執行。請記住,必須在發送任何頭部之前啓動會話,換句話說,在發送任何輸出之前

使用PHP來保護訪問您網站的一部分的一個缺點是,它只適用於請求是針對PHP文件。例如,如果您有要保護的圖像,文檔或其他媒體,除非您通過某種PHP網關/篩選器提供,否則這些文件可能無需身份驗證即可訪問。

就這麼說吧,我建議你看看Apache提供的basic or digest authentication爲了您的需要,它可能會提供足夠的安全性,並且非常容易實現 - 無需編碼。更重要的是,大多數網絡主機都有一個管理工具來管理這種類型的身份驗證,通常被稱爲「密碼保護的文件夾」,「鎖定的文件夾」等。您所做的只是選擇文件夾並設置用戶名和密碼以及你完成了。