Antwort
 
LinkBack Themen-Optionen Thema bewerten Ansicht
  #1  
Alt 01.04.08, 20:54
Forum Zuschauer
 
Registriert seit: 01.04.08
Beiträge: 2

SQL Injection


Hallo!

Ich möchte bzw. ich entwickle gerade eine einfache Extension, bei der eingeloggte FE-User über FE-Formulare Daten eingeben können sollen, die in einer DB-Tabelle gespeichert werden sollen. Gibt es bestimmte Verfahrensweisen wie ich vorgehen muss, um Problemen wie etwa SQL Injection zu vermeiden?

Momentan ist es so, dass die Daten ähnlich wie bei der tt_news-Extension über Eingabemasken im BE eingegeben werden können, die über ein FE-Plugin in einer ListView angezeigt werden. Wird ein Datensatz in dieser ListView angeklickt, gelangt man in die SingleView, die auf der selben Seite angezeigt wird. Die übergebene URL sieht so aus:

http://xxx/index.php?id=38&tx_meineExtension_pi1[showUid]=6&cHash=f7215c908f

Die nach [showUid] zu sehene ID "6" ist die UID des Datensatzes. Ist es dadurch nicht möglich auch in andere Datensätze zu schreiben, weil man die UID sehen kann? Wenn ja, wie kann ich das verhindern?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!Spurl this Post!Reddit! Diesen Post bei linksilo.de bookmarken!
Mit Zitat antworten
  #2  
Alt 01.04.08, 21:50
Forum Stammgast
 
Registriert seit: 13.05.06
Alter: 31
Beiträge: 290

In diesem speziellen Fall kannst Du die GET-Variable tx_meineExtension_pi1[showUid] einfach mit
PHP-Code:
intval($this->piVars['showUid']) 
nutzen, oder wenn Du eine korrekte Eingabe absichern willst:
PHP-Code:
if((string)(int)$this->piVars['showUid'] != $this->piVars['showUid']) {
// übergebene Variable ist keine Zahl im Bereich Integer 

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!Spurl this Post!Reddit! Diesen Post bei linksilo.de bookmarken!
Mit Zitat antworten
  #3  
Alt 02.04.08, 16:15
Forum Zuschauer
 
Registriert seit: 01.04.08
Beiträge: 2

Erstmal Danke für die Antwort!

Ich habe mir mal folgende Seite typo3.org: Documentation: TYPO3 Coding Guidelines(Table of Contents) durchgelesen aber so richtig durchblicken tue ich immer noch nicht. Vielleicht kannst Du oder jmd anderes mir ja weiterhelfen.

Auf der Seite steht, dass man die Funktionen t3lib::_GET(), t3lib::_POST() oder t3lib::GP() verwenden soll, da diese Funktionen immer Werte liefern, wo die Quotes nicht escaped sind. Dies geschieht durch die Funktionen stripSlashesOnArray() bzw. stripSlashes(), die innerhalb der oben genannten Funktionen aufgerufen werden und alle Backslashes entfernen. Richtig?
In meinem schlauen Buch "Typo3 für Entwickler" steht nun weiterhin, dass diese Funktionen automatisch verwendet werden, sofern das eigene Plugin von tslib_pibase erbt. (Ist in meinem Fall so!) Die Variablen stehen in diesem Fall als $this->piVars zur Verfügung. (Stimmt! Wie/wo das geschieht habe ich noch nicht herausfinden können)

Um SQL-Injections zu vermeiden steht darüberhinaus im besagten Buch als auch auf der geposteten Seite, dass die Funktionen $GLOBALS['TYPO3_DB']->quoteStr() für alle in Quotes übergebenen Variablen und intval() für alle numerischen Variablen verwendet werden sollen. (ich hoffe das stimmt auch noch!)
Außerdem sollen immer Quotes um die Werte gesetzt werden, es sei denn es sind numerische Werte.

Aus den entsprechenden Klassen weiß ich, dass quoteStr() die PHP-Funktionen mysql_real_escape_string() bzw. mysql_escape_string() verwendet, um die Backslashes vor bestimmten Zeichen zu setzen, sie also zu "escapen". Richtig?

Nun die große Fragen:
  • Warum werden Backslashes zuerst entfernt (stripslashes), um sie dann später wieder zu setzen (quotstr->mysql_real_escape_string)?
    Warum sollen unbedingt die Quotes gesetzt werden?
    Und wie verhindert dies SQL-Injections?
Weiterhin finde ich irritierend, dass innerhalb der Funktionen INSERT/UPDATEquery() vor dem Aufruf der Funktion fullQuoteArray() bzw. fullQuoteStr() folgender Hinweis steht: // Table and fieldnames should be "SQL-injection-safe" when supplied to this function (contrary to values in the arrays which may be insecure). Innerhalb der letztgenannten Funktionen wird nämlich wieder mysql_real_escape_string() aufgerufen, die doch eigentlich für das "escapen" zuständig ist. Warum soll ich diese Funktion denn vorher (gemeint ist der Einsatz bei den Werten, die man über Formularfelder geholt hat)schon mal bemühen?

Ich verstehe gerade gar nix mehr!
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!Spurl this Post!Reddit! Diesen Post bei linksilo.de bookmarken!
Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an



Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0