2011-11-03 116 views
1

我正在研究將託管在「Internet上」而不是LAN上的服務器上的Web應用程序。AJAX安全性和用戶管理

該應用程序使用相當多的AJAX調用,並具有約12個函數的ajax處理程序文件。

我的問題是,不要問任何人在這裏寫AJAX安全教程,有沒有人知道任何可以幫助我保護這些文件的好資源(網站,書籍,任何)。

現在,只要您知道變量名稱就可以從數據庫中自由獲取數據。

我在想也許會話驗證,或沿着這些行登錄用戶的東西。

無論如何,如果你有任何好的資源,我會自己做作業。

感謝

+0

你是什麼意思?「現在,只要你知道變量名就可以從數據庫中自由地獲取數據。」 –

+0

也可以在使用ajax訪問的文件上使用PHP'$ _SESSION'標識,只需確保將'session_start()'放在php文件的頂部 –

+0

@Johnny您可以發出一個假請求併發送它到ajax_file.php?id = 32122&動作=刪除(用於演示目的),它會刪除行32122或任何...我還沒有使它驗證請求來自哪裏.. – guyfromfl

回答

0

AJAX調用通常用於訪問網絡服務,這是它似乎使用的是他們在這裏。如果是這種情況,那麼您需要關注的是您使用的服務器端腳本語言提供的安全層(看起來就像您使用PHP的問題標籤一樣)。

就像您對網站上的其他頁面進行身份驗證和保護的方式一樣,這些頁面不能通過您可以爲Web服務實現的AJAX調用進行訪問。例如,如果您需要對您的應用程序進行身份驗證,那麼您可以將用戶的ID存儲在$ _SESSION中。從那裏你可以檢查,以確保用戶通過$ _SESSION登錄,只要你的一個Web服務被請求。

+0

哇,好的,比我想象的要簡單多了。我將在明天開始體驗... – guyfromfl

+0

並更正服務器端php – guyfromfl

0

這裏是一個很好的資源。 Securing Ajax Applications: Ensuring the Safety of the Dynamic Web

但是,一個非常簡單的方法是使用帶有私鑰的MD5散列。例如USER_NAME + PRIVATE_KEY。如果您知道網站/登錄名上的用戶名,則可以將該密鑰提供給設置爲JavaScript變量的MD5哈希值。然後,只需在您的AJAX請求中傳遞用戶名,REST服務就可以採用相同的私鑰和用戶名,並比較兩個哈希值。您只需發送一個散列,然後輸入用戶名。它簡單而有效。除非你有一個簡單的私鑰,否則幾乎不可能逆轉。

因此,在你的JavaScript,你可能有這一套:

var user='username'; 
var hash='925c35bae29a5d18124ead6fd0771756' 

然後,當你發送請求發送這樣的事情:

myService.php?user=username&hash=925c35bae29a5d18124ead6fd0771756&morerequests=goodthings 

當你選擇了它,在服務你會做這樣的事情

<?php 
if(md5($_REQUEST['user']."_privatekey")==$_REQUEST['hash']){ 
echo 'passed validation'; 
}else{ 
echo 'sorry charlie'; 
}?> 

顯然你需要使用PHP或東西els e用私鑰生成散列,但我認爲你得到了一般想法。 _privatekey應該是複雜的,如果你有一個巨魔試圖破解它。

+0

我之前編寫了一個哈希程序,並且正在考慮嘗試找到某種類型的哈希數據來使其不太可猜測..我會明天也要閱讀這些資源。感謝您的意見。 – guyfromfl

0

我經常看到AJAX調用檢查X-REQUESTED-WITH HTTP頭以「驗證」請求源自AJAX。根據您發送AJAX呼叫的方式(使用XmlHttpRequest或JS庫),您可以使用此標頭的標準值,也可以將其設置爲自定義值。這樣一來,你可以做類似這樣的PHP中的東西是否與AJAX請求的頁面:

http://davidwalsh.name/detect-ajax

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && 
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') 

需要注意的是,因爲它是一個HTTP標頭,它是可以被欺騙是很重要的,所以它絕不是完整的證明。