2014-04-03 67 views
2

我有一個可以添加產品的小店。jQuery/Ajax:如何在不顯示網頁開發人員數據的情況下將數據發送到網址

這裏是我的index.php

...<script type="text/javascript" src="function.js"></script> 
<a title="Add to basket" onclick="add_product_to_cart('apple','1');" href="#">Apple</a><br>... 

這裏是functions.js

function add_product_to_cart(item, id) { 
    var item = item; 
    var id = id; 

    $.ajax({ 
     url: "ajax.php", 
     type: "POST", 
     data: { 
     action: "add", 
     name: item, 
     id: id 
     }, 
    success: function(data) { 
     //do something 
    } 
    }); 
}; 

當我點擊「蘋果」,參數發送給阿賈克斯,他們是可見例如在Firefox-Web-Developer中。 是否有機會隱藏這些POST參數?也許是爲了保護它免受外界攻擊?我的想法可能完全錯誤,如何將它添加到籃子?謝謝你的幫助!!

以下是我的網頁開發人員的屏幕截圖。 Web-Developer Firefox

+3

無論他們是否看到它們都無所謂 - 如果他們可以在網絡請求中看到它,他們可以在您的客戶端代碼中找到它。 – tymeJV

+3

我們的公司網站上有這樣的問題。客戶使用開發工具從停產項目獲取產品代碼並將其放入另一個「添加到購物車」按鈕中。我沒有找到隱藏參數的方法,所以我在AJAX中進行了一次檢查,以確保這些值是真實的並且沒有被篡改。 –

+0

@tymeJV:有沒有辦法讓它比調用url來添加更好的東西?在我的ajax.php中是一個簡單的函數,它將該特性添加到SESSION中。 – Zwen2012

回答

4

您無法隱藏Chrome Developer Tools的「網絡」選項卡中記錄的內容。即使可以,黑客也可以使用Fiddler或其他Web代理來嗅探請求。客戶端驗證很好,但不是最終的。大多數人不會試圖非法地向你的服務器發送請求,但我會想到一些。

你真的應該做服務器端驗證,發送到服務器的數據確實是有效的。不要依賴客戶端來做到這一點,因爲任何人都可以修改直接發送到服務器的內容。在你的PHP代碼,你會做這樣的事情:

function validate_data($data) 
{ 
    // other code here 
    if(!is_discontinued($data['product_id'])) 
     add_to_cart($data['product_id']); 
    // other code after 
} 

function is_discontinued($product_id) 
{ 
    // do database query 
    $is_discontinued = lookup_product($product_id); 
    return $is_discontinued; 
} 

這是非常準系統,但它應該給你需要做的事情的想法。

編輯: 看過最近的一些評論之後,您可能還希望包含CSRF令牌以確保請求來自您的域。這些令牌是在服務器上生成的,並且通常存儲在表單中的隱藏字段中,並隨每個請求一起發送回服務器。然後您驗證服務器上的令牌,並在驗證通過後執行您的操作。

注意,這隻會減緩大多數黑客,但它可以阻止一些沒有執行非法請求的人死亡。

就發送帶有AJAX請求的值而言,您需要選擇隱藏字段並將其值添加到POST數據。然後,您的AJAX請求將是這個樣子:

function add_product_to_cart(item, id) { 
    var item = item; 
    var id = id; 

    $.ajax({ 
     url: "ajax.php", 
     type: "POST", 
     data: { 
     action: "add", 
     name: item, 
     id: id, 
     token: $('#csrf_token').val() 
     }, 
    success: function(data) { 
     //do something 
    } 
    }); 
}; 

在服務器(PHP),你有這樣的事情:

function get_csrf_token() 
{ 
    $token = md5(uniqid(rand(), TRUE)); 

    if (!isset($_SESSION['token'])) { 
     $_SESSION['token'] = $token; 
    } 
    else 
    { 
     $token = $_SESSION['token']; 
    } 

    return $token; 
} 

function valid_csrf_token() 
{ 
    if(isset($_POST['token'])){ 
     if($_POST['token'] == $_SESSION['token']) 
      return true; 
     else 
      return false; 
    } 
    else { 
     return false; // no token was sent with the request 
    } 
} 
在窗體

然後,你將有你的隱藏字段一樣這樣的:

<input id="csrf_token" type="hidden" value="<?php get_csrf_token(); ?>" /> 

最後,你原來的PHP驗證功能將包括CSRF令牌驗證:

function validate_data($data) 
{ 
    // other code here 
    if(!is_discontinued($data['product_id']) && valid_csrf_token()) 
     add_to_cart($data['product_id']); 
    else 
     header('HTTP/1.1 400 Bad Request', true, 400); // set status to bad request 
    // other code after 
} 

請注意,將狀態設置爲錯誤的請求是可選的,但它會顯示請求不符合預期。

+1

非常感謝您對我的其他問題發表的評論,幫助我提高了應用程序的安全性! – Zwen2012

1

答案是:不,您無法隱藏您使用AJAX發送到服務器的數據。

但這不應該是一個問題,因爲你必須驗證服務器上的所有內容。

您可以在客戶端驗證事情(對於普通用戶),以便在客戶端上獲得更輕鬆/更快的響應,並獲得更少的服務器流量。但是,如上所述,您必須重新驗證服務器上的所有內容,因爲這是確保即使將惡意數據發送到您的服務器的唯一方式,您的網站仍可按預期工作。

順便說一句,你甚至可以阻止/禁止試圖使你的未修改的客戶端代碼通常做的不同的用戶。

+1

感謝您的回答! – Zwen2012

相關問題