Unterschiedliche Behandlung von ctype_digit() und strval() (PHP-Funktionen)

  • Hallo liebe Gemeinde,

    ich habe ein Problem mit einer PHP-Funktion, die ich in einem Seitentemplate von Wordpress benutze. Ich weiß, ich sollte die Frage in einem PHP-Forum stellen, aber vielleicht findet sich jemand, der mir auf Anhieb einen Tipp geben kann.

    Ich habe ein Seitentemplate, an dessen Beginn ich einen REQUEST abfange. Hauptsächlich erfasse ich dort verschiedene IDs, die ich mit der GET-Methode an die gleiche Seite sende.


    Das Problem befindet sich hier:

    PHP
    if (ctype_digit(strval($message_ID)) == TRUE)


    Nach mehreren Tests, mit var_dump und manuellem Debugging, gibt mir diese Überprüfung - trotz das in der URL eine Zahl für diese Variable steht - ein FALSE aus. Bei allen anderen Überprüfung klappt es.

    Die URL kommt von wp_redirect(), etwas später aus dem Skript. Zum Beispiel hier:

    Ich bin relativ unerfahren damit, bin also für fachliche Hinweise hoffen, die mir das Problem erklären... Ich hoffe, das Problem kannst du reproduzieren. Falls du mehr Infos brauchst, lass es mich bitte wissen.

    Ich sitze schon seit 4 Stunden dran und komme nicht weiter...

    Danke für deine Hilfe im Voraus.

    Gruß
    Sergeij

    • 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

  • So würde ich das nicht schreiben, eher so:

    PHP
    if (isset($_GET["message_ID"]) and !empty($_GET["message_ID"])) {
    
    
        $the_request_id = trim($_GET["message_ID"];
        $the_request_id = preg_replace("/[^0-9]/", "", $the_request_id);
    }


    Mit

    PHP
    add_filter( 'query_vars', 'fuege_parameter_hinzu' );


    und einer add_rewrite_rule brauchtest Du die auch nicht mehr als GET-Parameter in einem QueryString zu übergeben, sondern als Permalink. Beispiel:

    http://www.coder-welten.com/die-wp-rewrite…nd-umschreiben/

    Einmal editiert, zuletzt von Melewo (15. Juni 2014 um 16:43)

  • Deine Problem-Codezeile ist aber richtig, wenn das Ergebnis nicht wie erwartet, so liegt ein anderer Fehler vor:

  • PHP
    $message_ID = (string) strip_tags(trim($the_request['message_ID']));
                    if (ctype_digit(strval($message_ID)) == TRUE) { // Überprüft, ob der String eine Ziffer enthält.

    grummle ist dein code grausam zu php

    PHP
    if (isset($_GET['message_ID']) && is_numeric($_GET['message_ID'])) {

    hth

    Mit offenen Augen träumen

  • Hallo Melewo und r23,

    r23: Bezüglich des Codes: ich steck ja grad in der Entwicklung. Kannst du mir noch sagen, was grausam ist? Ich habe so eine Ahnung, was du meinst, würde es aber genau wissen wollen.
    Is_numeric akzeptiert auch Kommazahlen (lt. PHP-Doku), was ich als ID niemals übergeben werde. Ich will auf positive Ganzzahlen überprüfen, deshalb auch der Umweg über strval(). :)

    Melewo: Ok, also bei mir ist die Message ID entweder 0,1,2 oder 3 und er liefert mir nur(!) bei dieser Überprüfung trotz Zahl ein False. Ich versteh das nicht, weil bei den anderen ID-Prüfungen, die die ID mit der selben Methode übergeben bekommen funktioniert es.

    Also ich sehe bei euch eher die Tendenz IF-Schleifen zu benutzen. Ist das Switch deshalb eher ungeeignet?

    Danke an euch!
    Gruß
    Sergeij

  • Ich vermute den Fehler ganz ehrlich auch eher bei wp_redirect(). Denn die anderen GET-Variablen (canceluser_ID etc.) werden über Links gesendet, während ich die Message_ID mit wp_redirect() übergebe... :/

    Gruß
    Sergeij


  • Bezüglich des Codes: ich steck ja grad in der Entwicklung. Kannst du mir noch sagen, was grausam ist?

    man nimmt nichts - rein gar nichts - ungeprüft an

    Beispiel
    [COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB]$the_request [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]$_GET[/COLOR][COLOR=#007700];[/COLOR][/COLOR]


    Die OWASP Top 10 ist mittlerweile anerkannter Branchenstandard und eine der bekanntesten Übersichten über Sicherheitsschwachstellen von Webanwendungen


    OWASP Top 10
    http://blogrettung.de/allgemein/owas…uch-in-deutsch/



    Is_numeric akzeptiert auch Kommazahlen (lt. PHP-Doku), was ich als ID niemals übergeben werde. Ich will auf positive Ganzzahlen überprüfen

    Dafür gibt es dann is-int in php...

    http://www.php.net/manual/de/function.is-int.php

    Mit offenen Augen träumen

  • Hallo r23,

    vielen Dank für die Hinweise. Ich werde die Punkte mal ändern.

    Is_int hatte ich auch schon im Visir, war mir nur unsicher, weil es dem Variablentyp prüft, aber nicht ganz genau den Inhalt (was ctype_digit() in Verbindung mit Strval() macht).

    Das $_Request wird dann bald aus meinem Code verschwinden... :)

    Gruß
    Sergeij

  • Leute,

    ich habe meinen Fehler vom Startpost gefunden. Und zwar steckt er hier

    PHP
    if (user_exists_by_id($message_ID) == TRUE)


    Fuck Copy & Paste! :) Ich lasse die Message ID darauf prüfen, ob es einen passenden User dafür gibt. :) Klar, dass das ab und zu ein False ergibt... :)

    Gruß
    Sergeij

Jetzt mitmachen!

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