2010-10-13 156 views
1

我有一個AJAX函數調用一個PHP腳本並在頁面上顯示結果。AJAX安全幫助

所以,我有兩個頁面,說:

form.php的 - 這是輸入被收集並顯示 process.php - 這是被稱爲從這個結果顯示在表格的PHP .PHP

現在,這裏是我的AJAX功能:

function showList(str) 
{ 
if (str=="") 
{ 
document.getElementById("message").innerHTML=""; 
return; 
} 
if (window.XMLHttpRequest) 
{// code for IE7+, Firefox, Chrome, Opera, Safari 
xmlhttp=new XMLHttpRequest(); 
} 
else 
{// code for IE6, IE5 
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
} 
xmlhttp.onreadystatechange=function() 
{ 
if (xmlhttp.readyState==4 && xmlhttp.status==200) 
{ 
document.getElementById("message").innerHTML=xmlhttp.responseText; 
} 
} 
xmlhttp.open("GET","process.php?q="+str,true); 
xmlhttp.send(); 
} 

正如你可以清楚地看到從表單收集該值傳遞給process.php如下:

process.php?q = 1

對於每個查詢字符串,都會從數據庫中提取一個列表。同樣的列表也可以通過輸入domain.com/process.php?q=1,2,3等拉入...

我的問題是,我該如何修復這個循環孔,以便來自只有我的腳本的請求才能訪問process.php而沒有其他人?

在此先感謝!

回答

1

你也可以檢查在$_SERVER變量HTTP_X_REQUESTED_WITH頭:

if(isset($_SERVER['HTTP_X_REQUESTED_WITH'])) { 
    $requestedwith = strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) ; 
    if($requestedwith === "xmlhttprequest") { 
     // Requested by Ajax 
    } 
} 

同樣,這可太雖然欺騙。

+0

是否有防止Ajax應用程序安全的方法? – 2010-10-13 18:14:29

+0

編號默認情況下,您正在將源代碼(javascript)上傳到瀏覽器。它會發生什麼,你無法控制。 – Gus 2010-10-13 18:18:48

+0

謝謝!上面的Craig Edmunds解決方案似乎更有希望..如果我無法找到PHP CSRF後衛的源代碼,將不得不依賴HTTP_X_REQUESTED_WITH方法 – 2010-10-13 18:27:11

2

你可以簡單地檢查HTTP_REFERER變量($_SERVER['HTTP_REFERER']),但可能會被欺騙...

如果你希望它是更安全,你可能會產生有限的使用令牌。 Ajax調用也會發送令牌,並在服務器端進行驗證(並過期)。

1

你不能,真的。不是100%可靠。但是,AJAX請求也會向您發送域的cookie值,因此如果您的應用程序需要用戶登錄,則可以檢查請求者是否爲有效會話的一部分,與您的應用程序一樣應用程序中的其他頁面。

+0

是的,我已經爲我的頁面維護會話,我如何對Ajax做同樣的事情? – 2010-10-13 18:30:38

+0

@Jasdeep你會在process.php中檢查。這與Ajax沒有什麼關係。 – Fosco 2010-10-13 18:33:18

+0

@Jasdeep,你沒有做任何特別的事情......只是處理讀取會話信息,像所有其他頁面加載。據php知道,它只是一個普通的頁面請求。如果它以這種方式完成,那麼從哪裏調用php文件並不重要,因爲它將返回任何信息所需的有效會話。所以你不必亂七八糟地檢查推薦人。 – GrandmasterB 2010-10-13 19:11:27

1

當你渲染form.php呈現一個隨機序列作爲值(最簡單的選擇是一個GUID)的隱藏輸入。將該字符串存儲在用戶cookie(加密)或服務器端會話狀態中。每當你渲染表單時,渲染一個新的鍵。

然後發送這個值到process.php並在process.php中比較這兩個值。

它被稱爲「反僞造令牌」 - 這裏有.net實現的詳細信息http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/,可能有類似於php的機制。

+1

以下是有關漏洞的網絡安全項目的參考http://www.owasp.org /index.php/Cross-Site_Request_Forgery_(CSRF) – 2010-10-13 18:16:58

+0

我在閱讀完代碼後偶然發現了相同的網站..但是似乎沒有這個庫的可用下載,我可以在我的腳本中包含它..仍在搜索 – 2010-10-13 18:25:12

+0

這很漂亮簡單寫下自己,從字面上產生一個隨機字符串並將其存儲在會話中。如果你不使用會話狀態,然後將其散列並放入cookie中。將其作爲隱藏輸入呈現在表單中。 – 2010-10-13 18:49:19

0

一小段答案,但餅乾和SSL。