草庐IT

php 阻止 ips?值得吗

coder 2023-10-19 原文

这是我的第一篇文章,希望发布正确的内容。

我设计了这段代码,如果之前的连接是在某个时间跨度之前建立的,并且如果这个赞助人已经重复 x 次(在示例代码中:如果你在不到 10 秒内连接了 10 次),它就会阻止 ips连续,换句话说,您在访问的每个页面上花费的时间少于 10 秒)。

问题:

  • 仅仅为了检查它是否值得花费时间和计算消耗?
  • 最终目标是防止可能对我的网站造成某些损害的机器人(如果我编码错误并且没有意识到某些脚本可能会损坏我的数据库),但是机器人每次连接到某个地方时都会更改 ips所以这段代码什么都不做?
  • 我正在考虑在每个原始 php 页面的开头添加这段代码,我的意思是那些只是在服务器站点中进行更改的代码...所以也许我可以减少跨度和计数器?

希望一切都清楚。 谢谢。

$ip = preg_replace('#[^0-9.]#', '', getenv('REMOTE_ADDR'));
$sql = db_query("SELECT * FROM `protect` WHERE `ip` LIKE '$ip' AND `blocked` LIKE 1 LIMIT 1");
$count = mysqli_num_rows($sql);
if($count != 0){
    echo "Too many connections";
    exit();
}
$sql = db_query("SELECT * FROM `protect` WHERE `ip` LIKE '$ip' LIMIT 1");
$count = mysqli_num_rows($sql);
if($count != 0){
    while ($row = mysqli_fetch_array($sql, MYSQLI_ASSOC)){
        $previousCon=$row["previousCon"];
        $counter = $row["counter"];
    }
    $timeSpan=time()-strtotime($previousCon);
    if($timeSpan>10){
        $sql = db_query("UPDATE `protect` SET `counter`=0,`previousCon`=now() WHERE `ip` LIKE '$ip' LIMIT 1");
        exit();
    }else if($timeSpan<=10){
        $counter++;
        if($counter>=10){
            $sql = db_query("UPDATE `protect` SET `blocked`= '1',`previousCon`=now() WHERE `ip` LIKE '$ip' LIMIT 1");
            exit();
        }else{
            $sql = db_query("UPDATE `protect` SET `counter`='$counter',`previousCon`=now() WHERE `ip` LIKE '$ip' LIMIT 1");
            exit();
        }
    }
}else{
    $sql = db_query("INSERT INTO `protect` (`ip`,`previousCon`) VALUES ('$ip',now())");
    exit();
}

最佳答案

Is it worth the time and computing consumption just to check it?

绝对不是。

