He estado estudiando las declaraciones preparadas y las implementé en mi primer inicio de sesión. Utilicé una declaración preparada para la consulta SQL y me pregunto si esto es suficiente para evitar la mayoría de las inyecciones de SQL.
Dado que la consulta SQL está parametrizada y he escapado del nombre de usuario, creo que debería estar bien. El único problema real que conozco (si hay más, por favor hágamelo saber) es el hecho de que no pude escapar de la entrada de contraseña debido a la forma en que Bcrypt la verifica. Déjame saber si hay una mejor manera de hacer esto.
<!Doctype html>
<html>
<head>
<title>password validation</title></head>
<body>
<fieldset>
<legend>enter password</legend>
<form action =passing.php method = "post">
<table>
<tr>
<td>Email:</td><td><input type="id" name ="id" /><br /></td>
</tr>
<tr>
<td>Password:</td><td><input type = "password" name="password" /><br /></td>
</tr>
</table>
<input type = "submit" name ="submit" value ="insert" />
</form>
</fieldset>
<br />
<?php
// connect to the server
$conn = new mysqli('localhost', 'root', '', 'social');
// check connection
if(mysqli_connect_errno()) {
exit("connection failed" . mysqli_connect_error());
} else {
echo "connection established";
}
if($_POST && isset($_POST['submit'], $_POST['password'], $_POST['id'])) {
$pass = ($_POST["password"]);
$id = mysqli_real_escape_string($conn, $_POST["id"]);
$input = $pass;
$query = mysqli_prepare($conn, "SELECT pass FROM social
WHERE email LIKE ?");
mysqli_stmt_bind_param($query,'s', $id );
mysqli_stmt_execute($query);
mysqli_stmt_bind_result($query, $id);
while(mysqli_stmt_fetch($query)) {
echo "<br />";
echo "SUCCESS at query";
if (password_verify($input, $id)) {
echo "matching pass" . header("Location: inserh.php");
} else{
echo "not a match";
}
}
}
mysqli_close($conn);
// close the connection