Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:防洪水/垃圾邮件系统_Php_Security_Spam_Brute Force_Flooding - Fatal编程技术网

PHP:防洪水/垃圾邮件系统

PHP:防洪水/垃圾邮件系统,php,security,spam,brute-force,flooding,Php,Security,Spam,Brute Force,Flooding,实际上,我正在从事一个PHP项目,该项目将具有一个用户系统(登录、注册、向电子邮件发送丢失的密码等等),我认为这可能非常容易受到暴力攻击和/或垃圾邮件(向某人的电子邮件发送密码1000次,等等。使用你的幻想) 今天的web服务器(Apache、IIS)是否有某种针对暴力的内置防御 实施反垃圾邮件/泛滥系统的最佳方式是什么,例如:希望一个页面每分钟调用次数不能超过两次,但另一个页面每分钟最多调用100次左右 我肯定要存储IP地址、他们上次访问某个页面的时间和某处的访问次数,但将其存储在文本文

实际上,我正在从事一个PHP项目,该项目将具有一个用户系统(登录、注册、向电子邮件发送丢失的密码等等),我认为这可能非常容易受到暴力攻击和/或垃圾邮件(向某人的电子邮件发送密码1000次,等等。使用你的幻想)

  • 今天的web服务器(Apache、IIS)是否有某种针对暴力的内置防御
  • 实施反垃圾邮件/泛滥系统的最佳方式是什么,例如:希望一个页面每分钟调用次数不能超过两次,但另一个页面每分钟最多调用100次左右

    • 我肯定要存储IP地址、他们上次访问某个页面的时间和某处的访问次数,但将其存储在文本文件/数据库(MySQL)中是否足够高效

    • 我应该使用CAPTCHA来注册/恢复丢失的密码吗

    • “文本”验证码是否可行?(类似于“5加9减2等于多少?”)

    • 页面不会被那么多用户使用(100-200),我真的需要实现所有这些吗

  • 是的,在数据库中存储IP地址、上次访问和访问次数就可以了
  • 建议使用CAPTCHA注册/恢复密码,以防止垃圾邮件发送电子邮件地址。也要停止暴力强迫
  • 是的,文本CAPTCHA是可能的,尽管对某人来说破解并编写脚本来自动回答要容易得多。免费验证码,我推荐
  • 这取决于你对安全的关注程度。我当然建议使用验证码,因为它们很容易实现

  • 存储IP地址是记录和跟踪的好方法,但我认为只要验证码就可以停止垃圾邮件、暴力攻击和洪水泛滥


    Recaptcha确实是一个很好的解决方案。

    除了按照Gazler的指示进行操作外,您还应该有一些方法来计算登录尝试次数。如果所有登录尝试的总数大于X,那么要么开始使用sleep命令,要么就说服务器有高负载。

    当然,您的目标受众可能不多,但如果是在公共域中,那么它很容易受到攻击

    现在文本验证码很容易破解相信我


    对于反垃圾邮件/洪水系统,您可以记录IP地址(最好是MySQL)并添加登录重试的时间限制,关于CAPTCHA:除非您真的需要,否则我建议不要使用CAPTCHA。为什么?

  • 很难看
  • 这对你的用户来说很烦人。你不应该让他们为了使用你的网站而跳转
  • 有一些非常简单、非常有效且对(几乎所有)用户完全透明的替代方案

  • 蜜罐字段:在表单中添加一个字段,该字段的通用名称为“网站”。在它旁边,添加一个标签,上面写着“不要在这个盒子里写字”。使用Javascript隐藏输入和标签。收到表单提交时,如果字段中有任何内容,请拒绝输入

    使用JS的用户不会看到它,而且会很好。没有JS的用户只需遵循简单的说明即可。Spambots会爱上它,并展现自己

  • 自动伪造验证码:与上述类似。添加带有标签的输入字段(例如)。使用Javascript(并且知道大多数自动垃圾邮件机器人不会运行JS),隐藏字段并用“Alex”填充它。如果提交的表单没有神奇的单词,那么忽略它

    使用JS的用户不会看到它,而且会很好。没有JS的用户只需遵循简单的说明即可。Spambots不知道该做什么,你可以忽略他们的输入

  • 这将保护您免受99.9%的自动垃圾邮件机器人的攻击。它不会做的,哪怕是一点点,就是保护你不受有针对性的攻击。有人可以定制他们的机器人,以避免蜜罐或始终填写正确的值


    关于暴力拦截:服务器端解决方案显然是唯一可行的方法。在我当前的一个项目中,我实现了一个蛮力保护系统,非常类似于您所描述的。CakePHP就是以此为基础的

    算法相当简单,但最初有点混乱

  • 用户请求一些操作(例如重置密码)
  • 运行:
    DELETE*FROM brute\u force WHERE expires
  • 运行:

    SELECT COUNT(*) FROM brute_force 
    WHERE action = 'passwordReset'
    AND ip = <their ip address>
    
  • 继续执行重置密码功能

  • 这将允许用户在Y分钟内仅尝试重置密码X次。根据需要调整这些值。也许5分钟内重置3次?此外,每个操作可能有不同的值:对于某些事情(例如:生成PDF),您可能希望在10分钟内将其限制为10。

    不要尝试在PHP中实现所有逻辑-堆栈中实现的逻辑越低,处理的效率就越高

    大多数防火墙(包括BSD/Linux上的iptables)都有连接限制。另外,请看一看用于DDOS/暴力攻击预防的mod_security

    应该围绕这样一个理念来设计你的应用程序,即此类攻击不会让攻击者访问应用程序-最终你无法阻止DOS攻击,尽管你可以限制其有效性

    依靠来自攻击者的一致IP地址没有多大价值——有很多方法可以绕过它

    e、 g.跟踪每个用户登录之间的密码重置请求数。在密码重置表单中,如果用户提交未知的电子邮件地址,则以完全相同的方式(向客户端)响应。记录无效的电子邮件地址

    C.

    我同意你的回答。极限
    INSERT INTO brute_force (ip, action, expires)
    VALUES (<their ip address>, 'passwordReset', NOW() + Y minutes)