¿Su interfaz de inicio de sesión es realmente segura?

Autor: da da da da beat Code

https://juejin.im/post/6859214952704999438

Prefacio

Cuando todo el mundo aprende a escribir programas, la primera línea de código es todo hello world. Pero cuando empiezas a aprender la tecnología de fondo WEB, la primera función de muchas personas es escribir inicio de sesión (en voz baja: no conozco a otros, de todos modos lo soy).
Pero cuando entrevisté o me comuniqué con muchos compañeros con poca experiencia laboral, encontré que muchos compañeros escribieron en sus currículums:, 负责项目的登录/注册功能模块的开发和设计工作pero simplemente implementaron la lógica funcional y no consideraron demasiado en términos de seguridad. Este artículo es principalmente para charlar con usted. Al diseñar una interfaz de inicio de sesión, no es solo una realización funcional, sino también lo que debemos considerar en términos de seguridad.

Riesgo de seguridad

¡Fuerza bruta!

Siempre que el sitio web esté expuesto en la red pública, existe una alta probabilidad de que sea un objetivo. Intente explotar de esta manera simple y efectiva:
después de obtener el nombre de usuario del sitio web de varias maneras, escriba un programa para recorrer todos los posibles Contraseña hasta que se encuentre la contraseña correcta

El pseudocódigo es el siguiente:

# 密码字典
password\_dict = \[\]
# 登录接口
login\_url = ''
def attack(username):
 for password in password\_dict:
     data = {'username': username, 'password': password}
       content = requests.post(login\_url, data).content.decode('utf-8')
       if 'login success' in content:
           print('got it! password is : %s' % password)

Entonces, ¿cómo prevenimos esta situación?

Código de verificación

Un compañero de clase inteligente acaba de pensar en ello, ¡puedo agregar la verificación del código de verificación cuando su contraseña es incorrecta un cierto número de veces! Por ejemplo, configuramos que cuando la contraseña del usuario es incorrecta 3 veces, el usuario debe ingresar el código de verificación de imagen para continuar con la operación de inicio de sesión:

El pseudocódigo es el siguiente:

fail\_count = get\_from\_redis(fail\_username)
if fail\_count >= 3:
 if captcha is None:
  return error('需要验证码')
    check\_captcha(captcha)
success = do\_login(username, password)
if not success:
 set\_redis(fail\_username, fail\_count + 1)

El pseudocódigo no considera la concurrencia y el desarrollo real puede considerar el bloqueo.

De hecho, esto puede filtrar algunos ataques ilegales, pero con la tecnología de OCR actual, los códigos de verificación de imágenes comunes son realmente difíciles de prevenir eficazmente a los robots (hemos sufrido mucho por esto). Busque la ordenada pública: rHub , [   ] para obtener el tutorial de introducción para la parte frontal y posterior. Por supuesto, también podemos gastar dinero para comprar un esquema de verificación similar a la verificación deslizante proporcionada por la empresa externa, pero no es 100% seguro y se puede descifrar (una lección dolorosa).

Restricciones de inicio de sesión

En este momento, algunos estudiantes dijeron que puedo restringir directamente la operación de inicio de sesión de usuarios anormales. Cuando el error de contraseña llega a un cierto número de veces, el inicio de sesión del usuario se rechazará directamente y el usuario se restablecerá después de un período de tiempo. Por ejemplo, cuando configuramos una cuenta para iniciar sesión con 10 errores, todas las operaciones de inicio de sesión de la cuenta serán rechazadas en 5 minutos.

El pseudocódigo es el siguiente:

fail\_count = get\_from\_redis(fail\_username)
locked = get\_from\_redis(lock\_username)

if locked:
 return error('拒绝登录')
if fail\_count >= 3:
 if captcha is None:
  return error('需要验证码')
    check\_captcha(captcha) 
