通过访问端点 URL 停止用户输入 AJAX 数据
Posted
技术标签:
【中文标题】通过访问端点 URL 停止用户输入 AJAX 数据【英文标题】:Stop users inputing AJAX data by visiting the endpoint URL 【发布时间】:2019-02-13 17:26:14 【问题描述】:我有一个简单的表单,它将表单数据发送到 update.php,然后将数据插入到 mysql 数据库中的表中。
$.ajax(
url: '/actions/update.php',
type: 'post',
data:
name: 'name-data',
description:'description-data'
,
success: function( data, textStatus, jQxhr )
console.log(data);
,
error: function( jqXhr, textStatus, errorThrown )
console.log(errorThrown);
);
表格工作正常,数据完美地添加到数据库中。问题在于,理论上,如果用户知道数据发布到的 URL(如果查看源代码,他们可能会知道),那么他们可以访问该 URL 并绕过表单添加记录。例如访问 /actions/update.php 会在数据库中添加一条空白记录。
是否可以阻止用户访问该文件/目录,同时仍允许向其发布数据?
【问题讨论】:
你在update.php
中尝试过header
吗?
如果您的项目是 Codeigniter 项目,那么将 CSRF 添加到您的表单可能有助于避免未经授权的随机帖子。你也可以在没有 Codeigniter 的情况下做到这一点,但这需要更多的工作。
在update.php
顶部尝试header('Location: somepage.php/');
您可以尝试通过从另一个文件导入或使用密钥来隐藏 url。我会说使用密钥
@ZainFarooq 不会导致无法访问数据
【参考方案1】:
是否可以在仍然阻止用户访问该文件/目录时 允许向其发布数据?
这是对问题的错误思考方式。
如果客户端 javascript 可以发出该请求,那么用户可以对同一个 PHP 文件发出任何请求。
相反,在您的 PHP 中,您需要验证所传递的参数是否符合您可接受的定义。
例如,您可能需要检查name
和description
参数是否在某个字符长度以下,或者当前登录的用户是否有权更新相关记录。
仔细考虑什么是可接受的,什么是不可接受的。添加这些检查后,用户“访问该 URL 并绕过表单添加记录”就无关紧要了。
【讨论】:
【参考方案2】:我认为可能的解决方案是,如果您的变量 name
和 description
未使用 post
请求设置,您可以阻止用户
if(isset($_POST['name']) && isset($_POST['description']))
//do your task
else
header('Location:otherpage.php')// redirecting it to other page if user visits it directly
【讨论】:
【参考方案3】:如果用户可以访问该 URL,则表示允许 GET 请求。您只需要接受 POST 请求即可。
【讨论】:
您仍然可以通过邮递员等第三方应用程序访问数据 用户总是可以创建一个随机的 html 表单并仍然发布到他的控制器,除非“请求源”有一些服务器端验证。所以添加 if($_SERVER['REQUEST_METHOD'] === 'POST') //allow data to be inserted else //reject request 只能实现有限的保护。以上是关于通过访问端点 URL 停止用户输入 AJAX 数据的主要内容,如果未能解决你的问题,请参考以下文章