2011-03-17 63 views
8

我正在構建一個瀏覽器遊戲,並使用大量的ajax代替頁面刷新。我使用的是PHP和JavaScript。在做了很多工作之後,我注意到ajax並不完全安全。我擔心的威脅是說某人想要查看我的SQL服務器上的某些信息,他們只需將正確的信息輸入到與我的ajax調用相關聯的.php文件中即可。我正在使用GET風格的ajax調用,這是一個壞主意。無論如何,經過大量的研究,我有以下安全措施。我切換到POST(這不是真的更安全,但它是一個小錯誤)。我也有一個提到的地方,它又是僞造的,但又是另一個威懾力量。Ajax安全(我希望)

最後的措施我已經到位,並且是這個問題的焦點,當我的網站被加載時,我有一個80個字符的十六進制密鑰生成並保存在會話中,當我發送ajax調用時,我也發送在

challenge= <?php $_SESSION["challenge"]; ?> 

形式的挑戰,現在關鍵當AJAX的PHP文件中讀取這一點,檢查是否發送的詢問配襯會話的挑戰。現在這本身不會做太多,因爲你可以簡單地打開螢火蟲,看看發送的問題很容易。所以我所做的就是一旦使用了這個挑戰,它會在會話中產生一個新的挑戰。

所以我的問題是,從這個地方看,只有看到挑戰關鍵字發送後什麼時候才能看到什麼,然後它會更新並且在發送之前再也看不到它,這使得它成爲不可能從另一個來源發送僞造的請求。所以沒有人看到任何這種安全方法的循環漏洞或有任何額外的想法或想法。

回答

1

查看'meagar'的回答。

我想提一提:

通過傳遞在會話的識別符,你在做什麼的會議已經在做。通常會有一個cookie與您生成的唯一標識符類似,這個標識符告訴您的應用程序,實質上是該人是誰。一般來說,這就是PHP會話的工作方式。

在這種情況下,您需要做的是檢查對於給定請求 - POST GET - 特定用戶(其唯一用戶ID或類似名稱存儲在會話中)具有權限添加/更改/刪除/具有該特定請求的任何內容。

因此,對於「搜索」請求,您只會返回用戶X有權查看的結果。這樣,你不用擔心他們發送了什麼 - 如果用戶沒有權限做某件事,系統就知道不讓他們這樣做。

因此,「您應該驗證所有請求」。

有人隨意添加到此。

+0

這聽起來就像我想要的那樣,你能給我一些關於如何使用這個唯一標識符來驗證他人的信息嗎? – tye 2011-03-17 13:53:10

+0

如果您正在製作遊戲,我會假設您可能已經制定了用戶和註冊。除此之外,你正在尋找通常被稱爲「ACL」的東西。從本質上講,用戶(或用戶組)被賦予許可權限(「可以添加小部件」,「可以編輯*自己的小部件」,「不能刪除小部件」等)。對另一個問題來說,這是一個很好的話題,而且這個問題可能已經被很好地提出來了。 – 2011-03-17 14:08:01

10

您對「安全」的定義很模糊。您似乎對阻止數據被攔截感興趣較少,並且更感興趣的是防止人們向您的服務器提交自定義請求。這不是安全性,這只是良好的應用程序設計 - 您的程序不應該接受導致內部狀態中斷的請求。絕對沒有辦法阻止人們提交他們想要的任何數據。解決方案是驗證他們提交服務器端的數據,而不是試圖阻止他們提交數據客戶端,而這往往會失敗。

我切換到POST

不應該去;這與安全無關。使用適合於請求的HTTP動詞。你在查詢信息嗎?使用獲取請求。你正在更新/插入/刪除信息?使用帖子。

說有人想查詢某人的信息,我的SQL服務器上他們剛剛需要正確的信息給關鍵相關的我的PHP文件

你應該認證的所有要求,以確保他們有權訪問他們正在查詢的數據。 SSL將幫助您安全地執行身份驗證。

當我的網站加載我有產生80字符內六角扳手,並保存在會話中,當IM發送Ajax調用我也送關鍵挑戰

這不會幫助。您的問題的整個前提似乎是用戶安裝了Firebug或類似的HTTP調試工具。如果他們這樣做,你的會話密鑰將變得毫無用處。

+0

也許你可以幫助我清理一些東西,我的數據如何被攔截,如果他們有螢火蟲,他們可以看看我的會話數據?我認爲這是保存在服務器端,無法查看。 – tye 2011-03-17 13:49:28

+0

數據可以通過本地網絡上的數據包嗅探攔截 – 2011-03-17 14:02:37

+0

不會很難在本地網絡上獲取某些東西嗎? – tye 2011-03-17 15:25:55

0
function mysqlRequest(type,server,name,value,sync){ 
    $.ajax({ 
      type: 'POST', 
     url: 'sql.php', 
     data: "server=s"+server+"&type="+type+"&name="+name+"&value="+value+"&challenge=<?php echo $_SESSION['challenge']; ?>", 
     cache: false, 
     dataType: 'json', 
     async: sync, 
     success: function(data){ 
      }, 
     complete: function(){} 
+0

你試過這個嗎?使用螢火蟲檢查頁面,無論您改變$ _SESSION ['challenge']'服務器端的值多少次,''&challenge ='都不會改變,根據AJAX請求的結果更新值,它不會自動發生,這意味着您必須每次發送新的密鑰以響應AJAX請求,這會破壞密鑰的用途 – meagar 2011-03-17 18:43:18

+0

另外,你是否通過'value'參數將SQL查詢傳遞給服務器?這是一個糟糕的,糟糕的,不可原諒的壞主意。任何人都可以編寫他們想要的任何SQL查詢併發送它。這是根本的誤解 - 解決方案不是' t來「安全」的SQL查詢發送到服務器;解決方案是*永遠不會*發送SQL查詢 – meagar 2011-03-17 18:46:29

+0

是啊這些是我打算做的變化lol。和好的感謝您的信息關於該代碼將不會發送更新的會話VA可變結構。所以你不認爲我應該爲sql目的使用ajax。我在做的這個遊戲的整個基礎是消除頁面刷新的需要。它將採用MMO風格的RTS。 – tye 2011-03-17 18:50:25