停止恶意开机自检请求
Stop Malicious POST requests
我有一个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)并使用参数 pid : 1 和 uid : 2 发出 POST 请求以 www.xyz.com/mod/mypage.php。 它仍然通过并对我的数据库进行更改。
无论如何可以检查请求是从我的 仅域/服务器?
如何阻止我的域之外的此类 POST 请求?
我想的一件事是在此请求之前生成一个令牌并在 SESSION 中设置并检查我的页面.php是否设置了令牌。这是一个可行的方法吗?
这正是CSRF代币的用途。用户必须先导航到该页面,这会生成一个要提交的令牌,因此,如果不导航到该页面,则任何POST请求都将失效。
但是,试图阻止某人从 POSTman 等实用程序向您的端点发出请求是徒劳的。您必须对端点的每个请求进行身份验证,在这种情况下,只需检查照片 ID 是否归提交客户端所有。
OWASP提供了对CSRF的体面描述:
跨站点请求伪造 (CSRF) 是一种攻击,它强制最终用户在当前经过身份验证的 Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态更改请求,而不是窃取数据,因为攻击者无法看到对伪造请求的响应。
示例验证流程
登录.php
<?php
// Establish DB connection, validate
$_SESSION['id'] = $db->getUserId();
$_SESSION['admin'] = $db->getAdminStatus();
删除.php
<?php
if (!$db->isPhotoOwner($_POST['pid'])) {
exit;
}
// Delete photo flow
管理员.php
<?php
if (!$_SESSION['admin']) {
die("Not admin.");
}
// Do admin action or whatever
您可以让调用页使用 $_SERVER['SCRIPT_NAME'] 标识自身,并将该值写入隐藏的输入字段或 $_POST 并在处理开始时检查它。 您选择的任何已确认值都可能有效。
如果他们已经在模仿你的 JSON 数据,那么可以将其放入 javascript 中,PHP 在页面服务时动态写入代码值。
- 开机自检无法正常工作,出现错误
- 类型错误:无法读取开机自检后未定义的属性“正文”(平均值)
- 在 AngularJS 和 CodeIgniter3 中开机自检数据时出现 CORS 错误
- html 开机自检数据未发送
- 快递.js开机自检空要求正文
- 取消选中通过开机自检 [] 中的回显选中的复选框
- 通过开机自检将 XML 发送到另一台服务器
- 控制器中的 MVC3 自动完成和开机自检方法
- 角度 UI 模式开机自检
- 控制器操作参数未从 AJAX 开机自检正确填充
- 王牌编辑器 - 通过开机自检在服务器上保存/发送会话
- ASP.NET Web API 2 - 如何开机自检
- 无法向服务器发送开机自检请求
- 在没有插件的情况下验证验证码?-- 跨服务器开机自检
- 默认$resource开机自检数据
- 仅在 AJAX 请求后尝试开机自检,但开机自检一直触发
- 请求方法显示选项而不是开机自检
- 开机自检请求以更新行
- 停止恶意开机自检请求
- 处理开机自检请求