The final objective is to prevent robots that might cause some damage to my website (some script that could damage my databases if I coded something wrong and didn't realise), but will the robots change ips each time they connect to somewhere so this code will do nothing?

这里有不同的问题。

  • 如果您的脚本可能“破坏数据库”,那么只有一个查询可以造成破坏。防止重复查询不会有任何作用。您需要修复代码。 (旁注:我相信您知道,修改数据库的脚本应该使用 HTTP POST 调用,并且在大多数情况下使用 CSRF token 。这有助于防止一些意外损坏。)
  • 合法的机器人(例如索引器)通常使用相同的 IP,但通常它们也很好玩并且不会以每秒数百个请求的速度向您的网站发送垃圾邮件(通常 em>), 所以它们对你来说应该不是问题。另一方面,僵尸网络确实会更改 IP 地址,所以是的……您的代码毫无用处。

您是否考虑过许多​​请求可能来自同一 IP 地址的所有合法情况?

  • 例如,单个用户一次打开多个选项卡。你会为此禁止用户吗?
  • 代理/NAT 连接背后的许多用户,例如家庭、公共(public) wifi 或公司网络。他们都去你的网站,打开几个标签...然后被禁止?

I was thinking about adding this code at the beginning of every raw php page, I mean the ones that just make changes in the server site... so maybe I can reduce the span and counter?

说真的,不要那样做。

您有一个非常具体的用例,其中节流很有用:防止暴力破解密码(通常在登录表单中)。你不只是通过 IP 地址来做到这一点(正如我们所看到的,它大多是无用的)而是通过用户帐户来做到这一点。一个帐户的尝试失败次数太多?此帐户已锁定几分钟。

现在,如果您有一个特定的 IP 地址在向您的网站发送垃圾邮件,那么使用防火墙或 Web 服务器直接禁止它会更加有效。

关于php 阻止 ips?值得吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38652055/

有关php 阻止 ips?值得吗的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  3. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  4. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  5. ruby - 没有 nginx 的 Puma - 同一 IP 上的多个 ruby​​ 应用程序 :PORT - 2

    Nginx在生产中的重要性通常基于它为慢速客户端提供服务的能力;在RESTfulAPI的设置中,它似乎是生产堆栈的一个不必要的层,尤其是Puma(不像广泛使用的unicorn可以处理nginx工作)。Pumacanallowmultipleslowclientstoconnectwithoutrequiringaworkertobeblockedontherequesttransaction.Becauseofthis,Pumahandlesslowclientsgracefully.HerokurecommendsPumaforuseinscenarioswhereyouexpect

  6. ruby - 在描述之外使用 RSpec 的 "expect"等...它会阻止 - 2

    我正在构建一个网络应用程序自动化框架,旨在允许:当然是自动化任务轻松构建测试场景我正在使用Capybara与浏览器通信,我有一个组件库,其中包含许多辅助函数(login_to_the_back_office、create_customer等)。现在我希望我的组件可以独立使用,也可以在RSpec测试中使用。这意味着我的组件(包含在库中)没有环绕describe...it...默认情况下会阻塞,但在测试使用它们时它们会在某个时候出现,因此它们应该使用expect和friend尽可能多。我关注了rspec's.shouldfails(outsidedescribe/itblock)inRub

  7. Java IP归属地查询(离线方式+在线方式,内附查询IP方法) - 2

    一、离线方式1.1.下载ip2region.xdbGitHub项目地址:https://github.com/lionsoul2014/ip2region我们首先需要下载一个ip2region.xdb的文件下载地址:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb打开后点击如图的Download图标即可下载。下载完成后,需要将该文件放到我们的项目中。ps:我是直接放到服务器的,因为放在项目的资源文件夹下,当我们调试的时候使用JavaSpring自带的工具去获取该文件的绝对路径时,没有任何问题,能够正

  8. IP数据报格式 - 2

    1、报文格式前几篇总结过较多网络层的知识,ARP,ip地址、子网掩码等等。这次总结一下IP数据报的报文格式IP数据报的格式能够说明IP协议都具有什么功能。在TCP/IP的标准中,各种数据格式常常以32位(4字节)为单位来描述的。wireshark中IP数据报文呈现一个IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节。是所有IP数据报文必须具有的。在首部的固定部分的后面是一些可选字段,其长度可变。2、首部个字段意义  1、版本占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。版本号为6(即IPv6)  2、首部

  9. ruby-on-rails - Rails 4 - Mailer deliver_later 没有按照我的预期进行,阻止了 UI - 2

    我有一个Rails应用程序,其中有一个功能可以发送很多电子邮件。我想以异步方式的方式进行,并且我认为deliver_later方法可以做到这一点。目前,从用户单击submit到提交表单,我有一些延迟-这会导致糟糕的用户体验(这是一个非常简单的表单)。我的实现如下所示:defcreaterespond_todo|format|if@competition.save[...]send_notification_to_team_membersendenddefsend_notification_to_team_members@team.members.eachdo|member|unless

  10. ruby-on-rails - Ruby/Rails 中 CIDR 的 IP 范围? - 2

    我想做两件事:将IP地址输入转换为CIDR以下是一些示例输入:1.1.1.1192.168.*.*#=>192.168.0-255.0-255192.168.1.2-201.1.1-10.1-100检查给定的IP地址是否属于任何CIDR。这一定是一个非常快速的查询,因为它是我的网络应用程序中非常常见的查找。我正在考虑做这样的事情:defmatches?(request)valid=@ips.select{|cidr|cidr.contains?(request.remote_ip)}!valid.empty?end我认为将IP范围转换为CIDR将使查找速度比我们现在所做的更快,后者将I

随机推荐