1

我有一个在 url 中有 id= 的页面。问题是这引起了试图操纵 url 的黑客的大量不必要的关注,例如 id=133+order by 1-- (遗憾的是,更改 id 不是一种选择)

我有以下代码来获取 id 并去除任何“坏处”。

$ia = intval($_GET['id']);
$ib = mysql_real_escape_string($ia);
$ic = strip_tags($ib);

但我真正想做的是在 x 时间内禁止用户的 IP 地址。这样,如果他们曾经是一个安全漏洞,它会为我赢得时间来检测它并在黑客之前修复它(最好是安全而不是抱歉!)

还有它不必要的 CPU 使用率,我想排除它。

有谁知道一个 php 脚本,它可以检测和阻止基于 url 操作的 ip x 时间量?或者甚至更好的人喜欢展示他们已经制作的基本示例?

4

2 回答 2

1

你有几个选择:

  1. 如果源 IP 包含在您管理的某个黑名单中,则只需使请求失败,即可在 PHP 中实现 IP 阻止。
  2. 以某种方式告诉您的服务器程序(Apache,IIS,...)在接受传入连接之前阻止请求。
  3. 为自己编写一个非常简单的代理,如果它不是来自黑名单 IP 的 HTTP 请求,它会接受它,检查 ID 的语义有效性,管理黑名单,并将可接受的请求转发到您的实际网络服务器。

选项 1 相当简单:维护一个黑名单,对照它检查传入的请求,并根据需要使它们失败。您可以在此处找到更多信息,包括一个简单的代码示例:http: //perishablepress.com/how-to-block-ip-addresses-with-php/

选项 1 的问题在于,它并没有真正为您节省任何 CPU 负载,而且可能比 DaveRandom 建议的简单解析 ID 并验证它而不是源 IP 的计算涉及更多。

不幸的是,选项 2 将在很大程度上取决于您正在使用的服务器基础架构,并且在大多数情况下,不容易实现。为此,您可能必须找到一种方法来在 PHP 中修改服务器的配置文件,然后以某种方式让服务器重新读取这些文件。我还没有研究如何使用 Apache 或 IIS 来实现这一点,但是对于 Google AppEngine,我知道这对于当前的 API 是不可能的。

选项 3 将涉及大量编码(除非您可以在某处找到预制解决方案),但可能应该是最灵活的解决方案。

我不确定,但是,根据您使用的服务器,如果您的服务器提供了一个钩子,您可以在进一步处理之前检查传入的请求,甚至可以实现选项 2 和 3 之间的混合。

于 2013-04-12T11:10:46.727 回答
0

您可以从超级全局变量中获取所有必要的数据,$_SERVER您可以使用键 REMOTE_ADDR 和 REMOTE_HOST(更多信息在手册中)。

要阻止某人,您可以将此值与以前保存的值进行比较。您可以将它们保存在任何地方,例如数据库(最简单的解决方案)或外部文件中。为了更安全,服务器不应访问此文件。

然而,这并不是一个完美的解决方案,因为可能会更改 IP 地址以及动态设置的问题。

在您的数据库/文件中,您可以添加一个像“过期”这样的字段,在此之后用户可以被允许。

但正如我在评论中所说,我不会阻止任何人。正如@DaveRandom 所写,您可以简单地将id转换为整数,这将使您远离 SQL 注入。请记住,您应该考虑从客户端获取和处理的所有变量,这些变量$_POST也是如此。

于 2013-04-12T11:09:04.317 回答