【问题标题】:Prevent other users from calling php file [closed]防止其他用户调用php文件[关闭]
【发布时间】:2014-02-05 22:30:20
【问题描述】:

这里我有一个 PHP 代码:

更新:

<?php
  $pdo=new PDO("mysql:dbname=gmaestro_agro;host=localhost","gmaestro_agro","pass");
  $statement=$pdo->prepare("SELECT * FROM stat");
  $statement->execute();
  $results=$statement->fetchAll(PDO::FETCH_ASSOC);
  $json=json_encode($results);
  echo $json;
?>

我用 Ajax 调用这段代码来从 MySql 数据库中获取数据,但是当一些在域 http://mywebsite.com/get_json.php 上运行时,这段代码会向任何人提供我的数据库的信息。我怎样才能阻止其他用户调用它,所以只有我的 JS Ajax 代码才能调用它?

【问题讨论】:

  • 您最初的问题是关于使用mysql_* 的INSERT。您的更新有一个使用 PDO 的 SELECT。你应该决定你想问什么,这只是在浪费大家的时间。
  • 对不起......我只是想阻止调用php文件
  • 我已经更新了我的答案。

标签: php mysql ajax


【解决方案1】:

没有完全可靠的方法可以确定,脚本是通过 AJAX 调用的。你可以做的事情:

  1. 进行适当的验证(以防止创建空行)
  2. 你可以查看HTTP_REFERRER,(注意:这个值是可以伪造的)
  3. 你可以使用

    isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'

当然,这也可以伪造

【讨论】:

  • 您还可以对 Javascript 代码进行混淆处理,这样就很难有人对其进行逆向工程。
  • 我更新了我的问题,请看一下,当我使用 PDO 时会发生变化吗?
  • 不需要任何逆向工程,例如简化查看 Firebug 的网络选项卡以查看发送到服务器的请求。因此,出于这个特殊原因,不值得努力混淆某些东西
  • 嗯,你说“所以我怎么能阻止这个从用户调用,那么如何只用我的 JS AJAX 代码调用它?” -> 如果只有授权人员才能看到此数据,您必须检查用户是否有权在您的脚本中获取 JSON 数据 - 还是我忽略了一些明显的东西?在我看来,在这种情况下,检查是否通过 AJAX 调用并不是真正必要的。
【解决方案2】:

至少您应该检查是否发出了POST 请求:

if ($_SERVER['REQUEST_METHOD'] === 'POST')
{
  // your code
}

这样您就不会在每次通过GET 请求该页面时都用空条目填充数据库。

您的代码还允许匿名发帖。它可能是这样设计的,但如果不是,您应该检查登录用户。通常你会使用sessions。

除此之外,您应该验证各个字段,有些可能是空的,但有些可能必须在您插入之前填写。

编辑:您还可以在“主”页面中设置会话变量并在 ajax 脚本中检查该变量。这样,访问者必须至少访问一次主页,但在那之后,可以毫无问题地请求 ajax 脚本。

【讨论】:

  • 我更新了我的问题,请看一下,当我使用 PDO 时会发生变化吗?
【解决方案3】:

在 POST 中发送附加信息,例如 $_POST['From_ajax'],然后检查您的 PHP 程序是否设置了该信息 - 如果没有,则不执行任何操作,否则执行数据库命令。

编辑:当然,如果他们尝试任何人都可以弄清楚它是如何工作的,并且如果他们愿意,也可以调用您的脚本,这只会防止打开脚本的随机用户意外执行脚本。如果您真的不希望其他人能够调用您的脚本,我猜您可能需要某种电子签名。

【讨论】:

  • 我更新了我的任务,所以请看一下,
猜你喜欢
  • 2011-04-21
  • 2018-07-28
  • 2023-03-24
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
相关资源
最近更新 更多