通过访问端点 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 中,您需要验证所传递的参数是否符合您可接受的定义。

例如,您可能需要检查namedescription 参数是否在某个字符长度以下,或者当前登录的用户是否有权更新相关记录。

仔细考虑什么是可接受的,什么是不可接受的。添加这些检查后,用户“访问该 URL 并绕过表单添加记录”就无关紧要了。

【讨论】:

【参考方案2】:

我认为可能的解决方案是,如果您的变量 namedescription 未使用 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 数据的主要内容,如果未能解决你的问题,请参考以下文章

网页中怎样禁止通过输入url直接访问

laravel,从输入到控制器功能的ajax调用500错误

判断手机端用户打开页面时是android还是ios,并将判断结果通过ajax返回给url接口,传递回去

在浏览器中通过 URL 访问时找不到端点

如何不让用户直接从AJAX使用的浏览器访问php文件?

网页中怎样禁止通过输入url直接访问