success = do\_login(username, password)
if not success:
 set\_redis(fail\_username, fail\_count + 1)
    if fail\_count + 1 >= 10:
     # 失败超过10次,设置锁定标记
     set\_redis(lock\_username, true, 300s)

Umm, esto de hecho puede resolver el problema de la destrucción de la contraseña del usuario. Sin embargo, esto conllevará otro riesgo: aunque el atacante no puede obtener la información del usuario del sitio web, puede evitar que todos los usuarios de nuestro sitio web inicien sesión.
El atacante solo necesita recorrer todos los nombres de usuario (incluso si ninguno, aleatorio) para iniciar sesión, entonces estos usuarios siempre estarán bloqueados, lo que provocará que los usuarios normales no puedan iniciar sesión en el sitio web.

Restricciones de IP

Dado que no es posible apuntar directamente al nombre de usuario, podemos tratar con la dirección IP. Si la IP del atacante se bloquea directamente, todo estará bien. Podemos configurar que cuando la cantidad de errores al llamar a la interfaz de inicio de sesión bajo una determinada IP alcance una cierta cantidad, la IP tenga prohibido iniciar sesión.

El pseudocódigo es el siguiente:

ip = request\['IP'\]
fail\_count = get\_from\_redis(fail\_ip)
if fail\_count > 10:
 return error('拒绝登录')
# 其它逻辑
# do something()
success = do\_login(username, password)
if not success:
 set\_redis(fail\_ip, true, 300s)

Esto también puede resolver el problema hasta cierto punto. De hecho, muchas operaciones de limitación de corriente se realizan en IP. Por ejemplo, el módulo de limitación de corriente de nginx puede limitar el número de accesos de una IP dentro de una unidad de tiempo.
Pero todavía hay problemas aquí:

  • Por ejemplo, muchas escuelas y empresas ahora usan la misma IP de exportación. Si restringe directamente la IP, puede matar accidentalmente a otros usuarios normales.

  • Con tantas VPN ahora, los atacantes pueden cambiar las VPN para atacar después de que se bloquee la IP

Verificación de teléfono

¿No hay una mejor manera de prevenirlo? Por supuesto que sí. Podemos ver que en los últimos años, casi todas las aplicaciones han permitido a los usuarios vincular sus teléfonos móviles. Uno son los requisitos de la política de nombre real del país, y el segundo es que los teléfonos móviles son básicamente lo mismo que las tarjetas de identificación y básicamente pueden representar la identidad de una persona. Muchas operaciones de seguridad se basan en la verificación del teléfono móvil y también es posible iniciar sesión.

  1. Cuando el usuario ingresa la contraseña más de 3 veces, se requiere que ingrese el código de verificación (la verificación de diapositivas es la mejor)

  2. Cuando el usuario ingresa la contraseña más de 10 veces, aparece la verificación del teléfono móvil, que requiere que el usuario inicie sesión con el código de verificación del teléfono móvil y la autenticación dual de contraseña.

El código de verificación anti-deslizamiento del teléfono móvil es otro problema. No comenzaré aquí. Hablaré sobre lo que hemos hecho en el futuro cuando tengamos tiempo.

El pseudocódigo es el siguiente:

fail\_count = get\_from\_redis(fail\_username)

if fail\_count > 3:
 if captcha is None:
  return error('需要验证码')
    check\_captcha(captcha) 
    
if fail\_count > 10:
 # 大于10次,使用验证码和密码登录
 if dynamic\_code is None:
     return error('请输入手机验证码')
    if not validate\_dynamic\_code(username, dynamic\_code):
     delete\_dynamic\_code(username)
     return error('手机验证码错误')

 success = do\_login(username, password, dynamic\_code)
    
 if not success:
     set\_redis(fail\_username, fail\_count + 1)

