【问题标题】:Stop users inputing AJAX data by visiting the endpoint URL通过访问端点 URL 停止用户输入 AJAX 数据
【发布时间】: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 不会导致无法访问数据

标签: php jquery ajax


【解决方案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 } 只能实现有限的保护。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 2016-10-29
      • 2012-06-23
      • 1970-01-01
      相关资源
      最近更新 更多