XSS - Problem mit Suchformular

  • Moin,

    ich habe ein großes Cross Site Scripting - Problem mit meinem Suchformular...
    Bei letzten Tests mit dem Theme ist mir aufgefallen, dass über das Formular Scripte ausgeführt werden können (XSS-Alert).

    Hatte auch schon versucht ein strip_tags auf das input-Feld zu legen, aber das bringt irgendwie keinen Erfolg - oder ich mache es falsch :sad:.

    Hat jemand einen Tipp, wie ich das unterbinden kann? Ich weiß ehrlich gesagt nicht mehr weiter...

    Thomas

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Ja, ja... Die gute alte Doku... Danke! Da guck ich auf Grund der "Aktualität" eher selten bis gar nicht nach... :)

    Hab aber in der Tat was gefunden...

    Zitat

    Als Themeentwickler oder auch interessierter Themebenutzer sollte man zum Thema Sicherheit beachten dass niemals ungefilterte Benutzereingaben aus z.B. Formularfeldern wie dem Suchformular ausgegeben werden – prädestinierte Angriffsziele für XSS-Attacken. Um eine sichere Ausgabe dieser Daten zu ermöglichen (z.B. ein ‘Sie haben nach xyz gesucht’ o.ä.) sollten die entsprechenden Variablen mit der Funktion wp_specialchars() unschädlich gemacht werden.


    Soweit so gut, aber ist wp_specialchars() nicht WP-Standard in Forms? Oder muss/kann ich die separat für ein Eingabefeld ansprechen?

  • Innerhalb von WordPress sollte das eigentlich alles richtig behandelt werden. Bleibt die Ausgabe des Suchbegriffs im Theme, das muss im Theme korrekt gemacht werden. Im neuen Twentyten sieht das so aus (kann aber sein dass es die Funktion erst ab WP 3.0 gibt):

    PHP
    <?php the_search_query(); ?>

    Und im älteren Default-Theme wird z.B. das Suchformular über get_search_form() eingebunden, welches den Suchbegriff so ausgibt:

    PHP
    <?php print esc_attr(apply_filters('the_search_query', get_search_query())); ?>

    Hilft Dir das weiter?!

  • Moin Ammaletu,

    Jaein... Hatte ich schon versucht.

    Mein Aufruf in der functions.php sieht jetzt so aus - habe es zum testen mal eingebunden; (aus der WP-Doku)

    PHP
    function my_search_form($form) {
        $form = '<form method="get" id="searchform" action="' . esc_attr(get_option('home')) . '/" >
        <div><label class="hidden" for="s">' . __('Search for:') . '</label>
        <input type="text" value="' . esc_attr(apply_filters('the_search_query', get_search_query())) . '" name="s" id="s" />
        <input type="submit" id="searchsubmit" value="'. esc_attr(__('Search')) .'" />
        </div>
        </form>';
    return $form;
    }
    add_filter('get_search_form', 'my_search_form');

    Die Ausgabe in der search.php dann so;

    PHP
    <h2> <?php printf(__('Searchresults for &quot;%1s&quot;', 'altop'), get_search_query() ); ?> </h2>

    Berichtigt mich bitte, wenn ich irre, aber die Funktion oben esc_attr soll die Code-Formate entfernen. Dann wird die gifilterte Ausgabe an get_search_query übergeben und dann gefiltert in der search.php ausgegeben, oder?
    Nur ich bekomme diese Lücke icht geschlossen.... Ich werde wahnsinnig... :-x

  • Hi,

    bin ganz neu bei Wordpress, daher hoffe ich, keinen Unsinn zu verzapfen...

    XSS kann bei jeder Ausgabe von ungefilterten User Eingaben auftreten (GET/POST). Z.B. dann wenn du das Suchwort nochmal ausgibst.
    Die einfachste Art das zu verhindern, ist, wenn du ein htmlentities() nutzt:

    PHP
    htmlentities($searchword)

    Eventuell gibt es aber Wordpress eigene Methoden (removeXSS oder so ähnlich...).

    P.S.: strip_tags hilft nicht gegen XSS (eventhandler, etc.. werden nicht entfernt)

  • Hm, wie äußert sich Dein Problem denn? Ich gebe in meinem Theme den Suchbegriff einfach so aus:

    PHP
    echo '<p>Für die Suche nach &quot;'; the_search_query(); echo '&quot; wurden die folgenden ' . $wp_query->found_posts . ' Beiträge gefunden.</p>';

    Weiter habe ich daran nichts überschrieben. Und wenn ich z.B. nach "<b>Hallo</b>" suche, wird das so auch wieder ausgegeben und nicht als fettes Hallo. Ist das als Testcase zu einfach? Poste mal ein Beispiel, was durchrutscht. Welche Version nutzt Du eigentlich? Obiges ist unter WP 2.8 getestet.

  • Wenn ich bspw. folgenden Code in mein Suchfeld eingebe;

    Code
    <script type="text/javascript">alert("XSS");</script>


    passiert folgendes...

    1. es öffnet sich das "Alert XSS" - Fenster (der Code wird also ausgeführt
    2. Auf der Such-Ergbnisseite steht dann: Suchergebnisse für " ". Also der Begriff wird nicht angezeigt


    Es sollte doch so sein das steht;
    Suchergebnisse für "<script type="text/javascript">alert("XSS");</script>".

    Das Theme erstelle ich gerade auf XAMPP unter WP 2.9.2

  • Gelöst! :)

    Hey!

    Danke für Eure Antworten! Nachdem ich den Code der Suche tausend Mal durchgegangen bin, hab ich den Wald vor lauter Bäumen gesehen... 8)

    Dank dem Tipp von "einpraegsam"...

    Des Rätsels Lösung für diejenigen, die mal ein ähnliches Problem haben;
    Im Theme rufe ich bei "erfolgloser" Suche ebenfalls den Suchbegriff auf. Den hab ich nun mit dem htmlentities entschärft, und es funktioniert alles bestens.

    PHP
    <?php printf (__('<h2>Sorry, but there are no results for:<span class="keyword"> %s </span></h2> Try again with another keyword.', 'altop'), htmlentities(get_search_query()) ); ?>

    Danke nochmal!

    Thomas

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!