Pregunta

Necesito que se complete el siguiente script de autenticación. Soy débil en php / pdo, así que no sé cómo pedir el número de filas que equivalen a una y luego establecer el ID de sesión a partir de los resultados de la consulta. Necesito no solo establecer la $ _SESSION ['userid'] sino también la ['company'] y la ['security_id'] también a partir de los resultados.

aquí es lo que tengo:

$userid   = 

Necesito que se complete el siguiente script de autenticación. Soy débil en php / pdo, así que no sé cómo pedir el número de filas que equivalen a una y luego establecer el ID de sesión a partir de los resultados de la consulta. Necesito no solo establecer la $ _SESSION ['userid'] sino también la ['company'] y la ['security_id'] también a partir de los resultados.

aquí es lo que tengo:

<*>

Información opcional: Navegador: Firefox

POST['userid']; $password =

Necesito que se complete el siguiente script de autenticación. Soy débil en php / pdo, así que no sé cómo pedir el número de filas que equivalen a una y luego establecer el ID de sesión a partir de los resultados de la consulta. Necesito no solo establecer la $ _SESSION ['userid'] sino también la ['company'] y la ['security_id'] también a partir de los resultados.

aquí es lo que tengo:

<*>

Información opcional: Navegador: Firefox

POST['pass']; if ( $userid != "" || $password != "" ) { $sql = "SELECT * FROM contractors WHERE userid = '" . $userid . "' AND password = '" . $password . "'"; $result = $dbh->query( $sql ); } else { echo "login failed. Your fingers are too big"; }

Información opcional: Navegador: Firefox

¿Fue útil?

Solución

¡NUNCA UTILICE ESTE CÓDIGO!

Tienes una inyección SQL muy seria abierta allí. Cada entrada de usuario que tome, ya sea de cookies o CGI, o en cualquier lugar , debe ser saneada antes de que se use en una declaración SQL. Podría entrar fácilmente en ese sistema al iniciar sesión con un nombre de usuario como:

user'; UPDATE contractors SET password = '1337'

... después de lo cual podría iniciar sesión como cualquier persona. Lo siento si parezco agresivo, pero lo que hace ese código es como olvidarse de bloquear la puerta principal de su empresa, que probablemente ni siquiera contiene un sistema de alarma.

Tenga en cuenta que no importa si la entrada proviene realmente del usuario o no (quizás esté en un pre-llenado, oculto). Desde el punto de vista de la seguridad, cualquier cosa que venga de cualquier lugar fuera de tiene para que se considere que contiene información maliciosa por parte del usuario.

Por lo que sé, debe utilizar la quote de PDO para desinfectar adecuadamente la cadena. (En mysql, esto se haría con mysql_real_escape_string () ). No soy un experto en DOP, claro, alguien corríjalo si me equivoco aquí.

Es probable que tampoco deba almacenar contraseñas directamente en la base de datos, sino que utilice una función de hash para crear una contraseña enmascarada, luego cree un hash a partir de la contraseña proporcionada por el usuario y haga coincidir los hashes. Puedes usar la función PHP hash para hacer esto.

En cuanto a otros problemas, no sé si el enfoque que tiene sobre SQL SELECT es el mejor. Simplemente seleccionaría la contraseña del usuario correspondiente y trataría de hacer coincidir eso en el programa. Tampoco creo que haya un error en el método que estás usando, pero simplemente no parece tan lógico, y por lo tanto hay una mayor probabilidad de que me pierda algún error, que en el caso de Las contraseñas y los inicios de sesión crearían una ventana para los exploits.

Para hacerlo a su manera, debe notar que el resultado que está obteniendo de la DOP consulta es una PDOStatement , que no parece tener una función confiable para contar directamente la cantidad de filas de resultados. Lo que debe usar es fetchAll que devuelve una matriz de las filas, y cuenta eso. Sin embargo, como dije, todo esto me parece como si estuviera abierto a fallas, por lo que me sentiría más seguro al verificar la contraseña en el código. Para mi gusto, hay demasiada distancia de la compasión real de concordancia de contraseñas en un lugar tan crítico para la seguridad.

Entonces, para obtener la contraseña resultante para el ID de usuario, puede usar < código> fetch () que devuelve el contenido de la columna del resultado. Utilice, por ejemplo, PDO :: FETCH_ASSOC para obtenerlos en una matriz asociativa basada en los nombres de las columnas.

He aquí cómo solucionarlo:

$userid_dirty   = 

¡NUNCA UTILICE ESTE CÓDIGO!

