php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.09.2006, 12:22  
Erfahrener Benutzer
 
Registriert seit: 01.02.2004
Beiträge: 550
cytrobic
Standard mysql_real_escape_string() immer ?

Soll das immer rein oder nur bei SELECT abfragen ?
Oder auch bei UPDATE und INSERT ?
__________________
keine
cytrobic ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.09.2006, 12:51  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
es muss überall dort angewendet werden, wo manuelle Eingaben des Users ins Spiel kommen (könnten), also zB per Formular-Eingaben.

Dabei ist es egal ob es sich um einen SELECT, UPDATE oder INSERT handelt.
Mit SELECT könnte ein Angreifer Daten anzeigen lassen, die ihn nichts angehen, mit UPDATE könnte er das Passwort des Administrators überschreiben und ein neues setzen (das nur er kennt) oder allgemein Daten manipulieren und INSERT ist da auch nicht besser.

Beste Anwendung von mysql_real_escape_string() siehe Beispiel 3:
http://de.php.net/mysql_real_escape_string
Zergling-new ist offline  
Alt 06.09.2006, 14:01  
Erfahrener Benutzer
 
Registriert seit: 01.02.2004
Beiträge: 550
cytrobic
Standard

ich habe es bis dato immer gemacht wie in Beispiel 1 bzw:

PHP-Code:
$query = ("SELECT * FROM tabelle WHERE user = '".mysql_real_escape_string($_SESSION['username'])."' LIMIT 1"); 
ist das so auch korrekt ? Natürlich nur bei nicht numerischen werten.
Oder ist es nicht sinvoll das direkt ins query zu setzen ?
__________________
keine
cytrobic ist offline  
Alt 06.09.2006, 14:06  
Erfahrener Benutzer
 
Registriert seit: 03.01.2006
Beiträge: 253
CC84
Standard

Zerglings Kommentar stimmt nicht ganz, weil bei einem guten SQL Injection ist man theoretisch gar nicht mehr auf den ursprünglichen SQL Query angewiesen, da dieser einfach regulär beendet und dann ein neuer query eingeführt wird.

Genaueres siehe hier:
http://de.wikipedia.org/wiki/SQL-Injection
CC84 ist offline  
Alt 06.09.2006, 14:06  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Wie gesagt, schau dir mal Beispiel 3 aus dem Manual an.
PHP-Code:
<?php
function quote_smart($value)
{
   
// Ueberfluessige Maskierungen entfernen
   
if (get_magic_quotes_gpc()) {
       
$value stripslashes($value);
   }
   
// In Anfuehrungszeichen setzen, sofern keine Zahl
   // oder ein numerischer String vorliegt
   
if (!is_numeric($value)) {
       
$value "'" mysql_real_escape_string($value) . "'";
   }
   return 
$value;
}

// Verbinden mit der Datenbank
$link mysql_connect('mysql_host''mysql_user''mysql_password')
   OR die(
mysql_error());

// Erstellen eines sicheren Query
$query sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
           
quote_smart($_POST['username']),
           
quote_smart($_POST['password']));

mysql_query($query);
?>
Session-Daten musst du übrigens nicht unbedingt damit behandeln, schließlich hast du die Daten dort hineingeschrieben. Natürlich kann ein Angreifer aber auch versuchen, SQL-Code über den Nicknamen einzuschleusen.
Musst du eben alles bedenken und wie immer gilt eben: Alles was vom User kommt ist eine potenzielle Gefahr.
Zergling-new ist offline  
Alt 06.09.2006, 14:07  
Erfahrener Benutzer
 
Registriert seit: 03.01.2006
Beiträge: 253
CC84
Standard

Zitat:
Zitat von cytrobic
ich habe es bis dato immer gemacht wie in Beispiel 1 bzw:

PHP-Code:
$query = ("SELECT * FROM tabelle WHERE user = '".mysql_real_escape_string($_SESSION['username'])."' LIMIT 1"); 
ist das so auch korrekt ? Natürlich nur bei nicht numerischen werten.
Oder ist es nicht sinvoll das direkt ins query zu setzen ?
Ich persönlich finde es nicht so praktisch, weils unübersichtlich ist, aber funktionell ist es richtig.

PS.: Eine table Tabelle zu nennen ist übrigens auch nicht der ganz große Wurf.
CC84 ist offline  
Alt 06.09.2006, 14:09  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Zitat von CC84
Zerglings Kommentar stimmt nicht ganz, weil bei einem guten SQL Injection ist man theoretisch gar nicht mehr auf den ursprünglichen SQL Query angewiesen, da dieser einfach regulär beendet und dann ein neuer query eingeführt wird.
Richtig, allerdings ist das bei mysql_query() nicht möglich.
Zergling-new ist offline  
Alt 06.09.2006, 14:14  
Erfahrener Benutzer
 
Registriert seit: 01.02.2004
Beiträge: 550
cytrobic
Standard

Zitat:
PS.: Eine table Tabelle zu nennen ist übrigens auch nicht der ganz große Wurf.
...das is nurn beispiel, kein realcode ...

Thx für die antworten, also kann mans direkt ins query einbauen (einziger knackpunkt ist die übersichtlichkeit). Desweiteren ist es: SQL code an ein abgeschlossen query zu hängen mit mysql_query() nicht mehr möglich, dann ists also schon ziemlich sicher.
__________________
keine
cytrobic ist offline  
Alt 06.09.2006, 20:10  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Hi.

Biete in deinem MySQL-Objekt einfach eine Methode an, die als ersten Parameter die Query mit Platzhaltern und als zweiten ein Array mit den Werten erwartet. Damit hast du deine Übersichtlichkeit schnell wieder.

Basti

PS:
Ach ja: sprintf() sollte ich dabei vielleicht noch erwähnen
Basti ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql_real_escape_string beispiel, mysql_real_escape_string immer, mysql_real_escape_string auf query anwenden, bei insert immer daten anzeigen lassen php, beispiele mysql_real_escape_string(), php mysql_real_escape_string beispiel, mysql_real_escape_string insert, printf quote_smart php, mysql_real_escape_string alle anwenden, anwendung mysql_real_escape_string, beispiele mysql_real_escape_string

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:42 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.