WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Apostrof i MySQL (https://www.wn.se/forum/showthread.php?t=1052385)

Hellsing 2012-02-22 11:35

Apostrof i MySQL
 
Hallo!

Jag använder preg_match på följande sätt:

Kod:

elseif(preg_match('/[^A-Za-z0-9!?_,.*:()+-= \r\n\'\"]/', $formcontent)) {
echo "Invalid characters";
}

Sedan lagrar jag innehållet med:
Kod:

mysql_query("INSERT INTO news (title, content)
VALUES
('$formtitle','$formcontent')");

Allt verkar fungera och jag kan lagra innehållet i min databas så länge jag inte använder mig av apostrofer. Hur skall jag göra för att kunna lagra även apostrofer i tabellen?

Pake 2012-02-22 11:38

Titta på http://php.net/manual/en/function.my...ape-string.php

Hellsing 2012-02-22 11:43

När jag använder mysql_real_escape_string säger koden ifrån på "Invalid characters"

Clarence 2012-02-22 11:46

Din preg_match-funktion är långt ifrån säker för att skydda din input.

mysql_real_escape_string tar inte bort några tecken. Den escapar tecken såsom apostrofer. Därmed kommer den stoppa med din preg_match trots att du faktiskt har en säker sträng att lägga in.

Hellsing 2012-02-22 12:01

Tack!

Då plockar jag bort preg match och kör endast escape string.

tartareandesire 2012-02-22 12:28

Precis som Clarence redan sagt så finns det ingen anledning att försöka göra en egen escape-funktion för MySQL då den redan finns i PHP. Däremot kan du ju fortfarande använda preg_match för att kontrollera otillåtna tecken då du uppenbarligen vill slippa exempelvis åäö.

Dimme 2012-02-26 00:42

Om du använder mysql_real_escape_string($string) kom ihåg att anropa stripslashes($escapedString) när du hämta innehåll från databasen.

Annars kommer det du hämtar se ut så här:

Let\'s Eat istället för Let's Eat

Förresten, du borde läsa dig på MySQL injections, mysql_real_escape_string() löser en hel del men inte allt. Det går fortfarande att injecta en fråga som ser ut så här:

mysql_query("SELECT * FROM users WHERE name = $name");

Se till att alltid skriva dina frågor så här:

mysql_query("SELECT * FROM users WHERE name = '$name' ");

Och glöm inte escapa alla strängar och kasta om alla tal (T.ex. $id = (int)$_GET['id'];)

dAEk 2012-02-26 07:52

Eller så kör man med prepared statements. Det ser ut som vanliga Sql-statements men med variabler, om man ska förklara skillnaden i bara en mening. Fördelen är att man slipper tänka på Sql-injections (fnuttar och dylika tecken) samt att man får andra fördelar som t.ex. att frågorna kan kompileras, cachas och optimeras av databasmotorn.

För PHP verkar det som att det mest använda ramverket som fixar detta är PDO. Jag är ingen PHP-snubbe så det kan ha ploppat upp nyare alternativ den senaste tiden.

tartareandesire 2012-02-26 09:23

Citat:

Ursprungligen postat av Dimme (Inlägg 20433701)
Om du använder mysql_real_escape_string($string) kom ihåg att anropa stripslashes($escapedString) när du hämta innehåll från databasen.

Annars kommer det du hämtar se ut så här:

Let\'s Eat istället för Let's Eat

Nej, det stämmer inte alls. mysql_real_escape_string varken tar bort eller lägger till några tecken när strängen når databasen. Om du får den effekten så har du gjort någon annan formatering av texten eller så kör du med magic quotes vilket är smått antikt idag.

Clarence 2012-02-26 16:00

Citat:

Ursprungligen postat av Dimme (Inlägg 20433701)
Om du använder mysql_real_escape_string($string) kom ihåg att anropa stripslashes($escapedString) när du hämta innehåll från databasen.

Annars kommer det du hämtar se ut så här:

Let\'s Eat istället för Let's Eat

Det stämmer, om du kör funktionen två gånger på samma sträng...


Alla tider är GMT +2. Klockan är nu 21:48.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson