【发布时间】:2010-04-18 01:39:27
【问题描述】:
我有一个 PHP 脚本,我不希望任何人能够通过他们的浏览器运行它。
它发送电子邮件并由我的服务器的 cron 通过 curl 调用,但需要位于公共 www 目录中。我需要什么权限或所有者将文件设置为只允许我的服务器的 curl 执行(或者我的意思是读取)文件?
我在 centos 上。
谢谢!
【问题讨论】:
标签: php permissions curl cron
我有一个 PHP 脚本,我不希望任何人能够通过他们的浏览器运行它。
它发送电子邮件并由我的服务器的 cron 通过 curl 调用,但需要位于公共 www 目录中。我需要什么权限或所有者将文件设置为只允许我的服务器的 curl 执行(或者我的意思是读取)文件?
我在 centos 上。
谢谢!
【问题讨论】:
标签: php permissions curl cron
您可以通过在目录中放置具有适当访问限制的 .htaccess 文件来限制对文件的访问,或者通过在 php 文件的开头实施基本密码检查,如下所示:
<?php
$password = $_GET['password'];
hash = '40bd001563085fc35165329ea1ff5c5ecbdbbeef'; //precalculated sha1 hash of your password
if (sha1($password) != $hash) {
die('Forget it!');
}
为了增加安全性,这可以进一步完善,但你明白了......
【讨论】:
如果可以,我建议您采用不同的方式:通过 CLI 运行脚本(在 cron 作业中调用 php -f)并让 PHP 脚本检查其运行方式。您可以使用php_sapi_name() 了解是否从命令行界面调用脚本,并在从 Web 调用它时终止。据我所知,这将是最安全的解决方案。
如果你真的需要通过curl获取它,使用Josh的解决方案或者定义一个需要添加到脚本中的密码作为get参数:
curl domain.com/script.php?password=123456
不是非常安全,因为密码会在 crontab 中可见,但应该提供适当的保护以防止来自外部的访问,特别是如果您将它与检查 $_SERVER["REMOTE_ADDR"] 并确保它是 127.0.0.1 结合使用。
【讨论】:
为什么不直接使用 php-cli 从命令行而不是通过 curl 来运行它?
如果你真的需要托管它,你可以在你的 .htaccess 中做这样的事情
<Directory /your/path/>
Order allow,deny
Allow from 192.168.1.0/24
Allow from 127
</Directory>
【讨论】:
正如所言,这是不可能的。据我所知,我认为您可以使用多种选项来解决您的问题:
您可以 chown root 或其他用户,然后 chmod 700,然后使用所有者的 crontab 文件中的 PHP 命令行功能从 cronjob 调用脚本。
如果您需要通过 curl 访问文件,那么您将访问 Web 服务器,并且 Web 服务器需要能够执行/读取脚本,这将允许任何人执行该脚本。
另一种选择是使用基于规则的访问控制,如下所述:http://library.linode.com/web-servers/apache/access-control/rule-based-access 以确保只有来自您的服务器的连接才能访问相关文件,但这本身并不完全理想。
当然还有其他解决方案,但我希望这会有所帮助。
【讨论】: