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.
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)
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 ❤️