您無法隱藏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
}
請注意,將狀態設置爲錯誤的請求是可選的,但它會顯示請求不符合預期。
無論他們是否看到它們都無所謂 - 如果他們可以在網絡請求中看到它,他們可以在您的客戶端代碼中找到它。 – tymeJV
我們的公司網站上有這樣的問題。客戶使用開發工具從停產項目獲取產品代碼並將其放入另一個「添加到購物車」按鈕中。我沒有找到隱藏參數的方法,所以我在AJAX中進行了一次檢查,以確保這些值是真實的並且沒有被篡改。 –
@tymeJV:有沒有辦法讓它比調用url來添加更好的東西?在我的ajax.php中是一個簡單的函數,它將該特性添加到SESSION中。 – Zwen2012