Symfony2 : Getting the "username" after an unsuccessful login attempt

标签 symfony fosuserbundle brute-force

我使用 Symfony2 和 FOSUserBundle。

我想防止对登录页面的暴力攻击。

为此我在事件上创建了一个监听器:

AuthenticationEvents::AUTHENTICATION_FAILURE

除了 IP,我还想获得用户在尝试登录时传递的“用户名”。这样我就可以得到一些黑客试图破解帐户的用户。还考虑到同一个 IP 可以属于多个用户,我可以通过这种方式区分,如果我在一秒钟内进行 5 次尝试,如果我真的面临攻击,或者只是有 5 个用户大致同时无法通过身份验证(但也许该地址“背后”有 150 个用户,所以它可能会发生 ;))。

有什么方法可以获取表单中传递的用户名?

当然,在记录IP、用户名和时间戳后,我需要实现将可疑IP 添加到黑名单表的部分。然后,我必须决定是实现选民,还是禁止让我的应用程序写入 Apache 配置文件的 IP。

谢谢!

最佳答案

我惊讶地发现解决方案围绕我正在做的事情在类上进行了一些挖掘。

我只需要做:

public function onAuthenticationFailure( AuthenticationFailureEvent $event )
{
   $token = $event->getAuthenticationToken(); 
   $username = $token->getUsername(); 
   // DO STUFF ON DB
}

编辑:根据要求我的监听器的完整代码

class LoginListener implements EventSubscriberInterface
{
protected $entityManager;
protected $container;
protected $logger;

public function __construct($entityManager, $container, $logger)
{
    $this->em = $entityManager;        
    $this->container = $container;        
    $this->logger = $logger;
}
public static function getSubscribedEvents()
{
    return array(
        FOSUserEvents::SECURITY_IMPLICIT_LOGIN => 'onImplicitLogin',
        SecurityEvents::INTERACTIVE_LOGIN => 'onSecurityInteractiveLogin',
        AuthenticationEvents::AUTHENTICATION_FAILURE => 'onAuthenticationFailure',
    );
}
public function onImplicitLogin(UserEvent $event)
{
    // LOG THE SUCCESSFUL LOGIN
    $user = $event->getUser();
    $this->writeSuccessfulLog($user); 

}
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
    // LOG THE SUCCESSFUL LOGIN
   $user = $event->getAuthenticationToken()->getUser(); // the difference with the one above is        $user = $event->getUser();
   $this->writeSuccessfulLog($user);
}

public function onAuthenticationFailure( AuthenticationFailureEvent $event )
{
    // LOG THE FAILED LOGIN
    $token = $event->getAuthenticationToken(); 
    $username = $token->getUsername();  
    $container = $this->container;
    $em = $this->em;
    $request = $container->get('request');
    $ip = $request->getClientIp();
    $userAgent = $request->headers->get('User-Agent');
    $now = new \DateTime();

    $failedLogin = new FailedLogin();
    $failedLogin->setIp($ip);
    $failedLogin->setTimestamp($now);
    $failedLogin->setUsername($username);
    $failedLogin->setUserAgent($userAgent);
    $em->persist($failedLogin);
    $em->flush();
}

writeSuccessfulLog 方法简单地记录数据库

关于Symfony2 : Getting the "username" after an unsuccessful login attempt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29973340/

相关文章:

symfony2 bundle 更新程序

php - 为什么 Symfony 在每次请求时都会从数据库重新加载用户?

symfony - 使用 FOSUserBundle 创建自定义字段

php - 事件 FOSUserBundle Symfony2 注册和登录

symfony - 交响乐 3.4 : FOS User Bundle : Override Controller

c - 从已编译的搜索程序中提取记录,C

c++ - 使用蛮力求解方程

symfony - FOS UserBundle -> 无法创建新用户

php - 使用 Doctrine 实体和 JMSserializer 避免递归

c# - 防止对 MVC 的蛮力攻击