繁体   English   中英

如何确保我的PHP脚本仅作为计划作业而不是从浏览器运行?

[英]How can I ensure my PHP script is only run as a schedule job and not when run from a browser?

每次我打开例如retrieveContent.php脚本时,都会执行该脚本并将记录插入数据库中。 由于我在计划作业中使用了此脚本,因此应该不会有问题。

但是,我注意到一个用户找到了脚本路径,并确实打开了执行的retrieveContent.php文件,并在数据库中插入了一条记录。 如何防止用户使用PHP进行浏览器交易? 提前致谢!

查看php_sapi_name()函数。 它会告诉您是否在CLI(命令行界面)中运行。

http://php.net/manual/zh/function.php-sapi-name.php

您还可以将PHP脚本移动到Web服务器文档树之外的某个位置。

您有很多选择。 我只提到三个:

  1. 附加一个只有您自己知道并且在脚本中进行了硬编码的查询参数,例如retrieveContent.php?key=secret (或在CLI模式下,为秘密的命令行参数。)在脚本中检查此参数,并且仅在与硬编码值匹配时才执行操作。

  2. 如果计划的作业是在脚本所在的同一台服务器上执行的,请将脚本移动到受以下内容保护的.htaccess文件保护的单独目录中:

     Deny from all Allow from localhost 
  3. 如果您的计划作业通过HTTP获取脚本,请找出哪个用户代理在$_SERVER['HTTP_USER_AGENT'] ,并且仅在该用户代理访问了脚本的情况下执行操作。 但这不太安全,因为用户可以伪造用户代理(如果他设法找到正确的代理)。

通过CLI调用时,将秘密参数传递给脚本,并在PHP端进行确认。 例如:

-- terminal --
php script.php secret-argument

-- script.php --
<?php
if(!isset($argv[1]) || $argv[1] != 'secret-argument')
{
   die('restricted access');
}

// Rest of script

$ argv是一个PHP全局变量, Contains an array of all the arguments passed to the script when running from the command line.

可以通过几种方法完成:

  1. if(php_sapi_name() != 'cli'){ die();}if(PHP_SAPI != 'cli'){ die();}

根据服务器设置,以下解决方案并非总是可行:

  1. 检查$ _SERVER ['argv'],仅在if (empty($_SERVER['argv'])) { die();}在CLI执行if (empty($_SERVER['argv'])) { die();}设置。 除非您的服务器在HTTP请求上加载了这些内容,否则大多数情况下都是这样。

  2. if(!empty($_SERVER['REMOTE_ADDR'])) { die();}通过CLI调用时REMOTE_ADDR为空。

  3. if(empty($_SERVER['TERM'])) { die();} PHP使用终端类型加载TERM变量。 $_SERVER['SHELL']$_SERVER['USER']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM