Lösung gegen SQL Inection
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
code
coupon
dank
eingabe
fehler
forum
funktion
grundlage
http
problem
programmieren
projekt
schau
string
suche
tabelle
url
vergessen
verwenden
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Schau dir dazu http://de.wikipedia.org/wiki/SQL-Injection an, dort ist ganze gut erklärt. Vor allem den Abschnitt http://de.wikipedia.org/wiki/SQL-Injection#Gegenma.C3.9Fnahmen nicht vergessen zu lesen.
-
instantblood schrieb:
@motoernie danke für deine Hilfe, aber viel gebracht hat es mir leider nicht :(
Wo liegt denn das Problem?
Wenn du für alle Daten die du in eine SQL-Abfrage einfügst, die von MySQL bzw. MySQLi zu Verfügung gestellten Escape Funktionen nutzt, sollte eine SQL-Injection nicht möglich sein.
Man sollte seine Anwendung immer nach dem FIEO (Filter Input Escape Output) erstellen.
Somit entgehst du die Möglichkeit von kleinen "Kids" gehackt zu werden, Profis suchen da schon Intensiver nach Injections und Exploids und nicht unbedingt nur bei dem PHP Script.
-
Ich weis bloß nicht wo ich das Einfügen soll, denn ich habe Invision Power Board (http://www.invisionpower.com/)
-
instantblood schrieb:
Ich weis bloß nicht wo ich das Einfügen soll, denn ich habe Invision Power Board (http://www.invisionpower.com/)motoernie schrieb:
Schau dir dazu http://de.wikipedia.org/wiki/SQL-Injection an, dort ist ganze gut erklärt. Vor allem den Abschnitt http://de.wikipedia.org/wiki/SQL-Injection#Gegenma.C3.9Fnahmen nicht vergessen zu lesen.
Wenn du nicht weisst wie man solche Beispiele:Ein Beispiel für MySQL: anstatt
umsetzt solltest du vielleicht die Grundlagen von MySQL lernen.
$abfrage = "SELECT spalte1
FROM tabelle
WHERE spalte2 = '".$_POST['spalte2Wert']."'";
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
sollte Folgendes verwendet werden:
$abfrage = "SELECT spalte1
FROM tabelle
WHERE spalte2 = '".mysql_real_escape_string($_POST['spalte2Wert'])."'";
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
Quelle: obiger wiki-link
PS.: deinen Quellcode musst du schon selbst durcharbeiten.
Beitrag zuletzt geändert: 11.3.2012 21:42:58 von motoernie -
motoernie schrieb:
Dazu sage ich nur noch einmal "Filter Input Escape Output" Am besten ist es immer wenn du eine Zahl erwartest, das dort dann auch nur die Zahlen erlaubt sind, in dem entpechenden $_POST oder $_GET parameter.
$abfrage = "SELECT spalte1 FROM tabelle WHERE spalte2 = '".$_POST['spalte2Wert']."'"; $query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
sollte Folgendes verwendet werden:
$abfrage = "SELECT spalte1 FROM tabelle WHERE spalte2 = '".mysql_real_escape_string($_POST['spalte2Wert'])."'"; $query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
Quelle: 2. wiki-link von oben
umsetzt solltest du vielleicht die Grundlagen von MySQL lernen.
Wenn die Eingabe nur bestimmte Zeichen erlaubt, sollte geprüft werden ob auch wirklich nur diese Zeichen enthalten sind.
instantblood schrieb:
Ich Würde mal tippen, du hast auch keine Ahnung von PHP richtig?
Ich weis bloß nicht wo ich das Einfügen soll, denn ich habe Invision Power Board (http://www.invisionpower.com/)
In dem Fall können wir(oder vielmehr ich) dir keine Hilfestellung geben:
1. Da ich weder das Forum je getestet noch verwendet habe oder werde.
2. Wäre da am besten für dich der Entwickler / die Community die es verwenden oder dafür mod programmieren anzusprechen.
3. Könntest du dich mit der PHP & MySQL Thematik auseinander setzen und ggf. später selber nach Sicherheitslücken in der selbst verwendeten Software suchen.
Beitrag zuletzt geändert: 11.3.2012 21:44:47 von dexus85 -
OK, danke an alle erstmal und besonders an dexus85
-
Wie bereits schonmal gefragt, du selber hast keine Ahnung vom programmieren oder Datenbanken?
Dann solltest du dir eventuell zumindest mal die Grundlagen anschauen, auch wenn es für deinen Fall sicher nicht ausreichend ist.
Dein Board ist doch professionel erstellt worden oder?
Dann brauchst du dir um sowas eigentlich keine Sorge machen, das meiste wird in Foren über die URL übergeben, das haben auch die Programmierer bedacht.
Ansonsten schau dir mal http://php.net/manual/de/function.mysql-real-escape-string.php an.
Ist sicherlich kein Wundermittel,hilft aber ein wenig ;) -
Morgen,
das Thema wurde hier ja schon öfter angesprochen, bitte nutze daher die Suche,
trotzdem ist es ein interessantes Thema.
Viel Lesenswertes kannst du dir ergooglen, sowohl auf Englisch als auch Deutsch.
Generell ein paar Dinge die immer beachtet werden sollten:
* Du solltest prüfen ob die Eingabe dem richtigen Typ entspricht (Integer kann man dann einfach mit (int) casten bspw).
* bei Strings sollte man mysql_real_escape_string verwenden
* Traue niemals Eingaben, die vom Benutzer kommen, also immer prüfen.
Vereinfacht wird dir das ganze Prozedere durch eine selbstgeschriebene/selbstkopierte MySQL Klasse,
da sich alles für jede Abfrage wiederholt und es nervig ist, jedes mal die gleichen IFs zu schreiben...
Dort kannst du dir bspw. Funktionen für das hinzufügen von Integern, Strings, etc schreiben.
Über diese kannst du dann auch generell schneller und effektiver SQLs schreiben.
Bsp von einem meiner Projekte:
$mysql = FW_Mysql::getInstance(); $mysql->assign('idinviteruser', $user->iduser); $mysql->assign_str('coupon', $code); $mysql->assign('credits', $credits); $mysql->insert($this->table);
Meiner Meinung unerlässlich für größere Projekte.
Beitrag zuletzt geändert: 13.3.2012 9:19:00 von sneppa -
sneppa schrieb:
Mich würde ja mal deine MySQL Klasse interessieren.
Morgen,
das Thema wurde hier ja schon öfter angesprochen, bitte nutze daher die Suche,
trotzdem ist es ein interessantes Thema.
Viel Lesenswertes kannst du dir ergooglen, sowohl auf Englisch als auch Deutsch.
Generell ein paar Dinge die immer beachtet werden sollten:
* Du solltest prüfen ob die Eingabe dem richtigen Typ entspricht (Integer kann man dann einfach mit (int) casten bspw).
* bei Strings sollte man mysql_real_escape_string verwenden
* Traue niemals Eingaben, die vom Benutzer kommen, also immer prüfen.
Vereinfacht wird dir das ganze Prozedere durch eine selbstgeschriebene/selbstkopierte MySQL Klasse,
da sich alles für jede Abfrage wiederholt und es nervig ist, jedes mal die gleichen IFs zu schreiben...
Dort kannst du dir bspw. Funktionen für das hinzufügen von Integern, Strings, etc schreiben.
Über diese kannst du dann auch generell schneller und effektiver SQLs schreiben.
Bsp von einem meiner Projekte:
$mysql = FW_Mysql::getInstance(); $mysql->assign('idinviteruser', $user->iduser); $mysql->assign_str('coupon', $code); $mysql->assign('credits', $credits); $mysql->insert($this->table);
Meiner Meinung unerlässlich für größere Projekte.
Für LIKE, GRANT oder REVOKE sollte man auch noch % und _ escapen (addslash), wobei die meisten wohl eh nur ersteres nutzen.
Cast kann man auch mit intval eigentlich sollte, man sich wirklich mal die gesamte php.net durchlesen, da ist viel wissen drin was Sicherheit angeht. -
Also, wenn du wirklich alles absichern möchtest, dann solltest du das ganze so machen:
mysql_real_escape_string(htmlentities(isset($_GET['ct']) ? $_GET['ct']: NULL, ENT_QUOTES, "utf-8"))
Damit werden erst mal alle MySQL-Relevanten Befehle ausgeschaltet und dazu auch noch HTML-Eingaben, mit denen dann ein kiddi z.B. eine metaweiterleitung baut, die z.B. zu einer Pornoseite führt. Damit der Server so wenig Fehler wie möglich verursacht mit denen besser gebildete "Hacker" das Script knacken können, ist dann der teil ab isset da. Das ganze hat nicht nur einen Sicherheitsaspekt, sondern dient auch noch der Performance, denn jeder Fehler - und sei er noch so gering - braucht Speicher und ob du es glaubst oder nicht, der Browser bekommt diese Fehler zu spüren, ob die nun ausgegeben werden oder nicht.
Ich zumindest sichere alle meine Eingabebereiche so ab. -
Ich verwende dazu folgende Funktion:
function getString($string) { return strip_tags(stripslashes(str_replace(array('\'', '"', '`', '´'), '', $string))); }
Da wird xss auch gleich rausgefiltert. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage