【问题标题】:php script prevent direct accessphp脚本阻止直接访问
【发布时间】:2012-01-25 09:45:04
【问题描述】:

我正在使用 ajax 从 php 脚本(例如 cost.php)中获取价值,我知道直接访问它并获得该价值会很容易。我什至在同一个脚本(cost.php)上运行 cron 作业,所以如果我使用以下脚本,cron 作业将无法工作......

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  //code here
  die('Invalid Request!');
}

这是安全的预防方法吗,如果我使用上述代码,cron 作业将无法工作,那么我可以使用什么来确保最终用户的价值。谢谢。

【问题讨论】:

  • 为什么要对最终用户隐藏价值?使用从您的 cronjob 定义的密码,该密码也在 php 脚本中定义。并且对值的 ajax 调用使用除了 sql 攻击保护之外的任何安全性。
  • 如果脚本正在向 Ajax 请求返回值,则数据已经“在外面”供用户查看。
  • 我们正在从这个脚本中产生价值,我们不想被废弃。

标签: php


【解决方案1】:

为了单独执行cronjob,可以考虑使用php_sapi_name

一个简单的用法(更可靠,取决于服务器端变量):-

if (php_sapi_name() == "cli") // via cronjob or via cli
{
  die("invalid request");
}

PS:常量 PHP_SAPI 携带相同的值,所以你可以重写为:-

if (PHP_SAPI == "cli")
{
  die("invalid request");
}

【讨论】:

    【解决方案2】:
    if (!eregi('cost.php',basename($_SERVER["REQUEST_URI"]))) { die('access denied'); }
    

    【讨论】:

    • @richsage:是的,对,谢谢你提到......刚刚从一个旧项目中复制了这条线。因此,请改用 preg_match。
    【解决方案3】:

    为 cronjob 使用秘密密码

    if (isset($_REQUEST['cronpw']) && $_REQUEST['cronpw'] == 'supersecret')
    {
        // this is the cronjob
    }
    else
    {
        // this not
    }
    

    【讨论】:

      【解决方案4】:

      在代码顶部添加此项以停止直接脚本访问。

      if (!defined('BASEPATH')) exit('No direct script access allowed');
      

      如果你想允许 AJAX 请求,那么,

      if (!defined('BASEPATH') &&
      strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest')
      exit('You are not allowed here...');
      

      【讨论】:

        猜你喜欢
        • 2011-02-10
        • 2022-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 2017-08-06
        • 2014-10-12
        相关资源
        最近更新 更多