![]() |
Hej!
Jag har en liten kort fråga. Jag har läst rätt mycket om tekniker att STOPPA SQL injections, och har kommit på ett "bra" sätt att stoppa det, TROR jag? Sättet är lätt att infoga i redan existerande kod och är rätt simpelt. Frågan är nu bara om det fungerar i praktiken med? Vanligaste sättet att stoppa sql injections (som jag sett) är genom att köra detta: Kod:
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", Därför kom jag på ett annat alternativ, eftersom det är variablarna som kommer genom $_POST och $_GET som ska escapas, borde inte detta funka 100ggr bättre? Kod:
// denna funktion placeras i en extern functions.php fil. Kommer det fungera BRA? och är det tillräckligt säkert? Varför använder alla den andra "tekniken" igentligen? Hjälp mig! mvh Jim |
Dina varianter gör ju samma sak, bara två olika skrivsätt.
|
Citat:
|
Tack för svaren!
Så båda borde alltså fungera lika bra? =) mvh Jim |
Citat:
|
I form av prestanda och belastning då?
mvh Jim |
Ingen skillnad, PHP-interpretern kommer tolka din kod och därmed också praktiskt ersätta (blir ju pekare till slut)varenda e($_POST['variabel']); med mysql_real_escape_string($_POST['variabel']);
Interpretern kommer inte att snurra några extravarv funktionsmässigt, funktionen är mer en estetisk grej för dig som programmerare. |
Båda varianterna blir ju lite jobbiga om det är mer än bara user och password. Går det i PHP att
skriva någon generell funktion som loopar igenom alla POST-variabler och gör om dem? Jag kan inte PHP, men tänkte mig alltså något i stil med... Kod:
function mysql_real_escape_POST() { där det behövs. Kanske går att konfigurera så att den anropas automatiskt till och med. Någon som kan PHP får gärna rätta till detta exempel. Sen vill man väl i vissa fall ge ett tydligt felmeddelande istället för att exekvera SQL-satsen om någon skickar otillåtna tecken. Detta bör i så fall göras på både serversidan och klientsidan. |
Ta en titt på MySQLi och Prepared Statements, mycket säkrare.
|
Citat:
Kod:
if (get_magic_quotes_gpc()) { |
Du behöver inte escape'a varje enskild POST-/GET-värde.
Citat:
|
mysql(i)_real_escape_string($varlabel,$link_identi fier) heter det,
där $link_identifier är en handler till en uppkoppling av databasen. Om man inte skickar med den så kan det bli fel. |
Citat:
|
Citat:
|
mysql(i)_real_escape_string() fungerar lite olika beroende på vilken teckentabell databasen använder. Vilka tecken som anses "problematiska" är alltså olika beroende på ISO-8859-1 och UTF-8 t.ex.
Så om du har två anslutningar mot olika databaser som kör olika charsets så kan du få situationer där SQL-injections är möjliga om du inte hänvisar till rätt databasanslutning när du kör mysql(i)_real_escape_string(). Detta är dock väldigt ovanligt eftersom det flesta enbart har en databas som scriptet jobbar mot, och i de fall man har flera databaser så har dessa i oftast samma charset. Men visst, Magnus_A har en poäng. Det är skadar inte att ta med link identifier. |
Citat:
<?php echo mysqli_real_escape_string('hej'); ?> Utan föregående uppkoppling så försöker php logga in utan lösenord, sällan en bra ide: Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Användare 'www-data'@'localhost' är ej berättigad att logga in (Använder lösen: NO) in /var/www/*** on line * Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /var/www/**** on line * Och för mysqli: Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in /var/www**** |
Alla tider är GMT +2. Klockan är nu 21:51. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson