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 18-01-2010, 12:09
Abwesend
 Registrierter Benutzer
Links : Onlinestatus : Abwesend ist offline
Registriert seit: Feb 2006
Beiträge: 8
Abwesend ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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?
Mit Zitat antworten
  #2 (permalink)  
Alt 18-01-2010, 12:21
Floern
 Registrierter Benutzer
Links : Onlinestatus : Floern ist offline
Registriert seit: Nov 2009
Ort: Schweiz
Beiträge: 8
Floern befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #3 (permalink)  
Alt 18-01-2010, 13:58
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von Abwesend Beitrag anzeigen
..., 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.

Geändert von fireweasel (18-01-2010 um 14:44 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 18-01-2010, 15:16
Abwesend
 Registrierter Benutzer
Links : Onlinestatus : Abwesend ist offline
Registriert seit: Feb 2006
Beiträge: 8
Abwesend ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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?
Mit Zitat antworten
  #5 (permalink)  
Alt 18-01-2010, 15:34
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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!
Mit Zitat antworten
  #6 (permalink)  
Alt 18-01-2010, 16:17
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von Abwesend Beitrag anzeigen
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($linkzielENT_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.

Geändert von fireweasel (18-01-2010 um 16:25 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 18-01-2010, 18:32
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

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.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #8 (permalink)  
Alt 18-01-2010, 18:51
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von TobiaZ Beitrag anzeigen
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 ...

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
aol-benutzer "richtig" filtern Wurzel BRAINSTORMING PHP/SQL/HTML/JS/CSS 10 03-11-2004 18:17
Ungewolltes Maskieren.... Knopf PHP Developer Forum 7 05-10-2004 10:50
Maskieren Churchill27 PHP Developer Forum 9 23-07-2004 11:20
Maskieren Churchill27 PHP Developer Forum 15 12-07-2004 11:30
formfeld eingabe filtern beebob Apps und PHP Script Gesuche 4 31-05-2003 01:20

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 21:00 Uhr.