我有一个AJAX函数可以调用我网站上的页面。
$(document).on('click', thisIdentity, function() {
var trigger = $(this);
var items = trigger.attr('data-values').split('_');
$.ajax({
type: "POST",
url: "/mod/mypage.php",
data : { pid : item[0], uid : item[1] },
dataType: "json",
success: function(data) {
if(data.job == 1) {
// do something
}
}
});
});
现在这样可以正常工作并按预期进行。但是,如果我使用 POSTMAN 等任何第三方应用,并向 www.xyz.com/mod/mypage.php 发出 POST 请求参数 pid:1和uid:2 。它仍然会通过并更改我的数据库。
无论如何都要检查我的请求是否已生成 域/服务器?
如何在我的域外停止此类POST请求?
我认为有一件事是在此请求之前生成一个令牌并在SESSION中设置,并在mypage.php中检查是否设置了令牌。这是一种可行的方式吗?
答案 0 :(得分:0)
这正是CSRF令牌的用途。用户必须首先导航到页面,生成要提交的令牌,而不导航到页面的ergo将使任何POST请求无效。
然而,试图阻止某人从POSTman这样的实用程序发出请求到你的终端是徒劳的。您必须验证对端点的每个请求,在这种情况下,只需检查照片ID是否由提交客户端拥有。
OWASP提供了对CSRF的体面描述:
跨站点请求伪造(CSRF)是一种攻击,它强制最终用户在当前对其进行身份验证的Web应用程序上执行不需要的操作。 CSRF攻击专门针对状态变化请求,而不是数据被盗,因为攻击者无法查看对伪造请求的响应。
<强>的login.php 强>
<?php
// Establish DB connection, validate
$_SESSION['id'] = $db->getUserId();
$_SESSION['admin'] = $db->getAdminStatus();
<强> Delete.php 强>
<?php
if (!$db->isPhotoOwner($_POST['pid'])) {
exit;
}
// Delete photo flow
<强> admin.php的强>
<?php
if (!$_SESSION['admin']) {
die("Not admin.");
}
// Do admin action or whatever
答案 1 :(得分:-1)
您可以让调用页面使用$ _SERVER ['SCRIPT_NAME']标识自己,并将该值写入隐藏的输入字段或$ _POST,并在处理开始时检查它。您选择的任何确认值都可能有效。
如果他们已经在模仿你的JSON数据,那么可以将它放到javascript中,用PHP动态地在页面服务上写代码值。