16. august 2008 - 15:11Der er
26 kommentarer og 1 løsning
Mysql_query problem
Hey,
Nogen der kan gennemskue fejlen her?
if (isset($HTTP_POST_VARS['item'])) { mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('($HTTP_POST_VARS['item'])','($HTTP_POST_VARS['shop'])','($HTTP_POST_VARS['qty'])'") OR DIE(mysql_error()); }
if (isset($HTTP_POST_VARS['item'])) { mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('".$HTTP_POST_VARS['item']."','".$HTTP_POST_VARS['shop']."','".$HTTP_POST_VARS['qty']."'") OR die(mysql_error()); }
if (isset($HTTP_POST_VARS['item'])) { mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('{$HTTP_POST_VARS['item']}','{$HTTP_POST_VARS['shop']}','{$HTTP_POST_VARS['qty']}'") OR DIE(mysql_error()); }
men bruge hellere $_POST-variablen, og sørg for du ved "alt" om SQL-injektions inden du lægger på nettet til fri benyttelse.
Og det er ikke fordi du stadig har din mysql_query-linje som i virkeligheden er den, der giver syntaksfejl? For så er det jo klart, der ikke er nogen forskel.
med $_POST istedet, som udløser samme fejl i SQL'en som før (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1)
<? mysql_connect("serveren", "brugernavn", "adgangskode") or die(mysql_error()); mysql_select_db("db") or die(mysql_error());
if (isset($_POST['item'])) {
echo "INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('".$_POST['item']."','".$_POST['shop']."','".$_POST['qty']."'"; //mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('{$_POST['item']}','{$_POST['shop']}','{$_POST['qty']}'") OR DIE(mysql_error()); } ?>
Men hvis du ellers viste os den kode, der faktisk hører til fejlbesked, eller udskriften fra den kode du faktisk viser, så kunne vi måske nemmere se, at du bare mangler en højreparentes.
Ja, du mangler jo faktisk bare en afsluttende parentes, således:
if (isset($HTTP_POST_VARS['item'])) { mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('{$HTTP_POST_VARS['item']}','{$HTTP_POST_VARS['shop']}','{$HTTP_POST_VARS['qty']}')") OR DIE(mysql_error()); }
'...' i sig selv beskytter ikke mod noget. Man skal som PHP udvikler være ganske meget oppe på tæerne for at følge med i standardindstillingerne for nye versioner af PHP, for ellers falder man i med alle ben en gang i fremtiden, og har en stribe af huller til sql-injection i sine scripts. Så har journalisterne noget skrive om ;)
Den "gode idé" er nok mere at bruge mysqli-metoder sammen med parameters/prepared statements (kært barn har mange navne...). Det er den fremtidsskrede metode, og den der vises her i spørgsmålet - altså opbygning af sql-sætninger ved streng-sammensætning - bør afgå en stille død. Det sker desværre ikke, da lærebøger i mange år har brugt den, uden at advare om problemet.
Magic quotes er som default slået til i php, så det er umuligt for brugeren at ændre på en forespørgsel via brugerinput (altså $_POST, $_REQUEST, $_GET eller $_COOKIE), blot værdierne er omklamret af singlequotes.
Fx hvis login-formularen består af et brugernummer og et password og nummeret ikke er omklamret kan du ændre forespørgslen uden brug af quotes, fx ved at sige dit brugernummer er: 1 OR 1 OR - som garanteret altid vil returnere sandt og logge dig ind som den først indsatte bruger (garanteret admin).
SQL forespørgsler uden brug af SQL lyder mildest talt besværligt, medmindre man kun lave ultra simple forespørgsler..
Ja, det bliver slået fra i PHP 6 når den kommer, og det er jo komplet latterligt. Deres ene argument for at fjerne funktionen er performance, men eftersom det virker fint nu, samtidig med at computere bliver hurtigere og hurtigere hver dag, er det en rimelig dårlig grund, hellere være på den sikre side. Argument nr. 2 er at det er irriterende at se \" i emails og andre steder - Aaahh!! Ja det er godt nok irriterende, men mon ikke det er mere irriterende at få hacked sin side? Så hellere være opmærksom på at fjerne dem, end at være opmærksom på at tilføje dem. Tag .net som et rigtig godt argument til hvorfor de ikke skal fjernes: http://newz.dk/microsoft-gaar-til-kamp-mod-sql-injection
Kunne ikke lige finde andre steder at brokke mig over det :-P
Næh, argumentet er at det slet ikke er nok til at sikre mod sql-injection. Der er kun et sted at sikre det, og det er i "opbygningen" af sql-sætningen. Det var sikkert godt nok for 10 år siden, men det er en sovepude i dag. Og det er gevaldig langt væk fra moderne softwareudvikling. Det er det rigtige skridt i PHP 6, men faktisk mange år for sent.
Jeg kan gå med til at de fjerner det, hvis de giver os en sprintf der tilføjer slashes til alle variablerne, men problemet er jo ikke dig og mig, problemet er alle der lærer at programmere PHP der hjemme i fritiden, de har intet begreb om sikkerhed. PHP er jo gratis og følger med alle webhoteller. En ting er at disable det, men at fjerne det helt :-/ Hvis PHP vil aggere som moderne softwareudvikling skulle de starte med at få styr på variabel typerne, så man ikke bare kan sige if (array("test") == true) og andre mærkelige ting, der fjerner alt logisk sands
Ja, det vil blive et problem - og webhoteller, der ikke beskytter deres kunder mod hinanden, vil også blive et problem.
Til gengæld bliver det nemmere at se, hvem der er amatører ;)
Og det eneste, der er galt, er en gammel og forkert beslutning, der fik lov til at leve alt for længe.
Synes godt om
Ny brugerNybegynder
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.