2012-08-13 18 views
0

我有一個MVC Web應用程序向一個url發出一些Ajax請求,例如:www.examplesite.com?q=some_query,然後結果以JSON顯示格式。隱藏來自公共訪問的查詢(如JSON或XML)的輸出

所以,如果有人知道這個網址,他可以直接調用它並查詢我的控制器並從我的數據庫中獲得結果,對吧?

什麼是使其他人無法訪問此網址,但仍然適用於我的應用程序的最佳做法?

編輯萬一有人誤解:當我說「some_query」我定義並不意味着SQL查詢!但類似於「www.examplesite.com?q=students & gender = male」

+2

http://stackoverflow.com/questions/3466802/deny-ajax-file -access-using-htaccess – Tim 2012-08-13 14:05:03

+1

刪除網址,現在,馬上,傳遞查詢作爲url參數是一個可怕的,可怕的想法 – 2012-08-13 14:05:14

+0

檢查此http://stackoverflow.com/questions/1145132/how-safe-is-it -to-send-a-plain-text-password-using-ajax – 2012-08-13 14:05:47

回答

0

任何可用於AJAX調用的URL都可用於公共Web。爲了保持它「私密」,你可以將它綁定到一個用戶會話或標記,你可以在你的主頁上啓動它並持久保存在AJAX調用中。另外,如果「some_query」是一個實際的SQL語句,這對AJAX調用來說被認爲是非常糟糕的做法。您的SQL應該只能在服務器端直接使用,而不是任何任意的客戶端。

+0

將其綁定到會話或令牌不會解決此安全問題,任何可以登錄的用戶仍然可以只刪除數據庫 – 2012-08-13 14:08:50

+0

他問如何保留AJAX呼叫限於主站點。會話或令牌可以做到這一點。它使用任何SQL語句的事實是單獨的(主要)問題。 – 2012-08-13 14:10:36

+0

只是爲了明確:當我說「some_query」時,我定義並不意味着SQL查詢! – 2012-08-13 14:13:11

-3

爲了安全起見,您可以嘗試強制數字類型或在執行查詢之前引用字符串。

例如

$number = (int) $number; 
$string = htmlspecialchars($string); 

哦對,對於答案:沒有辦法使它無法訪問。

+0

這不會解決這個安全問題,用戶仍然可以運行任何他們想要的查詢 – 2012-08-13 14:10:02

+0

當然它會修復它,他們不會能夠運行任何查詢他們想要的,由於 – 2012-08-13 14:11:45

+0

限制它也不會使功能「私人」,所以它真的不是一個問題的答案 – 2012-08-13 14:16:19

-1

其實沒有辦法做到這一點。你的應用程序是客戶端,所以它需要從服務器獲得響應。這意味着無論如何都可以被客戶攔截。

您可以使用加密來防止截獲數據的人能夠讀取它。您可以在客戶端應用程序中使用對稱密碼和硬編碼一些密鑰(這不太好,因爲如果密鑰被破壞,則所有客戶端的所有流量都可以被解密),或者您可以使用SSL/TLS與服務器(如果您傳輸敏感信息,我認爲這是最好的解決方案)。

+1

問題是如何防止任何對他的AJAX URL的任意請求,而不是如何在請求期間保護信息。 – 2012-08-13 14:13:20

+0

@MattS現在有一個投票的正當理由;) – 2012-08-13 14:14:35

0

客戶端必須能夠請求URL來使用它。但是,你可以檢查,看看是否請求與阿賈克斯提出,然後返回相應的信息:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) 
    AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') { 
    // I'm AJAX! 
} 

Check this out for more info

+0

這種方法可能無法達到**安全**的目的......首先......攻擊者可以在ajax中編寫自己的應用程序......其次,可以通過在http請求中注入適當的頭部來僞造ajax請求... – user1055604 2012-12-25 19:01:02