| 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! Post your PHP questions here! |
 |

18-01-2010, 11:09
|
|
Abwesend
Registrierter Benutzer
|
|
Registriert seit: Feb 2006
Beiträge: 8
|
|
Eingabe richtig Filtern und maskieren
Hallo zusammen,
Ich habe mir ein kleines Newsscript geschrieben. Mit Sicherheit hatte ich vorher nie viel zu tun. Daher habe ich mich schon selber über Probleme wie mysql injection oder Cross-Site Scripting Informiert. Ich denke das ich alle Ratschläge gut umsetzten konnte um die Sicherheit zu gewährleisten.
Aber nun zu meiner Frage, ich lasse die Benutzer auch Kommentare schreiben.
Vor dem Absenden muss man ein captcha eingeben. Die Eingabe maskiere ich so:
PHP-Code:
$artikelid = (int)$_POST['id'];
if(isset($_POST['nachricht']) && !empty($_POST['nachricht']) && !is_array($_POST['nachricht']))
$nachricht = htmlspecialchars($_POST['nachricht']);
$nachricht = strip_tags($nachricht);
$nachricht = stripslashes($nachricht);
$nachricht = mysql_real_escape_string($nachricht);
}
Nun meine Frage an die Experten, ist das so ok oder habe ich etwas Elementares vergessen?
|

18-01-2010, 11:21
|
|
Floern
Registrierter Benutzer
|
|
Registriert seit: Nov 2009
Ort: Schweiz
Beiträge: 8
|
|
Da gibt es zwei kleine Unstimmigkeiten im Script:
- Da du strip_tags() nach htmlspecialchars() anwendest, bleibt strip_tags() wirkungslos.
- Und stripslashes() arbeitet nach htmlspecialchars() auch nicht mehr zuverlässig.
Wenn, dann würde ich es so machen:
PHP-Code:
$artikelid = (int)$_POST['id']; if(isset($_POST['nachricht']) && !empty($_POST['nachricht']) && !is_array($_POST['nachricht'])) $nachricht = stripslashes($_POST['nachricht']); $nachricht = strip_tags($nachricht); $nachricht = htmlspecialchars($nachricht); $nachricht = mysql_real_escape_string($nachricht); }
Eventuell würde ich strip_tags() rausnehmen, da HTML mit htmlspecialchars() schon unschädlich gemacht wird.
Ansonsten sieht das Vorgehen sehr sicher aus.
|

18-01-2010, 12:58
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von Abwesend
..., ich lasse die Benutzer auch Kommentare schreiben.
Vor dem Absenden muss man ein captcha eingeben. Die Eingabe maskiere ich so:
PHP-Code:
$artikelid = (int)$_POST['id'];
if(isset($_POST['nachricht']) && !empty($_POST['nachricht']) && !is_array($_POST['nachricht']))
$nachricht = htmlspecialchars($_POST['nachricht']);
$nachricht = strip_tags($nachricht);
$nachricht = stripslashes($nachricht);
$nachricht = mysql_real_escape_string($nachricht);
}
Nun meine Frage an die Experten, ist das so ok oder habe ich etwas Elementares vergessen?
|
Nunja, zumindest der gute Wille ist anzuerkennen ...
Einfach alle "Sicherheitsfunktionen" hintereinander zu schalten, bringt exakt gar nichts. Im besten Fall verstümmelst du die Benutzereingaben zur Unkenntlichkeit.
Die Grundregel lautet: Benutze die passende Filterfunktion für den entsprechenden Kontext![1]
- Willst du (Text-)Daten in die HTML-Ausgabe einbetten, benutze htmlspecialchars(). Nur bei der Ausgabe!
- Willst du die Eingaben des Benutzers in eine Datenbank schreiben, benutze mysql_real_escape_string() oder die passende Escape-Funktion des von dir verwendeten Datenbanktreibers.
- Soll Text in eine URL eingefügt werden, benutze rawurlencode().
Guckst du auch hier für umfangreichere Erklärungen:
Kontextwechsel erkennen und behandeln
Lass lieber die Finger von unsinnigen Funktionen wie strip_tags() und strip_slashes(). Die richten meist mehr Schaden an, als sie Gutes bewirken können.
Strip_tags() entfernt Teile des übergebenen Textes, lies sich aber in der Vergangenheit mit überlangen "Tags" austricksen. Damit konnte dann wieder "gefährliches HTML" eingeschmuggelt werden.
Strip_slashes() brauchst du bei einer sauberen PHP-Installation nicht. Und falls das schwachsinnige Magic-Quoting tatsächlich aktiviert sein sollte, hilft strip_slashes() nicht in allen Fällen, die richtigen Backslashes wegzumachen.
--
[1] Ich finde zwar Kontext ein schreckliches (deutsches) Wort, aber was solls: So lange einem nichts Passenderes einfällt.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (18-01-2010 um 13:44 Uhr)
|

18-01-2010, 14:16
|
|
Abwesend
Registrierter Benutzer
|
|
Registriert seit: Feb 2006
Beiträge: 8
|
|
Hallo und danke für eure Antworten,
also, da magic quotes bei mir aktiviert ist sollte ich ich stripslashes() auf jeden Fall machen, zumindest laut PHP.net :
Zitat:
|
Hinweis: Ist magic_quotes_gpc aktiviert, wenden Sie zuerst stripslashes() auf die Daten an. Das Bearbeiten bereits in irgend einer Form maskierter Daten durch mysql_real_escape_string führt ansonsten dazu, dass bereits Maskiertes doppelt maskiert wird.
|
Das mysql_real_escape_string() Auf jeden Fall genommen werden sollte ist mir klar.
Da es bei diesem Skipt um Kommentare handelt, sollte ja auch die Eingabe 1 zu 1 wiedergegeben werden. Daher ist doch htmlspecialchars() sowieso zu Empfehlen?!
Das ist zumindest das was ich mir dabei gedacht habe. Ich lerne ja immer gerne dazu! Wenn ich dich also richtig verstanden habe, ist in diesem Fall strip_tags fehl am Platz?
|

18-01-2010, 14:34
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
htmlspecialchars hat aber nichts mit SQL zu tun. Das kannst du anwenden, wenn die Daten aus der DB rauskommen und angezeigt werden sollen. Auf die Beachtung des Kontext wurdest du schon hingewiesen.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

18-01-2010, 15:17
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von Abwesend
Hallo und danke für eure Antworten,
also, da magic quotes bei mir aktiviert ist sollte ich ich stripslashes() auf jeden Fall machen, ...
|
Welcher Hoster konfiguriert seine Server heutzutage noch so schwachsinnig?
Nehmen wir mal an, dass du um die "magischen Hochkommas" nicht herumkommst. Dann solltest du trotzdem besser prüfen, ob sie aktiviert sind. Sie können in absehbarer Zeit auch abgeschaltet werden. In dem Fall würde stripslashes() ohne Vorsichtsmaßnahmen Benutzereingaben kaputt machen. Das mindeste wäre die Abfrage per get_magic_quotes_gpc():
PHP-Code:
if (get_magic_quotes_gpc()) {
$input = strip_slashes($_POST['input']);
}
else {
$input = $_POST['input'];
}
Zitat:
|
Das mysql_real_escape_string() Auf jeden Fall genommen werden sollte ist mir klar.
|
Bei jedem Fall, wo du Benutzereingaben in Datenbank-Queries einbaust. In den anderen Fällen kannst du darauf verzichten.
Zitat:
|
Da es bei diesem Skipt um Kommentare handelt, sollte ja auch die Eingabe 1 zu 1 wiedergegeben werden. Daher ist doch htmlspecialchars() sowieso zu Empfehlen?!
|
Aber nur bei der Ausgabe als HTML-Text. Auch hier mal ein Beispiel, das verdeutlicht, wo und wie htmlspecialchars() eingesetzt werden muss:
PHP-Code:
// eine Benutzereingabe
$linkbeschreibung = $_GET['artikel'];
// magic quotes sind off
// man stelle sich in $linkbeschreibung
// irgendwas mit ä,ö,ü, ß oder anderen
// nicht URL-freundlichen Zeichen vor, etwa
// Kategorie:Süßwasseramöbe ;)
// eine URL
$linkziel = 'http://de.wikipedia.org/wiki/'
. rawurlencode($linkbeschreibung);
// ein HTML-Gerüst (oberer Teil)
$html = '<html><head></head><body><div>';
// ein Link
$html .= sprintf(
'<a href="%s">%s</a>',
htmlspecialchars($linkziel, ENT_QUOTES),
htmlspecialchars($linkbeschreibung)
);
// HTML-Gerüst (restlicher Teil)
$html .= '</div></body></html>';
echo $html;
Zitat:
|
Wenn ich dich also richtig verstanden habe, ist in diesem Fall strip_tags fehl am Platz?
|
Um dich selbst zu zitieren:
Zitat:
|
Da es bei diesem Skipt um Kommentare handelt, sollte ja auch die Eingabe 1 zu 1 wiedergegeben werden.
|
Du möchtest schließlich die Benutzereingaben erhalten und nichts rauslöschen.
In meinen Augen ist strip_tags() IMMER fehl am Platz. Ich kenne keine nützliche praktische Anwendung dieser Funktion. Die meisten wollen eigentlich die Funktionialität von htmlspecialchars(), wenn sie strip_tags() oder htmlentities() benutzen.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (18-01-2010 um 15:25 Uhr)
|

18-01-2010, 17:32
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.188
|
|
OffTopic: Strip Tags kann immer dann sinnvoll sein, wenn man einen HTML-Quelltext als Grundlage hat und nur wesentliche Informationen Filtern will.
Aber bei der Validierung von Benutzereingaben machts in der Regel tatsächlich mehr kaputt als dass es nützt.
|

18-01-2010, 17:51
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von TobiaZ
OffTopic: Strip Tags kann immer dann sinnvoll sein, wenn man einen HTML-Quelltext als Grundlage hat und nur wesentliche Informationen Filtern will.
...
|
OffTopic:
Für den Zweck hätte ich wahrscheinlich preg_replace() oder einen selbstgestrickten HTML-"Parser" angeschmissen. 
Mal kucken, wie sich strip_tags() im Vergleich dazu macht. Mir schwant, es könnte diversen Text auch zwischen den <script>- und <style>-Tags stehen lassen ...
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|
|
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
|