Schädlichen mysql code ausfiltern?
Hoi!
Falls in einen $string ein Text an den Query übergeben wird, zum abfragen der Datenbank, und der $string schadhaften mysql code enthält, um die datenbank eventuell zu manipulieren... wie kann ich dagegen vorgehen? gibt es wie bei PHP/HTML eine funktion wie strip_tags(); ?
Würde mich freuen
bei nummern hilft ja is_numeric.. aber bei text.. is ja sone sache 
Ich hatte schonmal was gelesen, aber vergessen wo ich das gelesen habe... Vorheer wars mir immer egal, aber jetzt will ich doch lieber auf sicherheit gehen
will ja mal keine böse überraschung erleben
Falls in einen $string ein Text an den Query übergeben wird, zum abfragen der Datenbank, und der $string schadhaften mysql code enthält, um die datenbank eventuell zu manipulieren... wie kann ich dagegen vorgehen? gibt es wie bei PHP/HTML eine funktion wie strip_tags(); ?
Würde mich freuen
bei nummern hilft ja is_numeric.. aber bei text.. is ja sone sache 
Ich hatte schonmal was gelesen, aber vergessen wo ich das gelesen habe... Vorheer wars mir immer egal, aber jetzt will ich doch lieber auf sicherheit gehen
will ja mal keine böse überraschung erleben
mit irgendeiner programmiersprache wirst du wohl auf die mysql datenbank zugreifen müssen.
und die meisten sprachen bieten solche funktionen an. z Bsp. für php:
http://at.php.net/manual/de/function.mys…cape-string.php
jperl
und die meisten sprachen bieten solche funktionen an. z Bsp. für php:
http://at.php.net/manual/de/function.mys…cape-string.php
jperl
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Hi,
abgesehen von dem escapen von Strings kannst du natürlich auch mit Regular-Expressions arbeiten oder bei mySQL mit prepared Statements.
Ich persönlich verwende für fast alle Eingaben Regular Expressions, denn durch so eine Prüfung ist das Abfangen fehlerhafter Eingaben nunmal sehr einfach.
mysql-real-escape-string maskiert kritische Daten ja nur.
Gruß
.:lay-z-cow:.
abgesehen von dem escapen von Strings kannst du natürlich auch mit Regular-Expressions arbeiten oder bei mySQL mit prepared Statements.
Ich persönlich verwende für fast alle Eingaben Regular Expressions, denn durch so eine Prüfung ist das Abfangen fehlerhafter Eingaben nunmal sehr einfach.
mysql-real-escape-string maskiert kritische Daten ja nur.
Gruß
.:lay-z-cow:.
Guten Tag, Tag zusammen - Ich stecke eure kleine Welt in Flammen...
Burning-Star - Back in Town!
Burning-Star - Back in Town!
Also Regular Expressions gibt es in fast jeder Programmiersprache...
Damit legt man so etwas wie "Schablonen" für einen String fest.
Beispiel:
Ist die "Schablone" für einen String der die Buchstaben a-z enthält, die Ziffern 0-9 und den Unterstrich _. Außerdem darf der String zwischen eins und fünf Zeichen lang sein.
Das ganze kann man z.B. zum Durchsuchen von Strings nach speziellen Vorkommnissen benutzen, aber durch Begrenzungen kann man auch überprüfen, ob der gesamte String einer solchen Regular Expression entspricht.
Beispiel mit preg_match (gibt wahr oder falsch zurück, je nachdem ob es passt oder nicht)
Das ist schon ein recht kompliziertes Beispiel, aber preg_match prüft $_POST['email'] auf folgenden Aufbau:
- Erst müssen Buchstaben, Zahlen, Unterstriche, Bindestriche und Punkte kommen
- dann ein @-Zeichen
- Dann wieder wie bei Punkt eins
- Dann ein Punkt
- Zuletzt zwei bis vier Buchstaben
Alles was nicht diesem Schema entspricht kann man also abfangen.
- Nur Ziffern von eins bis neun und zwar genau fünf!
RegEx haben eine eigene Syntax und daher müssen auch eigene Steuerzeichen escaped werden. Ich kann das bestimmt nicht so gut erklären wie andere, am besten einfach danach googeln.
Der Vorteil ist: Ich kann in einem Zug prüfen, ob das eingegebene das korrekte Format (z.B. email-Adresse) hat und dabei auch gleichzeitig Schadcode ausschließen.
Allerdings muss man dazu die RegEx natürlich auch immer ordentlich basteln
- Aber im Endeffekt lohnt sich der Mehraufwand (spätestens bei der nächsten Seite, wenn man sie wieder verwenden kann)
Hier noch ein paar Funktionen, die das teilweise automatisiert machen (besser als is_numeric)
http://de2.php.net/ctype_alnum
http://de2.php.net/manual/de/function.ctype-alpha.php
http://de2.php.net/manual/de/function.ctype-digit.php
Gruß
.:lay-z-cow:.
Damit legt man so etwas wie "Schablonen" für einen String fest.
Beispiel:
|
|
PHP-Quelltext |
1 |
[a-z0-9_]{1,5}
|
Ist die "Schablone" für einen String der die Buchstaben a-z enthält, die Ziffern 0-9 und den Unterstrich _. Außerdem darf der String zwischen eins und fünf Zeichen lang sein.
Das ganze kann man z.B. zum Durchsuchen von Strings nach speziellen Vorkommnissen benutzen, aber durch Begrenzungen kann man auch überprüfen, ob der gesamte String einer solchen Regular Expression entspricht.
Beispiel mit preg_match (gibt wahr oder falsch zurück, je nachdem ob es passt oder nicht)
|
|
PHP-Quelltext |
1 2 3 4 5 |
if (!preg_match("^([a-z0-9_]|\-|\.)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,4}\$",$_POST['email'])){
echo "das ist keine korrekte email adresse!";
}else{
echo "email adresse ok!";
}
|
Das ist schon ein recht kompliziertes Beispiel, aber preg_match prüft $_POST['email'] auf folgenden Aufbau:
- Erst müssen Buchstaben, Zahlen, Unterstriche, Bindestriche und Punkte kommen
- dann ein @-Zeichen
- Dann wieder wie bei Punkt eins
- Dann ein Punkt
- Zuletzt zwei bis vier Buchstaben
Alles was nicht diesem Schema entspricht kann man also abfangen.

|
|
PHP-Quelltext |
1 2 |
Ein einfacheres für PLZ
^[0-9]{5}$
|
- Nur Ziffern von eins bis neun und zwar genau fünf!
RegEx haben eine eigene Syntax und daher müssen auch eigene Steuerzeichen escaped werden. Ich kann das bestimmt nicht so gut erklären wie andere, am besten einfach danach googeln.
Der Vorteil ist: Ich kann in einem Zug prüfen, ob das eingegebene das korrekte Format (z.B. email-Adresse) hat und dabei auch gleichzeitig Schadcode ausschließen.
Allerdings muss man dazu die RegEx natürlich auch immer ordentlich basteln
- Aber im Endeffekt lohnt sich der Mehraufwand (spätestens bei der nächsten Seite, wenn man sie wieder verwenden kann)Hier noch ein paar Funktionen, die das teilweise automatisiert machen (besser als is_numeric)
http://de2.php.net/ctype_alnum
http://de2.php.net/manual/de/function.ctype-alpha.php
http://de2.php.net/manual/de/function.ctype-digit.php
Gruß
.:lay-z-cow:.
Guten Tag, Tag zusammen - Ich stecke eure kleine Welt in Flammen...
Burning-Star - Back in Town!
Burning-Star - Back in Town!
wow... saugute erklärung...
das gleiche machte ich mit der email... jedoch umständlicher.. nicht mit preg_match sondern so if ($part1 ==! '@') $error = true;
sehr umständlich u.s.w 
wunderbar... noch nie was von diesem preg_replace gehört... eine super sache
Vielen vielen dank
EDIT:
Ich hab mal etwas probiert... gugg ... bissl schwierig aber eigentlich immer es selbe
Das überprüft z.B sowas: sollte es
3-12-2007-14-46-37.jpg
dabei hab ich den bindestrich immer nach den + angefügt wie bei deinen beispiel das @... weiss nicht ob das so funzt
hoffe ich zumidnest...
Würde das so klappen?
das gleiche machte ich mit der email... jedoch umständlicher.. nicht mit preg_match sondern so if ($part1 ==! '@') $error = true;
sehr umständlich u.s.w 
wunderbar... noch nie was von diesem preg_replace gehört... eine super sache

Vielen vielen dank

