php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 29-07-2009, 13:22
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard Probleme mit mysli::real_escape_string in Verbindung mit magic_quotes_gpc

Hallo!

Ich verwende in meinem Skript auf dem FrontController ganz zu Beginn folgende Funktion, die mir alle Backslashes entfernt:

PHP-Code:
  public static function formatMagicQuotesRemove(){
    if(
get_magic_quotes_gpc()){
      if(!empty(
$_GET)){
        
$_GET self::stripArray($_GET);
      }
      if(!empty(
$_POST)){
        
$_POST self::stripArray($_POST);
      }
      if(!empty(
$_COOKIE)){
        
$_COOKIE self::stripArray($_COOKIE);
      }
    }
  }
  private static function 
stripArray($arr){

    foreach(
$arr as $key=>$value){
      if(
is_array($arr[$key])){
        
$arr[$key] = self::stripArray($arr[$key]);
      }
      else{
        
$arr[$key] = stripslashes($arr[$key]);
      }
    }

    return 
$arr;

  } 
Wie ihr seht entfernt sie einfach alle Backslashes, wenn magic_quotes_gpc auf on ist. In meiner .ini siehts so aus, aber ich will ja .ini-unabhängig programmieren:

Code:
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off
Alle SQL-Abfragen werden, bevor sie ausgeführt werden, dann natürlich mit mysqli::real_escape_string escaped. Nun habe ich folgendes Problem:

1. Fall
-------
Verwende ich die oben vorgestellte statische Methode nicht, gibts bei Eingabe von \ und " keinen Error, dafür aber bei ', so wird z.B.

"Daten und deren Darstellung können keine rechtlichen Ansprüche irgendwelch'er Art abgeleitet"

zu dieser SQL-Abfrage:

"Daten und deren Darstellung können keine rechtlichen Ansprüche irgendwelch\\'er Art abgeleitet"

und dies produziert einen Error (1064).. check the... etc.


2. Fall:
-------
Verwende ich oben genannte Methode, führt die Eingabe von " und ' nicht mehr zu einem Error, dafür aber jetzt die Eingabe von \:


'C:\Tomcat\webapps\etc\pub\'

bleibt aber so bei
'C:\Tomcat\webapps\etc\pub\'

Und trotzdem gibts wieder einen 1064-Fehler.

Ich kann mir echt nicht erklären, wieso im 2. Fall noch ein Fehler passiert. Ach ja, die Daten werden vor der Query so behandelt:

PHP-Code:
$value '\''.$this->con->real_escape_string($value).'\'' 
PS: Ich muss vielleicht noch anmerken, dass wenn ich ein Formular den String te\st eingebe, funktioniert das, wenn ich aber test\ eingebe, kommt es zu oben beschriebenem Fehler im 2. Fall.

