Avatar billede elefant Juniormester
27. oktober 2017 - 20:55 Der er 8 kommentarer

Indsætte række i en MySQL database med MySQLi

Er dette den korrekte måde at indsætte række i en MySQL database med MySQLi?

$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

if (isset($_POST['text']))
$text = $_POST['text'];
else
$text = "";

$text = $conn->real_escape_string($text);

$sql = "INSERT INTO mytable (information) VALUES ('".$text."')";

if ($conn->query($sql) === TRUE) {
    echo "Database updated successfully" . "<br><br>";
} else {
    echo "Error: " . $conn->error . "<br><br>";
}

$conn->close();
Avatar billede arne_v Ekspert
27. oktober 2017 - 21:08 #1
Nej.

Drop escape og brug prepared statement.
Avatar billede elefant Juniormester
27. oktober 2017 - 21:12 #2
#1 Jeg har prøvet at se på det, men det ser meget svært ud.

Og koden bliver meget svær at gennemskue, eller er det bare mig der gør det forkert?
Avatar billede arne_v Ekspert
27. oktober 2017 - 21:27 #3
Jeg synes ikke at det er saa slemt.

Eksempel:

http://www.vajhoej.dk/arne/articles/phpdb.html#mysqli_oo
Avatar billede elefant Juniormester
27. oktober 2017 - 21:42 #4
Ja det ser ikke så svært ud.

Men så mangler jeg lige at finde ud af hvordan man undgår SQL injection, hvis man bruger prepared statement.
Avatar billede Slater Ekspert
27. oktober 2017 - 21:49 #5
Det behøver du ikke længere.

Injections sker fordi du normalt sender hele instruktionen til SQL enginen som en streng, hvor visse tegn betyder nogle bestemte ting. Hvis brugeren efterligner de tegn, kan det opfattes som instruktioner i stedet for værdier, fordi når det bare er en streng, aner serveren ikke hvad der kommer fra brugeren og hvad der er fra koden.

Når du bruger prepared statements, sender du kun instruktionerne som en streng, og værdierne helt separat fra denne, så serveren ikke er i tvivl om hvad der er hvad. Derfor er injections ikke længere et umiddelbart problem.
Avatar billede elefant Juniormester
27. oktober 2017 - 22:05 #6
#5 Nu har jeg ikke afprøvet det. Men vil det sige at man ikke behøver at gøre noget for at beskytte sig mod dette?

' or '1'='1
Avatar billede Slater Ekspert
28. oktober 2017 - 00:08 #7
#6: Ja. Grunden til at det normalt skaber problemer, er at det bliver sendt som én streng med både instruktioner og værdier i, og ' derfor kan opfattes som afslutningen på en værdi, selvom det efterfølgende er en del af værdien.
Med prepared statements er værdier ikke begrænset af anførselstegn eller noget andet tegn. De sendes helt separat til databaseserveren.
Avatar billede arne_v Ekspert
28. oktober 2017 - 00:53 #8
http://www.vajhoej.dk/arne/articles/prepparam.html

har en laengere forklaring omkring det. Og flere mysqli eksempler.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester