Ho studiato le dichiarazioni preparate e l'ho implementato nel mio primo accesso. Ho usato una dichiarazione preparata per la query SQL e mi chiedo se questo è sufficiente per scongiurare la maggior parte delle iniezioni SQL?
Poiché la query SQL è parametrizzata e ho sfuggito il nome utente, penso che dovrebbe essere ok. L'unico vero problema che conosco (se ce ne sono di più, per favore fatemelo sapere) è il fatto che non ho potuto sfuggire all'input della password a causa del modo in cui Bcrypt lo verifica. Fammi sapere se esiste un modo migliore per farlo.
<!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