Tienes una inyección SQL muy seria abierta allí. Cada entrada de usuario que tome, ya sea de cookies o CGI, o en cualquier lugar , debe ser saneada antes de que se use en una declaración SQL. Podría entrar fácilmente en ese sistema al iniciar sesión con un nombre de usuario como:

user'; UPDATE contractors SET password = '1337'

... después de lo cual podría iniciar sesión como cualquier persona. Lo siento si parezco agresivo, pero lo que hace ese código es como olvidarse de bloquear la puerta principal de su empresa, que probablemente ni siquiera contiene un sistema de alarma.

Tenga en cuenta que no importa si la entrada proviene realmente del usuario o no (quizás esté en un pre-llenado, oculto). Desde el punto de vista de la seguridad, cualquier cosa que venga de cualquier lugar fuera de tiene para que se considere que contiene información maliciosa por parte del usuario.

Por lo que sé, debe utilizar la quote de PDO para desinfectar adecuadamente la cadena. (En mysql, esto se haría con mysql_real_escape_string () ). No soy un experto en DOP, claro, alguien corríjalo si me equivoco aquí.

Es probable que tampoco deba almacenar contraseñas directamente en la base de datos, sino que utilice una función de hash para crear una contraseña enmascarada, luego cree un hash a partir de la contraseña proporcionada por el usuario y haga coincidir los hashes. Puedes usar la función PHP hash para hacer esto.

En cuanto a otros problemas, no sé si el enfoque que tiene sobre SQL SELECT es el mejor. Simplemente seleccionaría la contraseña del usuario correspondiente y trataría de hacer coincidir eso en el programa. Tampoco creo que haya un error en el método que estás usando, pero simplemente no parece tan lógico, y por lo tanto hay una mayor probabilidad de que me pierda algún error, que en el caso de Las contraseñas y los inicios de sesión crearían una ventana para los exploits.

Para hacerlo a su manera, debe notar que el resultado que está obteniendo de la DOP consulta es una PDOStatement , que no parece tener una función confiable para contar directamente la cantidad de filas de resultados. Lo que debe usar es fetchAll que devuelve una matriz de las filas, y cuenta eso. Sin embargo, como dije, todo esto me parece como si estuviera abierto a fallas, por lo que me sentiría más seguro al verificar la contraseña en el código. Para mi gusto, hay demasiada distancia de la compasión real de concordancia de contraseñas en un lugar tan crítico para la seguridad.

Entonces, para obtener la contraseña resultante para el ID de usuario, puede usar < código> fetch () que devuelve el contenido de la columna del resultado. Utilice, por ejemplo, PDO :: FETCH_ASSOC para obtenerlos en una matriz asociativa basada en los nombres de las columnas.

He aquí cómo solucionarlo:

<*>

Por supuesto, el código se puede limpiar un poco, pero eso debería explicar lo que hay que hacer. Tenga en cuenta que, dado que la contraseña tiene un código hash y nunca se usó en el SQL , en realidad no necesita limpieza. Pero lo dejé ahí por si acaso, ya que en el código original se fue utilizado en la consulta.

Tenga en cuenta que todo el código relacionado con el almacenamiento de contraseñas debe cambiarse para almacenar el hash en lugar de la contraseña. Además, sería una muy buena idea usar un salt agregado a la contraseña antes del hashing.

Además, proporcioné el código simplemente con fines educativos; simplemente pensé que el código era la forma más clara de explicar cómo hacerlo. Así que no confunda este sitio con un servicio para solicitar código. :)

POST['userid']; $password_dirty =

¡NUNCA UTILICE ESTE CÓDIGO!

Tienes una inyección SQL muy seria abierta allí. Cada entrada de usuario que tome, ya sea de cookies o CGI, o en cualquier lugar , debe ser saneada antes de que se use en una declaración SQL. Podría entrar fácilmente en ese sistema al iniciar sesión con un nombre de usuario como:

user'; UPDATE contractors SET password = '1337'

... después de lo cual podría iniciar sesión como cualquier persona. Lo siento si parezco agresivo, pero lo que hace ese código es como olvidarse de bloquear la puerta principal de su empresa, que probablemente ni siquiera contiene un sistema de alarma.

Tenga en cuenta que no importa si la entrada proviene realmente del usuario o no (quizás esté en un pre-llenado, oculto). Desde el punto de vista de la seguridad, cualquier cosa que venga de cualquier lugar fuera de tiene para que se considere que contiene información maliciosa por parte del usuario.

Por lo que sé, debe utilizar la quote de PDO para desinfectar adecuadamente la cadena. (En mysql, esto se haría con mysql_real_escape_string () ). No soy un experto en DOP, claro, alguien corríjalo si me equivoco aquí.