Hemos combinado los métodos mencionados anteriormente y hemos agregado el modo de verificación del código de verificación del teléfono móvil, que básicamente puede prevenir una cantidad considerable de atacantes maliciosos. Pero ningún sistema es absolutamente seguro, solo podemos aumentar el costo del atacante tanto como sea posible. Puede elegir la estrategia adecuada de acuerdo con la situación real de su sitio web. Busque el número vertical público: b , siga la respuesta [  vue  ] para obtener el tutorial introductorio para el principio y el final.

¿Hombre en el medio del ataque?

¿Qué es un hombre en el medio del ataque?

*** Ataque man-in-the-middle (abreviado como MITM) ***. En pocas palabras, durante la comunicación entre A y B, el atacante obtiene o modifica A a través de olfateo, intercepción, etc. El contenido de la comunicación con B.

Tome una castaña: Para  小白enviar 小黄un mensajero, debe pasar por el punto de mensajería A en el camino 小黑y esconderse en el punto de mensajería A, o simplemente abrir un punto de mensajería B para hacerse pasar por el punto de mensajería A. Luego demolido en secreto 小白para 小黄expresarlo, para ver qué hay dentro. Incluso puede dejar 小白atrás al mensajero, empacar una caja de diez centavos y enviársela 小黄.

Durante el proceso de inicio de sesión, si el atacante rastrea la solicitud de inicio de sesión enviada desde el cliente al servidor, puede obtener fácilmente el nombre de usuario y la contraseña del usuario.

HTTPS

La operación más simple y efectiva para prevenir ataques man-in-the-middle es reemplazar HTTPS y modificar todas las solicitudes HTTP en el sitio web para forzar el uso de HTTPS.

*** ¿Por qué HTTPS puede prevenir los ataques man-in-the-middle? ***
HTTPS en realidad agrega el protocolo SSL / TLS entre los protocolos HTTP y TCP para garantizar la transmisión segura de datos. En comparación con HTTP, HTTPS tiene las siguientes características:

  • Cifrado de contenido

  • Integridad de los datos

  • Autenticación

El principio HTTPS específico ya no se extiende aquí, puede buscar en Google

Transmisión encriptada

Además de HTTPS, también podemos cifrar y transmitir manualmente datos confidenciales:

  • El nombre de usuario puede usar cifrado asimétrico en el cliente y descifrar en el servidor

  • La contraseña se puede transmitir después de MD5 en el cliente para evitar que se exponga el texto sin formato de la contraseña

otro

Además de lo anterior de lo que hablamos, en realidad hay muchas otras tareas a considerar, tales como:

  • El registro de operaciones , el inicio de sesión de cada usuario y las operaciones confidenciales deben registrar registros (incluida la IP, el equipo, etc.)

  • Operación anormal o recordatorio de inicio de sesión . Con el registro de operación anterior, podemos crear recordatorios de riesgo basados ​​en el registro. Por ejemplo, cuando el usuario inicia sesión, cambia la contraseña o inicia sesión de manera anormal, el usuario puede ser notificado por SMS

  • Al rechazar el  registro de contraseñas débiles o cambiar las contraseñas, los usuarios no pueden establecer contraseñas débiles

  • Evite que se recorra el nombre de usuario  . Al registrar algunos sitios web, después de ingresar el nombre de usuario, se le preguntará si existe. De esta manera, existe el riesgo de que se filtren todos los nombres de usuario del sitio web (solo atravesar la interfaz), lo que requiere restricciones interactivas o lógicas

  • ...

posdata

Ahora el país continúa promulgando varias leyes y cada vez se presta más atención a los datos de los usuarios. Como desarrolladores, también debemos hacer más para proteger los datos y la privacidad del usuario. También hablaré contigo más tarde, lo que hemos hecho en cuanto a seguridad de datos, espero poder darte un poco de ayuda.

No hay manera, pero la técnica se puede lograr; si no hay manera, termina con la técnica.

Bienvenidos a todos a seguir la cuenta pública de Java Way

Buen artículo, estoy leyendo ❤️

Supongo que te gusta

Origin blog.csdn.net/hollis_chuang/article/details/108480423
Recomendado
Clasificación