PHP, MySQL-Sicherheit von Nutzereingaben (Text, Url)
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anweisung
anwenden
ausgabe
code
datenbank
eintragen
erledigen
eventuell schaden
http
manual
methode
posten
private adressen
sicherheit
speichern
system
text
url
verbindung
zeichen
-
Hallo zusammen,
ich habe da eine Frage bezüglich der Sicherheit von übergebenen Userwerten nach PHP, MySQL:
Ich will dem Nutzer eine Möglichkeit geben Freitexte zu posten und habe mich über PHP, MySQL-Sicherheit informiert. Nun versuche ich Usereingaben (Freitexte) folgendermaßen zu validieren:
$text=htmlentities($_POST['text]'); ... //Verbindung zur Datenbank //Lange Worte werden gekürzt nach z.B. 40 Zeichen ein Leerzeichen einfügen ... $text=mysql_real_escape_string($text); ... //$text in MySQL-Datenbank speichern ... freitext='$text'... ... //Verbindung beenden
Ist diese Methode wirklich sicher gegen Angriffe auf das System oder die Webseite?
Außerdem will ich auch bestimmte URL's der User zulassen (Facebook und Youtube) und in der Datenbank speichern:
$url=$_POST['url'];
Dafür kann ich o.g. Methode nicht verwenden, da hierdurch die Url geslasht wird. Ich dachte mir, dass ich folgende Überprüfung anwenden kann:
1.) Prüfen ob die Url den richtigen Anfang hat (z.B. http://www.facebook, oder www.youtube...)
2.) Prüfen ob andere Zeichen außer, /, :, -, Zahlen und Buchstaben vorhanden sind, ansonsten Fehlermeldung
3.) bei Youtube relative einfach, da hier eine bestimmte Syntax eingehalten werden muss (watch?v=)
Oder kennt Ihr eine einfachere Alternative um URL in MySQL sicher zu speichern?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Könntest ja zuerst mit filter_var prüfen, ob es eine gültige URL ist und dann mit parse_url auf die Bestandteile prüfen, ob da alles nötige vorhanden richtig ist.
Ansonsten sollte man das alles auch mit einem Regex lösen können. -
Es wäre besse, wenn du das etwas anders lösen würdest: beim Eintragen in die DB nur
anwenden, damit kann keine SQL-Injection mehr durchgeführt werden, und erst bei der Ausgabe diemysql_real_escape_string()
, denn so kannst du die Daten später ohne einer Änderung an der Datenbank auch auf andere Weise nutzen.htmlentities()
Die URL bei Links solltest du vor dem Eintragen in die DB mittels
sichern, aber du solltest zusätzlich prüfen, ob es sich um einen gültigen Link handelt. Dies lässt sich mit einem regulären Ausdruck erledigen… auch wichtig ist, dass keine Links auf private Adressen möglich sind (z.B. http://localhost/ oder http://192.168.0.1/), weil dadurch eventuell Schaden angerichtet werden könnte, wenn jemand auf so einen Link klickt.mysql_real_escape_string()
Wenn du bei der Ausgabe der Links wieder
nutzt kommt sogar immer valides HTML heraushtmlspecialchars()
-
Es wäre zudem sicher, wenn man mit preg_match oder strpos feststellt, ob der User
SQL gepostet hat und dann den Beitrag nicht posten bzw. den SQL-Query nicht ausführen. -
cubenet schrieb:
Was wird dadurch sicherer, wenn der Text bereits mittels
Es wäre zudem sicher, wenn man mit preg_match oder strpos feststellt, ob der User
SQL gepostet hat und dann den Beitrag nicht posten bzw. den SQL-Query nicht ausführen.
escaped wurde? Stell dir ein System wie lima-city vor bei dem du keine Posts abschicken könntest, die SQL enthalten… das ginge am Sinn vorbei, weil SQL genauso zu einem Beitrag gehören könnte.mysql_real_escape_string()
Anstatt irgendwelche Texte (SQL-Anweisungen) zu verbieten solltest du den Text lieber richtig escapen! Natürlich darf dann an keiner Stelle irgend ein Fehler sein, durch den Text ungesichert "entweichen" könnte. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage