Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Problema al validar contraseña en Flask
#1
app.route('/admo_login', methods=['POST'])
def admin_login_post():
   
    _usuario = request.form['txtUsuario']
    _password = request.form['txtPassword']
    cur.execute("SELECT * FROM usuarios WHERE usuario='"+_usuario+"' and password='"+_password+"'")
    #datos = cur.fetchall()
    datos = cur.fetchone()
    miConexion.commit()
      if datos != "none":
        print(datos)  
    else:
        print("No hay nada")
    return render_template('admo/admin.html')


Cuando introduzco una clave que concuerda con usuarios de la DB me devuelve el string de "datos" correctamente.
Pero cuando pongo una incorrecta me devuelve "none" cuando no debería devolver "no hay nada" por la igualdad del if y su else.

Gracias por la ayuda
Responder
#2
Prueba asi:

Código:
      if datos is not None:
        print(datos) 
    else:
        print("No hay nada")

Commit no es necesario. Lo utilizas para insertar o update, dandote la oportunidad the rollback

Código:
miConexion.commit()

No creas SQL asi. Potential SQL Injection attack.

Código:
cur.execute("SELECT * FROM usuarios WHERE usuario='"+_usuario+"' and password='"+_password+"'")


Usas algo asi (no lo he probado):

Código:
sql_select_query = """select * from usuarios where usuario = %s and password = %s"""
cursor.execute(sql_select_query, (usuario,password,))
Responder
#3
Costero, gracias.

Vamos poco a poco ajustándome a lo nuevo. Primero. hacia 18 años que no tocaba nada de programación y, en segundo lugar, uno tiende a montar las cosas con la lógica de COBOL, VB y ASP con las que trabajaba. Supongo que hasta que termine esta WEB para mi hijo(me va a servir de práctica) os vpy a molestar bastante.

Pregunta por curiosidad ¿Por qué hay que montar los string para consulta de la manera que me pasas y no con la tradicional que es la que yo estaba usado?
y, además por qué hay que poner tres comillas.

Bueno, voy  ver las variables de sesión y demás a ver cómo va.

Un saludo y muchas gracias.
Jaime
Responder
#4
No creo que tengas que poner tres comillas si la string es una sola linea, pero que si quieres multiple lineas entonces tienes que ponerlo. Por ejemplo:

Código:
sql_select_query = """select *
                       from usuarios
                       where usuario = %s
                       and password = %s"""


¿Por qué hay que montar los string para consulta de la manera que me pasas y no con la tradicional que es la que yo estaba usado?

Por que estos expones tu aplicacion a lo que se llama SQL Injection attack (Ataque the injection de SQL). Es uno de los ataques mas facil de hacer y mas facil de evitar haciendo el consejo que te di. Como atacar?.

En tu Form en txtUsuario en ves the poner digamos 'Costero', pongo Testing Flask' OR 'a'='a';--,  and txtPassword pongo Hola. 
Tu sql query quedaria algo asi:

Código:
select * from usuarios where usuario = 'Testing Flask' OR 'a'='a';--' and password = 'Hola'

No existe usuario 'Testing Flask' o password 'Hola', pero la query te retorna todos lo valores porque 'a'='a', es True

Un poco mejor explicacion aqui: https://www.w3schools.com/sql/sql_injection.asp

Salu2
Responder
#5
También sugiero leer: Reproducir inyección SQL en sqlite3 y PyMySQL.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 2 invitado(s)