我有一个小购物篮,我可以在其中添加产品。
这是我的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
}
});
};
当我点击“Apple”时,参数被发送到 ajax,并且它们在 Firefox-Web-Developer 中可见。 是否有机会隐藏这些 POST 参数?也许是为了保护它免受外界的攻击?我的想法可能完全错误,如何将其添加到篮子中?感谢您的帮助!!
这是我的网络开发人员的屏幕截图。 Web-Developer Firefox
最佳答案
您无法隐藏在 Chrome 开发者工具的“网络”选项卡中记录的内容。即使可以,黑客也可以使用 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 token 以确保请求来自您的域。这些 token 在服务器上生成,通常存储在表单中的隐藏字段中,并随每个请求发送回服务器。然后您在服务器上验证 token ,并在通过验证后执行您的操作。
请注意,这只会减慢大多数黑客的速度,但它可以阻止一些不死心执行非法请求的人。
就使用 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 token 验证:
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
}
请注意,将状态设置为错误请求是可选的,但它会显示请求不符合预期。
关于javascript - jQuery/ Ajax : How to send data to an url without showing data in web-developers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22842805/