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. |
 |
|

31-10-2010, 18:49
|
Alex87
Registrierter Benutzer
|
|
Registriert seit: Mar 2010
Beiträge: 24
|
|
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
|

31-10-2010, 19:35
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
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.
|

31-10-2010, 19:47
|
Alex87
Registrierter Benutzer
|
|
Registriert seit: Mar 2010
Beiträge: 24
|
|
Hm, ich hab die Funktion von hier:
SQL Injection
Auf den ersten Blick erschien sie mir richtig...inwieweit ist sie denn fehlerhaft?
|

31-10-2010, 19:51
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
Zitat:
Zitat von Alex87
|
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.
|

31-10-2010, 20:59
|
Alex87
Registrierter Benutzer
|
|
Registriert seit: Mar 2010
Beiträge: 24
|
|
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?
|

31-10-2010, 21:11
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
|
|
& 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!
|

31-10-2010, 22:02
|
Alex87
Registrierter Benutzer
|
|
Registriert seit: Mar 2010
Beiträge: 24
|
|
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?
|

31-10-2010, 23:45
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
Nutze bitte die php- bzw. code-Tags, statt den Text farbig zu formatieren.
Zitat:
Zitat von Alex87
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:
|
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
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.
|

01-11-2010, 00:53
|
Alex87
Registrierter Benutzer
|
|
Registriert seit: Mar 2010
Beiträge: 24
|
|
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 alle "\n" in bspw "##Zeilenumbruch##" umwandeln und nach wieder in ein "\n" verwandeln. Aber da gibt es doch sicherlich eine sauberere Methode, oder?
|

01-11-2010, 01:16
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 3.611
|
|
\\n ist kein Zeilenumbruch, sondern einfach nur ein Backslash gefolgt von einem n.
|

01-11-2010, 01:16
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
Zitat:
Zitat von Alex87
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.
|

01-11-2010, 01:25
|
Alex87
Registrierter Benutzer
|
|
Registriert seit: Mar 2010
Beiträge: 24
|
|
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
|

01-11-2010, 01:27
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 3.611
|
|
Zitat:
Zitat von Alex87
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
|

01-11-2010, 01:39
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
Zitat:
Zitat von Alex87
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.
|

01-11-2010, 01:44
|
Alex87
Registrierter Benutzer
|
|
Registriert seit: Mar 2010
Beiträge: 24
|
|
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
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
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.
HTML-Code ist aus.
|
|
|
|
PHP News
|