# Eingabefelder vor Codeeinspeisung schützen



## markus-heinisch (17. Februar 2004)

Hallo Leute,

würde mich mal interessieren wie ich meine Eingabefelder (Input,Textarea, etc.) vor HTML-Code oder fremder Codeeinspeisung wie JavaScript schützen kann. Gibt es da schon Funktionen die mir evtl. helfen könnten? Oder habt ihr ein paar Ideen?

Ein aktueller Pfall ist ja gerade bei ebay aufgetaucht mit der Einspeisung eines JavaScriptes um die Bewertungsanzeige zu manipulieren....

Wäre euch für Ratschläge dankbar.


----------



## Chino (17. Februar 2004)

Hier mal ne kleine Funktion die vor allem auch SQL-Injections rausfiltert:


```
function conv2DB($myString) {
     $myString = stripslashes($myString);
     $myString = trim($myString);
     $myString = str_replace("'","&acute;",$myString);
     $myString = str_replace('<','&lt;',$myString);
     $myString = str_replace('>','&gt;',$myString);
     $myString = eregi_replace("INSERT","",$myString);
     $myString = eregi_replace("DELETE","",$myString);
     $myString = eregi_replace("SELECT","",$myString);
     $myString = eregi_replace("UPDATE","",$myString);
     $myString = eregi_replace("DROP","",$myString);
     $myString = eregi_replace("ALTER","",$myString);
     $myString = eregi_replace("mysql","",$myString);
     $myString = eregi_replace("query","",$myString);
     return $myString;
}
```


----------



## split (17. Februar 2004)

Was bringt es denn, SQL-Injections raus zu filtern?
So kann man beispielsweise das Wort "Alter" nicht mehr benutzen!
Ich würde einfach htmlspecialchars()  verwenden.


----------



## Chino (17. Februar 2004)

> _Original geschrieben von split _
> *Was bringt es denn, SQL-Injections raus zu filtern?
> So kann man beispielsweise das Wort "Alter" nicht mehr benutzen!
> Ich würde einfach htmlspecialchars()  verwenden. *


 Ok, dann mach Du das mit htmlspecialchars(). Aber Stell Dir doch mal folgenden Fall vor: 

SQL-Query zum Login:


```
SELECT * FROM members WHERE username ='$username'  AND password = '$pass'
```

So, und anstatt ich jetzt meinen Usernamen eingebe, geb ich einfach folgendes ein:
	
	
	



```
; DELETE FROM members; - '
```

Und dann wird aus dem Query folgende Anweisung:

```
SELECT * FROM members WHERE username =''; DELETE FROM members; - ' AND password = 'pass'
```

Das wäre jetzt nicht so schön, wenn Du jetzt die SQL-Anweisung ausführst. Aus der eigentlichen Query wurden somit zwei verschiedene, getrennt durch das Semikolin (. Jetzt sind alle Mitgliedsdaten futsch. Das ' -' am Ende bedeutet, dass alles, was folgt, ein SQL-Kommentar ist, und somit nicht ausgeführt werden soll. 

Ok, ob ALTER jetzt wirklch rausgefiltert werden muss, is die Frage, aber generell würd ich _jede_ Eingabe, die von außen kommt, filtern, und nicht nur mit htmlspecialchars(). Siehe hierzu auch den Artikel zum Thema Sicherheit


----------



## JohannesR (17. Februar 2004)

string *mysql_escape_string* ( string unescaped_string)

_Edit: Ich würde TRUNCATE members benutzen_


----------



## Chino (17. Februar 2004)

> _Original geschrieben von Johannes Röttger _
> *string mysql_escape_string ( string unescaped_string)*


Ok, so kann man es natürlich auch machen. Es ging sich ja eher darum, warum man überhaupt SQL-Injections rausfiltern sollte.



> _Original geschrieben von Johannes Röttger _
> *Ich würde TRUNCATE members benutzen  *



Hehe, ja, das würde natürlich funktionieren


----------



## markus-heinisch (17. Februar 2004)

ok danke das ist richtig was du sagst. das wäre fatal wenn man sowas machen könnte mit den sql statements.


----------



## ludz (17. Februar 2004)

Mal ne Verständnisfrage:
Macht denn die Funktion mysql_escape_string meine Daten, die aus dem Inputfeld kommen nun wirklich sicher bzw. unschädlich? Mit anderen Worten löst der alleinige Einsatz dieser Funktion das Problem von SQL Injections? Wohl eher nicht oder?


----------



## JohannesR (17. Februar 2004)

Doch, Hochkommata werden mit einem Backslash escaped. Damit wird der Text zwischen zwei Hochkommata unschädlich gemacht.


----------



## ludz (17. Februar 2004)

Danke für die Antwort. Dann scheint es ja ein leichtes zu sein, seine Scripts vor SQL Injections zu schützen (keine tausend str_replace o.Ä. mehr).


----------



## JohannesR (17. Februar 2004)

Ja, im Prinzip ist es wirklich einfach, man muss es nur machen!


----------



## markus-heinisch (18. Februar 2004)

also benutze ich mysql_escape_string statt der funktion von Chino?


----------



## F.o.G. (18. Februar 2004)

schnell mal unter http://de.php.net/mysql_escape_string geguckt. 

Im Kommentar unten drunten hab ich folgendes gefunden:



> The php mysql_db_query function allow only one querry at a time, thus it is not possible to execute more than one query by passing ";" in some form field.



Des weiteren sehe ich keinen Unterschied zur Funktion addslashes(); 

es sollte auch noch gesagt werden, dass solche maskierten Eingaben bei der Ausgabe mit der Funktion stripslashes() bearbeitet werden sollte, sonst wirds schwer einen Text mit vielen Zitaten zu lesen 

Korrigiert mich.

Ciao, Jörg


----------



## markus-heinisch (26. Februar 2004)

hier mal eine tolle antwort von meinem bekannten:
------------------------------------
Es reicht ausdrücklich nicht aus, die Eingaben nach SQL-Schlüsselwörtern zu Filtern! Ein Angreifer könnte nämlich die Filterung durch mehrere Tricks aushebeln:
    -Sonderzeichen
     -Alternative Darstellung des Textes (etwa im Unicode Format). 
     Man kann Schlüsselwörter nicht nur so schreiben: "ALTER" 
     sondern z.B. auch so: "UNICODE UTF-16 Transform: \x0041\x004c\x0054\x0045\x0052". Viel Spaß beim Filtern ;-)
     -Bugs in Deiner Filterroutine ausnutzen
------------------------------------
und da hat er gewaltig recht! werde also nun mysql_escape_string nehmen.

gut das das wort alter und nicht alder heisst sonst könnte man den ganzen türkischen wortschatz nicht mehr nutzen.  

Also danke für die Antworten. Thema kann geschlosen werden.


----------

