23. oktober 2007 - 22:26Der er
11 kommentarer og 1 løsning
Sikkerhedshul uden addslashes
Hej eksperter.
Jeg ville hører hvordan og hvad man ville kunne gøre hvis man ikke benytter addslashes til sine posts.
Altså hvis man laver en formular og laver disse tegn i et felt: 'heheeeee '")
så får man f.eks. denne fejl: 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 'heheeeee'")', NOW())' at line 1
Jeg må indrømme, jeg forstår ikke helt hvad du spørger om. Hvis det er løsningen på problemet, har du den jo selv: nemlig addslashes() eller mysql_real_escape_string().
Er det hvad hackere kan bruge hullet til du vil vide, eller...?
Nu er det jo altså en direkte overtrædelse af Ekspertens regeler at fortælle folk den slags. Hvis man er samvittighedsfuld fortæller man det til vedkommende, og ellers bør man fortælle det til hans udbyder.
Problemet er ikke så meget at det kan gå ud over ham og hans gæstebog - ja hele hans site - men at det kan faktisk gå ud over dem som har postet i god tro på hans gæstebog.
Det er nu mysql_real_escape_string du bør bruge - addslashes er ikke sikker nok i multi-byte tegnsæt ;)
Erik's link er et udemærket eksempel - man kan redigere alt muligt i tabeller.
Lige netop med PHP og mysql_query er det ikke HELT så stort et problem som det potentielt kunne være, fordi den (endnu) smider ekstra queries væk - dermed havde eksemplet i den xkcd ikke gået - men det er stadig rigeligt stort, da det giver mulighed for eks. at slette alt i en tabel hvor man ellers kun skulle have kunnet slettet en række - det kan endda være muligt at logge ind som en vilkårlig bruger, såsom administratoren så længe man kender brugernavnet. Desuden kan det jo tænkes det på et tidspunkt bliver ændret, og der er jo ingen grund til at friste skæbnen
Ideelt set bør man faktisk bruge bind parameters, da der er mindre risiko for fejl i den funktionalitet end i databasens escaping-funktion (det er før set at der var problemer med visse MBCS - både i MySQL og i PostgreSQL) - i PHP vil det så for MySQLs vedkommende kræve mysqli-extensionen i stedet for den normale mysql-extension.
Det kan man meget sjældent, da du normalt ikke har adgang til den viden der er nødvendig for at tilføje oplysninger til en SELECT så der kommer flere ting ud.
$tjek_id = mysql_query("SELECT * FROM baggrunde WHERE id LIKE '$_GET[id]'"); if(mysql_num_rows($tjek_id) == "0") { echo("Der findes ingen baggrund med dette id!");
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.