Es probable que tampoco deba almacenar contraseñas directamente en la base de datos, sino que utilice una función de hash para crear una contraseña enmascarada, luego cree un hash a partir de la contraseña proporcionada por el usuario y haga coincidir los hashes. Puedes usar la función PHP hash para hacer esto.

En cuanto a otros problemas, no sé si el enfoque que tiene sobre SQL SELECT es el mejor. Simplemente seleccionaría la contraseña del usuario correspondiente y trataría de hacer coincidir eso en el programa. Tampoco creo que haya un error en el método que estás usando, pero simplemente no parece tan lógico, y por lo tanto hay una mayor probabilidad de que me pierda algún error, que en el caso de Las contraseñas y los inicios de sesión crearían una ventana para los exploits.

Para hacerlo a su manera, debe notar que el resultado que está obteniendo de la DOP consulta es una PDOStatement , que no parece tener una función confiable para contar directamente la cantidad de filas de resultados. Lo que debe usar es fetchAll que devuelve una matriz de las filas, y cuenta eso. Sin embargo, como dije, todo esto me parece como si estuviera abierto a fallas, por lo que me sentiría más seguro al verificar la contraseña en el código. Para mi gusto, hay demasiada distancia de la compasión real de concordancia de contraseñas en un lugar tan crítico para la seguridad.

Entonces, para obtener la contraseña resultante para el ID de usuario, puede usar < código> fetch () que devuelve el contenido de la columna del resultado. Utilice, por ejemplo, PDO :: FETCH_ASSOC para obtenerlos en una matriz asociativa basada en los nombres de las columnas.

He aquí cómo solucionarlo:

<*>

Por supuesto, el código se puede limpiar un poco, pero eso debería explicar lo que hay que hacer. Tenga en cuenta que, dado que la contraseña tiene un código hash y nunca se usó en el SQL , en realidad no necesita limpieza. Pero lo dejé ahí por si acaso, ya que en el código original se fue utilizado en la consulta.

Tenga en cuenta que todo el código relacionado con el almacenamiento de contraseñas debe cambiarse para almacenar el hash en lugar de la contraseña. Además, sería una muy buena idea usar un salt agregado a la contraseña antes del hashing.

Además, proporcioné el código simplemente con fines educativos; simplemente pensé que el código era la forma más clara de explicar cómo hacerlo. Así que no confunda este sitio con un servicio para solicitar código. :)

POST['pass']; $success = false; // This is to make it more clear what the result is at the end if ($userid != "" || $password != "") { $userid = $dbh->quote($userid_dirty); $passwordhash = hash('sha256',$password_dirty); $sql = "SELECT userid, passwordhash, company, security_id FROM contractors WHERE userid = ".$userid; $result = $dbh->query( $sql ); if ($result) { // Check if result not empty, that userid exists $result_array = $result->fetch(PDO::FETCH_ASSOC); if ($result_array['PASSWORDHASH'] == $passwordhash) { // login success $success = true; // do all the login stuff here... // such as saving $result_array['USERID'], $result_array['COMPANY'], $result_array['SECURITY_ID'] etc. } // else fail, wrong password } // else fail, no such user } else { // fail, userid or password missing echo ' please enter user id and password.'; } if (!$success) { echo ' login failed.'; }

Por supuesto, el código se puede limpiar un poco, pero eso debería explicar lo que hay que hacer. Tenga en cuenta que, dado que la contraseña tiene un código hash y nunca se usó en el SQL , en realidad no necesita limpieza. Pero lo dejé ahí por si acaso, ya que en el código original se fue utilizado en la consulta.

Tenga en cuenta que todo el código relacionado con el almacenamiento de contraseñas debe cambiarse para almacenar el hash en lugar de la contraseña. Además, sería una muy buena idea usar un salt agregado a la contraseña antes del hashing.

Además, proporcioné el código simplemente con fines educativos; simplemente pensé que el código era la forma más clara de explicar cómo hacerlo. Así que no confunda este sitio con un servicio para solicitar código. :)

Otros consejos

El manual de php es un excelente recurso para aprender PHP. Parece que sabes un poco de SQL, y has oído hablar de PDO, lo que es un buen comienzo. Si busca en Google " PDO " ;, o busca en el manual de PHP el término, encontrará el DOP sección del manual. Parece que has encontrado la función - > query , por lo que ahora necesitas ver qué devuelve. Al ir a la página del manual de esa función, vemos que devuelve una Objeto PDOStatement . La palabra PDOStatement está vinculada a la página relevante del manual, que enumera los métodos disponibles en ese objeto. Existe un método rowCount () que probablemente hará lo que usted quiere.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top