[英]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服务器文档树之外的某个位置。
您有很多选择。 我只提到三个:
附加一个只有您自己知道并且在脚本中进行了硬编码的查询参数,例如retrieveContent.php?key=secret
。 (或在CLI模式下,为秘密的命令行参数。)在脚本中检查此参数,并且仅在与硬编码值匹配时才执行操作。
如果计划的作业是在脚本所在的同一台服务器上执行的,请将脚本移动到受以下内容保护的.htaccess
文件保护的单独目录中:
Deny from all Allow from localhost
如果您的计划作业通过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.
可以通过几种方法完成:
if(php_sapi_name() != 'cli'){ die();}
或if(PHP_SAPI != 'cli'){ die();}
根据服务器设置,以下解决方案并非总是可行:
检查$ _SERVER ['argv'],仅在if (empty($_SERVER['argv'])) { die();}
在CLI执行if (empty($_SERVER['argv'])) { die();}
设置。 除非您的服务器在HTTP请求上加载了这些内容,否则大多数情况下都是这样。
if(!empty($_SERVER['REMOTE_ADDR'])) { die();}
通过CLI调用时REMOTE_ADDR为空。
if(empty($_SERVER['TERM'])) { die();}
PHP使用终端类型加载TERM变量。 $_SERVER['SHELL']
或$_SERVER['USER']
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.