Zurück   Flashforum > Flash und Server > Flash Remoting

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-03-2009, 14:43   #1 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
AmfPHP und SQL-Injection

Hallo.

Habe schon viel in diesem Forum gelesen und bin dabei
über SQL_Injection gestolpert. Den Artikel bei Wikipedia
habe ich auch gelesen.

Dort steht z.B. man sollte bei PHP statt
Code:
$abfrage = "SELECT spalte1
            FROM tabelle
            WHERE spalte2 = '".$_POST['spalte2Wert']."'";
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
lieber folgendes schreiben.
Code:
$abfrage = "SELECT spalte1
            FROM tabelle
            WHERE spalte2 = '".mysql_real_escape_string($_POST['spalte2Wert'])."'";
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
Aber hier findet ja jedes Mal ein Aufruf über $_POST statt
und diesen habe ich ja bei AmfPHP nicht, da die Werte
ja direkt als Methoden-Parameter kommen. Ich habe z.B.
folgende Methode.

PHP-Code:
public function getEntryById$id )
{
  
$call mysql_query"SELECT title, client WHERE id =".$id );
        
  if( 
$call )
  {
    
$row mysql_fetch_object$call );
        
    
$returnArray = array();
            
    
$returnArray["title"] = $row->title;
    
$returnArray["client"] = $row->client;
        
    return 
$returnArray;
  }
  else
  {
    return 
false;
  }

Muss ich jetzt die von Flash kommende $id auch irgendwie escapen
(und wenn ja wie?) oder treten hier diese Risiken nicht auf, da der
Wert nicht über $_POST in die PHP-Methode gelangt?

gruß, gaspode

Geändert von gaspode (07-03-2009 um 14:44 Uhr)
gaspode ist offline   Mit Zitat antworten
Alt 07-03-2009, 15:28   #2 (permalink)
Neuer User
 
Benutzerbild von mohj
 
Registriert seit: Jan 2009
Beiträge: 423
Hallo. MySQL Injection sollte auch bei AmfPHP möglich sein. Das Problem ist nicht die Methode (Post, Get oder was auch immer), sondern der Inhalt. Am besten und schnellsten funktioniert eine Vorbeugung, wenn deine Datenbank etwas mit MySQLi anfangen kann. Dadurch kannst du Prepared Statements verwenden, das heisst, die Datenbankabfrage wird zuerst vorbereitet und erst dann geschickt.
PHP-Code:
$query 'SELECT title, client WHERE id = ?';
  
  
$command mysqli_prepare($query);
  
//Abfrage wird vorbereitet mit den zu erwartenden Werten, s für String, i für Integer usw.
  
mysqli_stmt_bind_param($command'i'$id);  
  
$call mysqli_stmt_execute($command); 
Falls nicht, kannst du das Escapen auch selber vornehmen und mittels sprintf auf korrekten Inhalt überprüfen:
PHP-Code:
$query sprintf('SELECT title, client WHERE id = \'%i\''mysql_real_escape_string($id));
  
$call mysql_query($query); 

Geändert von mohj (07-03-2009 um 15:32 Uhr)
mohj ist offline   Mit Zitat antworten
Alt 07-03-2009, 15:42   #3 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Danke für die Infos.

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Alt 07-03-2009, 15:49   #4 (permalink)
Neuer User
 
Benutzerbild von mohj
 
Registriert seit: Jan 2009
Beiträge: 423
Mir ist grad noch aufgefallen, dass ein Integerwert bei sprintf ein "d" und nicht ein "i" ist. Wird sonst nicht funktionieren.
mohj ist offline   Mit Zitat antworten
Alt 07-03-2009, 17:19   #5 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Wofür steht denn das hier eigentlich?

\'%i\' bzw. \'%d\'

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Alt 07-03-2009, 18:41   #6 (permalink)
Neuer User
 
Benutzerbild von mohj
 
Registriert seit: Jan 2009
Beiträge: 423
Hallo. Das sind Platzhalter mit einer Typisierung, welche mit den Argumenten nach dem Komma gefüllt werden. Dadurch stellst du sicher, dass der übermittelte Wert "id" auch wirklich eine Zahl ist und nicht wie bei einer MySQL Injection ein String.
mohj ist offline   Mit Zitat antworten
Alt 07-03-2009, 18:43   #7 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Ja, habe es mittlerweile auch bei php.net gefunden.
Danke nochmal für die infos.

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Alt 09-03-2009, 14:12   #8 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Hmm, irgendwie bekomme ich das nur zum laufen, wenn ich die \' weglasse.

Code:
$query = sprintf('SELECT title, client WHERE id = %d", mysql_real_escape_string($id));
Macht das einen Unterschied?

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

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 sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele