我们有一个向Web开放的目录,我们在其中放置实用程序脚本,其中一些用于提交电子邮件,另一些用于在我们的Web服务上调用泛型函数。
在我的PHP错误日志中,我不断收到通知并警告脚本中使用的数据存在问题,例如“未定义的索引”或“试图获取非对象的属性”。
我知道这些脚本中的一些不再被使用了,但是某人尝试运行这些脚本的日志文件中仍有条目。
我可以做些什么来防止在我的合法脚本中发生这种情况?他们需要通过网页从多个页面通过ajax调用它们。
更新---
我发现他们甚至能够被僵尸程序运行的原因是该目录没有保护目录列表;这意味着机器人已经阅读了这个列表并从那里开始运行它们而不知道它们做了什么。
我添加了防止目录列表到我的.htaccess的选项,我将监视事情,看它是否有帮助。
另外注意到所有那些暗示通过IP或密码阻止保护他们的人...... 检查一些日志文件后,检查IP将无法正常工作,因为脚本是从服务器,PHP脚本和客户端的ajax调用的。另外,要使用密码保护意味着我必须修改调用脚本以传递密码的每个地方。
希望我的mods会有很大的帮助,但它可能无法阻止那些已经知道脚本的机器人。
答案 0 :(得分:0)
您可以/应该使用IP限制或登录来保护这些脚本。两者都可以使用.htaccess文件完成。这对于简单的实用程序脚本来说已经足够不过,您不应该使用类似的东西来复杂安全的应用程序。
示例.htaccess文件:
# BAN USER BY IP
<Limit GET POST>
order allow,deny
allow from all
deny from 1.2.3.4
</Limit>
# login
AuthName "Test"
AuthType Basic
AuthUserFile test/.htpasswd
require valid-user
示例.htpasswd文件
test:Qh8a4zM4Z/i1c
甚至还有这些文件的生成器。 Google找到的一些示例:http://www.toshop.com/htaccess-generator.cfm
答案 1 :(得分:0)
不要直接调用PHP脚本,也不要制作可直接调用的脚本。这是最终目标。可能不是你现在可以实现的东西。
如果采用面向对象的方法,所有PHP文件都只包含类。这意味着当您运行文件时没有任何反应。
只有 1 文件才是实际脚本,这是您的入口点。
您收到这些undefined index
消息可能是因为您没有验证输入(或存在错误)。
通常会看到如下脚本:
if ($_GET["action"] === "edit") {
// edit
} else if ($_GET["action"] === "delete") {
// delete
}
您希望将脚本称为:action.php?action=edit
,但如果您将其称为:action.php
,该怎么办?您将获得undefined index "action"
添加输入验证,如:
if (isset($_GET["action"]) === false) {
throw new Exception("Invalid input");
}
如果不再使用某个文件,请将其删除。如果您不希望从Web访问文件,请将其移出webroot。
答案 2 :(得分:0)
我通过cronjob运行脚本,并通过我通过GET的密码保护它们,如下所示:
$password = $_GET['password'];
if($password == "somethingcool") {
//the rest of your code here.
}
然后我这样调用我的脚本:script.php?password=somethingcool
。如果密码不正确,则不执行脚本。
但这有一个缺点..如果从公共页面调用它,请确保使用javascript变量来设置密码,或者机器人将简单地按照源代码中的链接。
PS:确保你过滤$ _GET ['password'],这个当前的例子不安全。
答案 3 :(得分:0)
我添加了防止目录列表到我的.htaccess的选项。
这使得机器人对脚本的执行降低到几乎为零。我可以接受我现在收到的电话号码。