EDIT:
Ich hab mal etwas probiert... gugg ... bissl schwierig aber eigentlich immer es selbe
|
|
PHP-Quelltext |
1 |
if (preg_match("^([a-z0-9]{1,2})+-([0-9]{1,2})+-([0-9]{4})+-([0-9]{1,2})+-([0-9]{1,2})+-([0-9]{1,2})+.([a-z]{3})\$",$_POST['blogpic']))
|
Das überprüft z.B sowas: sollte es
3-12-2007-14-46-37.jpgdabei hab ich den bindestrich immer nach den + angefügt wie bei deinen beispiel das @... weiss nicht ob das so funzt
hoffe ich zumidnest...Würde das so klappen?
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »UT2003ler« (4. Dezember 2007, 16:54)
[0-9] kann man mit \d abkürzen, [0-9a-zA-Z_] mit \w ....
http://tut.php-quake.net/regex.html
ist nen relativ gutes tut zu dem thema.
zahlen kann man noch gut mit intval() platt machen, da ist dann auch nichts anderes mehr als eine zahl (integer) drin, also auch sehr praktisch
http://tut.php-quake.net/regex.html
ist nen relativ gutes tut zu dem thema.
zahlen kann man noch gut mit intval() platt machen, da ist dann auch nichts anderes mehr als eine zahl (integer) drin, also auch sehr praktisch
~!__/
..o.o
This is Einkaufswagen.
Copy Einkaufswagen into your signature to help him on his way to world domination.
@UT2003ler:
Die Pluszeichen solltest du weglassen, die heissen, dass die Zeichenfolgen unbegrenzt oft vorkommen können, du willst sie aber mit {} begrenzen.
Wichtig ist, dass man seine RegEx nicht nur daruaf prüft, was nicht durchkommt, sondern auch darauf was durchkommt.
Der Link von Skittles ist eigentlich schon ne gute Adresse, das Problem ist, dass ist alles so praxisfern und unansehnlich... (Ich hasse diesen Foo-bar Pseudocode)
Am besten suchst du dir alle möglichen Operatoren/Abkürzungen aus der PHP-Referenz und hantierst ein wenig damit herum.
Was mich so richtig auf den Geschmack gebracht hat, war allerdings mod_rewrite (das Apache Modul), das funktioniert ebenfalls mit RegEx, macht aber mehr Spaß zum üben (und kann nicht schaden davon Ahnung zu haben). Das hier ist ein tolles Tutorial dazu:
http://www.sitepoint.com/article/apache-mod_rewrite-examples
Gruß
.:lay-z-cow:.
Die Pluszeichen solltest du weglassen, die heissen, dass die Zeichenfolgen unbegrenzt oft vorkommen können, du willst sie aber mit {} begrenzen.
Wichtig ist, dass man seine RegEx nicht nur daruaf prüft, was nicht durchkommt, sondern auch darauf was durchkommt.
Der Link von Skittles ist eigentlich schon ne gute Adresse, das Problem ist, dass ist alles so praxisfern und unansehnlich... (Ich hasse diesen Foo-bar Pseudocode)
Am besten suchst du dir alle möglichen Operatoren/Abkürzungen aus der PHP-Referenz und hantierst ein wenig damit herum.
Was mich so richtig auf den Geschmack gebracht hat, war allerdings mod_rewrite (das Apache Modul), das funktioniert ebenfalls mit RegEx, macht aber mehr Spaß zum üben (und kann nicht schaden davon Ahnung zu haben). Das hier ist ein tolles Tutorial dazu:
http://www.sitepoint.com/article/apache-mod_rewrite-examples
Gruß
.:lay-z-cow:.
Guten Tag, Tag zusammen - Ich stecke eure kleine Welt in Flammen...
Burning-Star - Back in Town!
Burning-Star - Back in Town!
Besten Dank für die Hilfe...
Jedoch brauch ich noch etwas hilfe
Mein Code:
Mein Error:
Warning: preg_match() [function.preg-match]: No ending delimiter '^' found in /var/www/virtual/virtoreal.net/htdocs/Pictures/Pic.php on line 65
Ich hab nun mal ein ^ am ende des " gemach... quasie so -z]{3})\$^",$_G
scheinbar funktioniert es... aber es wird doch niergendwo so gemacht?
Nanu?
Jedoch brauch ich noch etwas hilfe

Mein Code:
|
|
PHP-Quelltext |
1 |
if (preg_match("^([a-z0-9]{1,2})-([0-9]{1,2})-([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})-([0-9]{1,2}).([a-z]{3})\$",$_GET['blogpic'])) $blogpic = $_GET['blogpic'];
|
Mein Error:

Warning: preg_match() [function.preg-match]: No ending delimiter '^' found in /var/www/virtual/virtoreal.net/htdocs/Pictures/Pic.php on line 65
Ich hab nun mal ein ^ am ende des " gemach... quasie so -z]{3})\$^",$_G
scheinbar funktioniert es... aber es wird doch niergendwo so gemacht?
Nanu?
Du musst das Muster so angeben, das weicht vom mod-rewrite synthax AB:
delimiterpatterndelimitermodifiers
Der Delimiter ist ein Zeichen deiner Wahl. Ich rate dir irgendwas zu benutzen, was nicht in deiner Pattern vorkommt, zB #,~,... , da du den Delimiter sonst escapen müsstest.
Kleines Bsp:
delimiterpatterndelimitermodifiers
Der Delimiter ist ein Zeichen deiner Wahl. Ich rate dir irgendwas zu benutzen, was nicht in deiner Pattern vorkommt, zB #,~,... , da du den Delimiter sonst escapen müsstest.
Kleines Bsp:
|
|
PHP-Quelltext |
1 |
preg_match("~\w{3}~",...);
|
~!__/
..o.o
This is Einkaufswagen.
Copy Einkaufswagen into your signature to help him on his way to world domination.


