阻止用户运行仅应由 CRON 作业运行的脚本?

阻止用户运行仅应由 CRON 作业运行的脚本?

我的网站上有一个联系表单,它使用 $HTTP 请求,而不是在表单提交时重新加载。这是一个非常棒的功能,但它也带来了一些麻烦。

我的联系表单会向联系我的人发送 HTML 格式的“谢谢”电子邮件。我担心该功能会被滥用,并被用来以“我”的名义发送电子邮件。

我的解决方案是创建一个数据库并在服务器端添加一些逻辑,以防止用户每天发送超过三封电子邮件。它通过将用户的 IP 地址和他们今天发送电子邮件的次数添加到 MySQL 数据库来实现这一点。

因为我希望人们第二天能够重新开始,并且我不想保留一份 IP 地址列表,所以我创建了一个每晚运行的 CRON 作业并截断包含这些记录的表。

这里的问题是我刚刚重新打开了我原来的问题,因为有人可以弄清楚如何发送 $http 请求来以我的身份发送电子邮件,可以弄清楚如何截断表格并发送更多电子邮件。

我在 GoDaddy 有一个共享主机账户。在服务器方面我能做些什么来阻止脚本在除 CRON 作业之外的任何地方运行?

具体来说,我的第一个想法是只允许分配给我的服务器的 IP 地址运行脚本。但是,我了解到,由于各种原因,运行 CRON 作业的 IP 地址现在可能与分配给您的域的 IP 地址相同。

答案1

在共享托管帐户中或无法访问命令行的情况下,您可以通过 http(s) 使用秘密参数。我不知道 godaddy 是否允许这样做,但您可以尝试在 cronjob 调用中使用 wget 或 lynx。或者为该 http 调用使用独立的 cronjob 服务。

随机创建一个较长的字符串,将其保存在您的脚本中,并以此作为参数调用 cronjob。将此字符串保密。在您的脚本中:将参数与保存的秘密进行比较。

例如:/usr/bin/wget --quiethttp://example.org/your-cronjob.php?secret=random-string-with-20-chars-or-more

答案2

你可以做几件事

  • 使用权限确保只有拥有 cron 作业的用户才能执行该文件,例如 700 (rwx------)

  • 让脚本检查它是由谁运行的,并继续正确运行(whoami)

  • 让mysql只允许能够运行cron作业的用户与相关数据库交互(授予权限)。

  • 让脚本检查它是否以交互方式运行 - 检查是否存在PS1或使用tty -s

  • 您可以在 crontab 文件中设置环境变量并检查它是否存在于您的脚本中。

  • 您可以获取进程的 pid 并找到它的父进程,然后检查它的 crond。

可能还有其他因素,并且最有可能的是,使用上述一种或全部方法都是不错的选择。

当然,如果有人有权访问根凭据,那么一切都将无效,因为他们无论如何都可以做他们想做的事。

相关内容