Sicherheitsfrage bei php/mysql

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/sicherheitsfrage_bei_php_mysql_71399/page_1 - zur Vollversion wechseln!


kleinerChemiker schrieb am 16.03.2003 um 17:06

folgendes: ich bekomme über die url diverse variablen. teile davon werden dann in einem sql-query verwendet. z.b. "SELECT * FROM xyz WHERE id=$id". wenn $id eine zahl sein muß, dann kann ich das überprüen und jeden text ausschließen. was jedoch, wenn die variable ein text ist? dann könnte jemand doch auch text eingeben, der die (den? das?) verändert. z.b. wenn $id in der url auf "a AND id2=b" verändert wird. dann wird aus der geplanten query "SELECT * FROM xyz WHERE id=a" folgende query "SELECT * FROM xyz WHERE id=a AND id2=b".
dieses beispiel ist zwar harmlos, aber man könnte ja in anderen querys (UPDATE, INSERT) durchaus destruktive funktionen einbauen.

wie kann ich nun verhindern, daß der text ausgeführt wird, sondern bei einer insert anweisung komplett in ein textfeld geschrieben wird?

thx

MIK


atrox schrieb am 16.03.2003 um 18:27

in der tat ein häufiger fehler, den viele programmierer zt. auch nicht bereit sind einzusehen - auch bei einigen grossen sites noch vorhanden. datenbanktreiber beiten daher entweder variable-binding an, oder funktionen zum codieren des strings an, so daß keine meta-charachter vorkommen. für mysql ist das zb mysql_escape_string
()

wenn man diese funktion oft benutzt, wird man vermutlich eine wrapper-funktion mir kürzerem namen anlegen.

//edit: wenn du weißt das der parameter einer bestimmten konvention unterliegen soll, kannst du es im vorfeld abprüfen (zb is_numeric()).

//edit2: habe schon bei websites gesehen, wo man queries wie
select * from user where username='$user' and password='$password' mit folgendem $password anmelden konnte: ' OR password LIKE '%


kleinerChemiker schrieb am 16.03.2003 um 18:38

genau dieses edit 2 meine ich :(

aber wenn ich die info bei mysql_escape_string() richtig verstehe, werden doch nur sonderchars mittels \ maskiert. aber genau dieses edit2 würde da doch nciht abgesichert werden.

MIK


atrox schrieb am 16.03.2003 um 19:30

doch, denn auch die gefährlichen einfachen anführungszeichen ' werden gegen unschädliche \' ausgetauscht.


kleinerChemiker schrieb am 16.03.2003 um 19:34

ahh, gut
thx

MIK


Maehmann schrieb am 17.03.2003 um 00:57

Zitat von atrox
//edit2: habe schon bei websites gesehen, wo man queries wie
select * from user where username='$user' and password='$password' mit folgendem $password anmelden konnte: ' OR password LIKE '%

Kann ich nicht einfach ein Query wie "select pw from user where username ='$user' machen
dann eine if abfrage in der beide passwörter verglichen werden?

Da brauch ich mir imho keine Gedanken über bösartige Eingaben machen, oder?

Nicht schlagen wenns falsch ist =)


atrox schrieb am 17.03.2003 um 02:01

eine dynamische website wird noch aus jede menge anderer sql-abfragen bestehen, wo es ganz unerwünscht sein kann, daß der user die abfragen nach seinen wünschen ändert.

in deinem beispiel könnte der user mit ' or password=='test gezielt den user unter tausenden heraussuchen der dummerweise 'test' als passwort hat.


watchout schrieb am 17.03.2003 um 18:48

Zitat von atrox
eine dynamische website wird noch aus jede menge anderer sql-abfragen bestehen, wo es ganz unerwünscht sein kann, daß der user die abfragen nach seinen wünschen ändert.

in deinem beispiel könnte der user mit ' or password=='test gezielt den user unter tausenden heraussuchen der dummerweise 'test' als passwort hat.
der kluge mann verwendet bei diversen usereingaben preg_match(...) :D

aber du hast recht, die meisten sind echt kipferln, ich kenn sogar ne seite (welche ich nicht näher nennen möchte... :p ) wo man sich einfach mit index.php?login=true anmelden konnte :rolleyes:




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025