Vulnerabilità di SQL injection quando si usano istruzioni preparate in PHP

2

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
    
posta nate35795 07.04.2016 - 09:30
fonte

1 risposta

5

Devo evitare l'input quando utilizzo istruzioni preparate?

No.

Non hai davvero bisogno di sfuggire all'input se usi istruzioni preparate. Se si desidera un ulteriore livello di sicurezza, utilizzare una sorta di filtro di input (ad esempio, ottenere solo numeri interi, ottenere solo e-mail valide, ottenere solo alhanum, ecc.).

E ovviamente non dovresti sfuggire alla tua password, dato che non entra nemmeno nella query.

L'escape significa solo che sfuggi a determinati personaggi. Ciò significa che ' diventa \' o \ diventa \ . In questo modo, se si trovano all'interno di una stringa quotata, vengono interpretati correttamente. Questo può prevenire le iniezioni SQL se l'input è inserito in una stringa quotata, poiché l'autore dell'attacco non può uscire da quella stringa. Non fa nulla di utile se lo applichi a tutti gli input. E non è necessario se usi istruzioni preparate.

LIKE invece di uguaglianza

Non dovresti usare LIKE se hai bisogno di una corrispondenza esatta. Il tuo uso di LIKE qui rende più facile il bruteforce del tuo accesso e semplifica la raccolta degli indirizzi email.

Ad esempio, posso accedere correttamente come [email protected]:pass con %@%:pass .

Poiché utilizzi un ciclo invece di recuperare solo un risultato, che è ciò che dovresti fare, un utente malintenzionato può utilizzare %@% come email fissa e solo bruteforce le password.

    
risposta data 07.04.2016 - 11:45
fonte

Leggi altre domande sui tag