FAQ |
Kalender |
2012-02-22, 11:35 | #1 | |||
|
||||
Medlem
|
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"; } Kod:
mysql_query("INSERT INTO news (title, content) VALUES ('$formtitle','$formcontent')"); |
|||
Svara med citat |
2012-02-22, 11:38 | #2 | ||
|
|||
Nykomling
|
|||
Svara med citat |
2012-02-22, 11:43 | #3 | |||
|
||||
Medlem
|
När jag använder mysql_real_escape_string säger koden ifrån på "Invalid characters"
|
|||
Svara med citat |
2012-02-22, 11:46 | #4 | ||
|
|||
Administratör
|
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.
__________________
eldefors.com - Personlig (teknik)-blogg |
||
Svara med citat |
2012-02-22, 12:01 | #5 | |||
|
||||
Medlem
|
Tack!
Då plockar jag bort preg match och kör endast escape string. |
|||
Svara med citat |
2012-02-22, 12:28 | #6 | ||
|
|||
Supermoderator
|
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 åäö.
__________________
Full-stack developer, free for smaller assignments |
||
Svara med citat |
2012-02-26, 00:42 | #7 | ||
|
|||
Flitig postare
|
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'];) |
||
Svara med citat |
2012-02-26, 07:52 | #8 | |||
|
||||
Mycket flitig postare
|
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. |
|||
Svara med citat |
2012-02-26, 09:23 | #9 | ||
|
|||
Supermoderator
|
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.
__________________
Full-stack developer, free for smaller assignments Senast redigerad av tartareandesire den 2012-02-26 klockan 18:09 |
||
Svara med citat |
2012-02-26, 16:00 | #10 | ||
|
|||
Administratör
|
Det stämmer, om du kör funktionen två gånger på samma sträng...
__________________
eldefors.com - Personlig (teknik)-blogg |
||
Svara med citat |
Svara |
|
|