Geändert von tim-gt (29-07-2009 um 13:27 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 29-07-2009, 13:31
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zeige den erzeugten Query-String und die exakte und komplette Fehlermeldung von MySQL.
Mit Zitat antworten
  #3 (permalink)  
Alt 29-07-2009, 13:43
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Ich sehe das Problem nicht!

Wenn eingeschaltet, dann zu Anfang magic_quotes rekursiv rückgängig machen. Und bei DB Zugriffen alles sauber escapen. Das muß so gehen!
__________________
Wir werden alle sterben

Geändert von combie (29-07-2009 um 13:45 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 29-07-2009, 13:44
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Also, in meinem Formular gebe ich folgenden Wert ein:

C:\Tomcat\webapps\etc\pub\

Die Meldung ist die:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''C:\Tomcat\webapps\etc\pub\'' at line 2 (1064)

Code:
Querystring:

UPDATE mm_core
              SET WebOfficePub = 'C:\Tomcat\webapps\etc\pub\'
Mit Zitat antworten
  #5 (permalink)  
Alt 29-07-2009, 13:45
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tim-gt Beitrag anzeigen
Also, in meinem Formular gebe ich folgenden Wert ein:

C:\Tomcat\webapps\etc\pub\

Die Meldung ist die:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''C:\Tomcat\webapps\etc\pub\'' at line 2 (1064)

Code:
Querystring:

UPDATE mm_core
              SET WebOfficePub = 'C:\Tomcat\webapps\etc\pub\'
Hier wurde kein real_escape_string() ausgeführt. Definitiv nicht. Irgendwie wurde das umgangen. Die PHP-Errors lasst du dir eh anzeigen, oder?
Mit Zitat antworten
  #6 (permalink)  
Alt 29-07-2009, 13:46
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von combie Beitrag anzeigen
Ich sehe das Problem nicht!

Wenn eingeschaltet, dann zu Anfang magic_quotes rekursiv rückgängig machen. Und bei DB Zugriffen alles sauber escapen.
Dann hast du nicht alles gelesen, oder ich bin zu dumm. Gerade das macht ja meine Mehode, die magic_quotes rekursiv rückgängig machen. Und die DB-Zugriffe escape ich ja "sauber" mit mysqli::real_escape_string

Gehts noch sauberer?
Mit Zitat antworten
  #7 (permalink)  
Alt 29-07-2009, 13:48
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Ich kann dieses nur bestätigen:
Zitat:
Zitat von h3ll Beitrag anzeigen
Hier wurde kein real_escape_string() ausgeführt. Definitiv nicht.
Entweder zeigst du den falschen PHP Ausschnitt, oder deine escape Methode ist kaputt.
__________________
Wir werden alle sterben
Mit Zitat antworten
  #8 (permalink)  
Alt 29-07-2009, 13:48
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von h3ll Beitrag anzeigen
Hier wurde kein real_escape_string() ausgeführt. Definitiv nicht. Irgendwie wurde das umgangen. Die PHP-Errors lasst du dir eh anzeigen, oder?

Wenn ich bei der Eingabe bei


C:\Tomcat\webapps\etc\pub\ den letzten Backslash wegnehme, funktioniert es, nur wird es dann zu

C:Tomcatwebappsetcpub
Mit Zitat antworten
  #9 (permalink)  
Alt 29-07-2009, 13:49
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tim-gt Beitrag anzeigen
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''C:\Tomcat\webapps\etc\pub\'' at line 2 (1064)

Code:
Querystring:

UPDATE mm_core
              SET WebOfficePub = 'C:\Tomcat\webapps\etc\pub\'
Sieht nicht so aus, als ob du wirklich Escaping angewendet hättest ...
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #10 (permalink)  
Alt 29-07-2009, 13:52
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tim-gt Beitrag anzeigen
Dann hast du nicht alles gelesen, oder ich bin zu dumm. Gerade das macht ja meine Mehode, die magic_quotes rekursiv rückgängig machen. Und die DB-Zugriffe escape ich ja "sauber" mit mysqli::real_escape_string

Gehts noch sauberer?
Offensichtlich tut dein Programm nicht das, was du denkst.

Kleines Beispiel:
PHP-Code:
$db = new mysqli('localhost''root''''test');

$value'C:\\Tomcat\\webapps\\etc\\pub\\';

var_dump($value);
// string(26) "C:\Tomcat\webapps\etc\pub\"

$value "UPDATE mm_core SET WebOfficePub = '" $db->real_escape_string($value) . "'";

var_dump($value);
// string(67) "UPDATE mm_core SET WebOfficePub = 'C:\\Tomcat\\webapps\\etc\\pub\\'" 
Geht einwandfrei.
Mit Zitat antworten
  #11 (permalink)  
Alt 29-07-2009, 13:52
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von combie Beitrag anzeigen
Ich kann dieses nur bestätigen:
Die Errors lasse ich mir anzeigen, mit einer selbst geschriebenen Debug-Klasse. Diese übernimmt auch den Querystring, der effektiv zur Abfrage verwendet wurde. Siehe Bild.
Miniaturansicht angehängter Grafiken
Probleme mit mysli::real_escape_string in Verbindung mit magic_quotes_gpc-debug.jpg  
Mit Zitat antworten
  #12 (permalink)  
Alt 29-07-2009, 13:58
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Lass dir den Wert direkt vor und nach real_escape_string() ausgeben. Wenn beide gleich sind, dann funktioniert die real_escape_string() Methode nicht. Ist das übrigens die Original-Methode von PHP oder irgendwas selbst gebasteltes? Und wenn selbst gebastelt, warum nicht das von PHP verwenden, wo man auch sicher weiß, dass es funktioniert?
Mit Zitat antworten
  #13 (permalink)  
Alt 29-07-2009, 14:16
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Nein, das ist die Originalmethode, aber ich verwende sie so:

Ich habe folgendes:

PHP-Code:
$sql 'SELECT ID, Name
        FROM core_user
        WHERE ID = :0'
;
    
$st $this->db->prepare($sql);
    
$st->execute('5'); 
Die $args in Methode execute($args) werden dann so behandelt:

PHP-Code:
foreach ($args as $key=>$value){
      
$exp '!:'.$key.'\b!';

      
$this->sql preg_replace($exp,'\''.$this->con->real_escape_string($value).'\'',$this->sql);  
      if(
preg_last_error() !== 0){
        throw new 
ExcDBQuery(NULL$oldsqlpreg_last_error(), 'Querystring konnte nicht ersetzt werden.');
      }
    } 
$this->sql wird dann in der Methode execute() ganz normal mit $mysqli->query($this->sql) ausgeführt.

Was mir einfach nicht einleuchten will, ist, dass wenn ich sdfsdf\asdfsdf übergebe, kein Error kommt, wenn ich aber asdfsf\ übergebe, als den Backslash am Schluss, dann schon. Und dass alle anderen Sonderzeichen '," dennoch funktionieren.

PS: $this->con->real_escape_string ist nichts anderes als $mysqli->real_escape_string
Mit Zitat antworten
  #14 (permalink)  
Alt 29-07-2009, 14:23
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Lass dir folgendes ausgeben:
PHP-Code:
var_dump($value);
var_dump($this->con->real_escape_string($value));
var_dump($this->con); 

Geändert von h3ll (29-07-2009 um 14:29 Uhr)
Mit Zitat antworten
  #15 (permalink)  
Alt 29-07-2009, 14:27
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Sorry, ich will jetzt nicht alle meine Methoden erklären. $db->prepare ist nicht das gleiche wie $mysqli->prepare, da $db kein MySQLi-Objekt ist. DB ist eine Wrapperklasse, die mit der Methode prepare über eine andere Methode connect eine Verbindung zur Datenbank herstellt und dann ein DBStmt Objekt erzeugt. Im DBStmt Objekt geschieht dann alles relevante. In Sachen string-Umwandlung ist die Passage, die ich vorhhin hingeschrieben habe, die einzige, die irgend etwas relevantes tut. Ausser es gäbe sonst noch eine mysqli-Methode, die automatisch Strings escapen würde.

Und ich arbeite nicht mit Prepared Statements, sonst müsste ich ja die :0 und so weiter nicht direkt ersetzen, was mir übrigens lieber ist. Wahrscheinlich wärs mit PS sogar leichter, aber um das geht es ja jetzt nicht.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Verbindung in-power SQL / Datenbanken 2 29-10-2007 06:27
Probleme mit FTP-Verbindung & Upload micronax Netzwerk & Internet 2 04-11-2006 20:56
sicherer wenn magic_quotes_gpc OFF? kendal PHP Developer Forum 2 11-05-2006 16:37
[MySQL 4.1] Verbindung für jede abfrage aufbauen vs. verbindung einmal im script aufbauen flyx SQL / Datenbanken 1 01-12-2005 17:44
Frage zu magic_quotes_gpc MaxPayne PHP Developer Forum 6 19-02-2004 10:38

Themen-Optionen
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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:56 Uhr.