php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 31-10-2010, 18:49
Alex87
 Registrierter Benutzer
Links : Onlinestatus : Alex87 ist offline
Registriert seit: Mar 2010
Beiträge: 24
Alex87 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard Escapen mit mysql_real_escape_string

Hallo Leute,

ich bin grade etwas am Verzweifeln...verfluchtes Escaping!

Ziel des Scriptes ist es, Strings UND Arrays sauber vor SQL-Injections zu schützen.
Dann überprüf ich ob magic_quotes_gpc auf ON gestellt ist und mach es dann rückgängig.
mysql_real_escape_string wird dann drüber gehauen und es sollte eigentlich alles funktionieren.
Hier ist das Script:

PHP-Code:
<?php

//Zur DB wurde bereits connectet

function demaskieren($variable)         // entfernt bereits durch magic_quotes_gpc hinzugefügte Maskierungen wieder (auch bei Arrays!)
{                        // Nutzung der Funktion nur in Verbindung mit clean_string()!
    
if (is_string($variable))
        
$variable stripslashes($variable);

    else
    {

        if (
is_array($variable))
        {
            foreach(
$variable AS $key => $value)
            
demaskieren($variable[$key]);
        }
        
    }

return 
$variable;
    




function 
clean_string($string)            // Nutzung nur direkt vor dem Speichern in der DB! Maskiert alle Strings (auch Arrays!)
{

if (
get_magic_quotes_gpc())
{
    
$string demaskieren($string);    
}


if (
is_string($string))
    
$string mysql_real_escape_string($string);

else
{

    if (
is_array($string))
    {
        foreach(
$string AS $key => $value)
        
$string[$key] = mysql_real_escape_string($string[$key]);
    }
    
}

return 
str_replace("\\n""\n"$string);    // lässt \n als einziges unmaskiertes Zeichen in der DB stehen

}



$wert[0] = 'xx \\n xx \\ xx \" xx \ xx 1';
$wert[1] = 'xx \\n xx \\ xx \" xx \ xx 2';
$wert[2] = 'xx \\n xx \\ xx \" xx \ xx 3';

echo 
$wert[0];
echo 
"<br />";
echo 
clean_string($wert[0])."<br />";
$wert clean_string($wert);
echo 
$wert[0]."<br />";
echo 
$wert[1]."<br />";
echo 
$wert[2]."<br />";

?>
Leider funzt das ganze nicht so wie ich mir das vorstell:

1. Der String ist nicht richtig / nur teilweise escaped (s. an der Ausgabe des Strings)
2. Wenn ich mit die FUnktion mit einem Array aufrufe, kommt am Ende (s. Ausgabe) etwas anderes heraus, als wenn ich ein String des Arrays alleine escape...

Kennt sich jemand mit der Thematik aus? Ich hab echt keine Lust mehr und bin kurz davor mich nur auf magic_quotes_gpc zu verlassen.

Liebe Grüße

Alex
Mit Zitat antworten
  #2 (permalink)  
Alt 31-10-2010, 19:35
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Deine demaskieren-Funktion macht mit Arrays überhaupt nicht das, was sie soll - das hättest du auch leicht selber herausfinden können, wen du mal elementares Debugging betrieben hättest!
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #3 (permalink)  
Alt 31-10-2010, 19:47
Alex87
 Registrierter Benutzer
Links : Onlinestatus : Alex87 ist offline
Registriert seit: Mar 2010
Beiträge: 24
Alex87 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Hm, ich hab die Funktion von hier:
SQL Injection

Auf den ersten Blick erschien sie mir richtig...inwieweit ist sie denn fehlerhaft?
Mit Zitat antworten
  #4 (permalink)  
Alt 31-10-2010, 19:51
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 Alex87 Beitrag anzeigen
Hm, ich hab die Funktion von hier:
SQL Injection
Fall von „zu !&%$ für Copy&Paste“, oder Fall von „was ich in fertigem Code nicht verstehe, schmeiße ich einfach mal raus, und hoffe dann, dass er trotzdem noch das gleiche tut“ - Klasse!

Zitat:
Auf den ersten Blick erschien sie mir richtig...inwieweit ist sie denn fehlerhaft?
Mache Testausgaben, vorher und nachher, dann siehst du es.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #5 (permalink)  
Alt 31-10-2010, 20:59
Alex87
 Registrierter Benutzer
Links : Onlinestatus : Alex87 ist offline
Registriert seit: Mar 2010
Beiträge: 24
Alex87 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Hmmm, ich hab das & vor dem Parameter ind er Hauptfunktion mal hinzugefügt, und siehe da, es funktioniert. Dachte das sein ein Schreibfehler im Script gewesen Dafür erstmal Danke!

Was bewirkt & in diesem Fall?

Jetzt zur generellen Frage zur Funktionalität:

Wenn ich die Funktion
clean_string($string) nun mit folgendem String aufrufe:

echo clean_string('xx \\n xx \\ xx \" xx \ xx 2');

Dann wird folgendes ausgegeben:
xx n xx xx \" xx xx 1


Das ist aber doch nicht korrekt oder?!
Bitte tu mir den Gefallen und versuch es mir zu erklären...bin nicht fit in der Thematik genug.

Mein großes Problem ist einfach, dass ich kein Plan habe, WANN magic_quotes_gpc denn genau die Strings escaped. Nur bei Get/Post/Cookie oder auch wenn ich selbst einer Variable einen Wert zuweise?


Mit Zitat antworten
  #6 (permalink)  
Alt 31-10-2010, 21:11
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

& ist der Referenz-Operator und in magic_quotes_gpc steht GPC für Get, Post und Cookie. Die Details schlägst du jetzt bitte im Manual nach!
Mit Zitat antworten
  #7 (permalink)  
Alt 31-10-2010, 22:02
Alex87
 Registrierter Benutzer
Links : Onlinestatus : Alex87 ist offline
Registriert seit: Mar 2010
Beiträge: 24
Alex87 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Ok, Referenz-Operator ist nun klar, GPC auch.

Nehmen wir nun an, ein User gibt in einem Formular folgenden String an (auch wenn er sinnlos ist):

xx \n xx \ xx " xx

Der String wird per Post an die nächste Seite weitergegeben. magic_quotes_gpc macht daraus folgendes:

xx \\n xx \\ xx \" xx

mit meiner demaskieren-Funktion mach ich dies wieder rückgänig.
Nun kommt
mysql_real_escape_string und sollte wieder dies daraus machen:

xx \\n xx \\ xx \" xx

So das Prinzip.

Wenn ich versuche, dies damit nachzumachen (String entspricht dem Inhalt der Post-Variable):
echo clean_string('xx \\n xx \\ xx \" xx');

Dann gibt er mir jedoch das hier aus:
xx n xx xx \" xx

Also stimmt doch noch etwas nicht, oder hab ich nun etwas nicht verstanden?
Mit Zitat antworten
  #8 (permalink)  
Alt 31-10-2010, 23:45
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Nutze bitte die php- bzw. code-Tags, statt den Text farbig zu formatieren.

Zitat:
Zitat von Alex87 Beitrag anzeigen
Wenn ich versuche, dies damit nachzumachen (String entspricht dem Inhalt der Post-Variable):
PHP-Code:
echo clean_string('xx \\n xx \\ xx \" xx'); 
Dann gibt er mir jedoch das hier aus:
Code:
xx n xx  xx \" xx
Ja, war doch zu erwarten.

Deine Eingabe lautet
Code:
xx \n xx \ xx \" xx
Deine demaskieren-Funktion macht daraus, wenn magic_quotes_gpc aktiv ist
Code:
xx n xx  xx " xx
Bleibt als einzig potentiell gefährliches Zeichen das ", und um das kümmert sich anschließend mysql_real_escape_string ordnungsgemäß.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #9 (permalink)  
Alt 01-11-2010, 00:53
Alex87
 Registrierter Benutzer
Links : Onlinestatus : Alex87 ist offline
Registriert seit: Mar 2010
Beiträge: 24
Alex87 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Klasse wahsag, jetzt kann ichs nachvollziehen!

Nur ein Problem kommt für mich dadurch zustande:

Wenn ich Usereingaben von einem Textarea mit dieser Funktion bearbeite, macht sie aus einem durch den User eingefügten Zeilenumbruch "\n" ein "n".

Somit wird der Text ohne Zeilenumbrüche in der DB gespeichert und diese sind auch nicht mehr wiederherstellbar.

Als Lösung könnte man vor dem Aufruf von
PHP-Code:
stripslashes() 
alle "\n" in bspw "##Zeilenumbruch##" umwandeln und nach
PHP-Code:
stripslashes() 
wieder in ein "\n" verwandeln. Aber da gibt es doch sicherlich eine sauberere Methode, oder?
Mit Zitat antworten
  #10 (permalink)  
Alt 01-11-2010, 01:16
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.595
h3ll befindet sich auf einem aufstrebenden Ast
Standard

\\n ist kein Zeilenumbruch, sondern einfach nur ein Backslash gefolgt von einem n.
Mit Zitat antworten
  #11 (permalink)  
Alt 01-11-2010, 01:16
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 Alex87 Beitrag anzeigen
Wenn ich Usereingaben von einem Textarea mit dieser Funktion bearbeite, macht sie aus einem durch den User eingefügten Zeilenumbruch "\n" ein "n".
Ein vom Nutzer in einer Textarea gemachter Zeilenumbruch ist überhaupt kein "\n" - das ist doch nur ein Behelfskonstrukt, um den Zeilenumbruch innerhalb von PHP-Quellcode darzustellen ...!

Deine Grundlagenkenntnisse scheinen irgendwo zwischen mangelhaft und miserabel angesiedelt zu sein.
Arbeite daran bitte erst mal, sonst bringt das hier nichts - weil wir dir jeden Kleinkram erklären müssen, der eigentlich selbstverständlich sein sollte.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #12 (permalink)  
Alt 01-11-2010, 01:25
Alex87
 Registrierter Benutzer
Links : Onlinestatus : Alex87 ist offline
Registriert seit: Mar 2010
Beiträge: 24
Alex87 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Naja, nehmts mir ned übel, aber wofür ist das Forum denn da? Ich behaupte mal, dass ich zumindest ein Grundwissen an PHP habe. Und wenn hier nur Profis Fragen stellen dürfen, dann macht das Forum ja auch keinen Sinn mehr, oder?

Dass \n keinen Zeilenumbruch erzeugt ist mir schon klar.
Ich lese aber die Daten aus der DB aus und bevor ich diese dann auf der Webseite ausgebe, nutz ich PHP: nl2br - Manual , um die Zeilenumbrüche zu erzeugen.

Dadurch dass vom "\n" jedoch der Slash entfernt wird, ist die Umwandlung nicht mehr möglich...hoffe diese Frage geht in Ordnung
Mit Zitat antworten
  #13 (permalink)  
Alt 01-11-2010, 01:27
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.595
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Alex87 Beitrag anzeigen
Dass \n keinen Zeilenumbruch erzeugt ist mir schon klar.
Ich lese aber die Daten aus der DB aus und bevor ich diese dann auf der Webseite ausgebe, nutz ich PHP: nl2br - Manual , um die Zeilenumbrüche zu erzeugen.

Dadurch dass vom "\n" jedoch der Slash entfernt wird, ist die Umwandlung nicht mehr möglich...hoffe diese Frage geht in Ordnung
Warum sollte nl2br aus \n (Backslash + n) einen Zeilenumbruch erzeugen? Das macht doch keinen Sinn.

PHP-Code:
$text 'Hello \n World';

echo 
nl2br($text);
// Hello \n World 
Mit Zitat antworten
  #14 (permalink)  
Alt 01-11-2010, 01:39
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 Alex87 Beitrag anzeigen
Dadurch dass vom "\n" jedoch der Slash entfernt wird, ist die Umwandlung nicht mehr möglich...
Nein, das ist immer noch falsch.

Der Zeilenumbruch, der dir vom Browser übermittelt wird, besteht nicht aus den Zeichen \ und n - also gibt es da auch kein \ zu entfernen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #15 (permalink)  
Alt 01-11-2010, 01:44
Alex87
 Registrierter Benutzer
Links : Onlinestatus : Alex87 ist offline
Registriert seit: Mar 2010
Beiträge: 24
Alex87 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Ich merks grad auch...

Das erste Beispiel im Manuel:

PHP: nl2br - Manual

Ist aber eigentlich das, was ich meine... Das gibts doch nicht.

PHP-Code:
<?php
echo nl2br("foo ist nicht\n bar");
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

HTML-Code:
foo ist nicht<br />
 bar
Ich weiß, es ist spät, aber da stehts doch?^^ Wieso geht das jetzt nicht in meinem Test-Script.
Ich hasse PHP
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
mysql_real_escape_string Magic11 PHP Developer Forum 6 03-12-2009 23:01
mysql_real_escape_string nobody2 PHP Developer Forum 2 04-02-2007 09:25
mysql_real_escape_string() dakingno1 PHP Developer Forum 13 19-12-2006 11:07
mysql_real_escape_string gugug SQL / Datenbanken 11 11-12-2006 18:17
Escapen Churchill27 PHP Developer Forum 2 26-08-2006 13:37

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

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:40 Uhr.