Was macht FILTER_SANITIZE_STRING?

Lesezeit: 1 Minute

Es gibt ungefähr eine Million Fragen und Antworten, die die Optionen erklären, wie z FILTER_FLAG_STRIP_LOW, aber was tut FILTER_SANITIZE_STRING alleine machen, ohne Optionen? Filtert es nur Tags?

  • Ich würde sagen, es ist ein weiteres PHP-Feature, um einfachen Text mit HTML-Tools zu verarbeiten und Benutzereingaben auf dem Weg zu beschädigen.

    – Alvaro González

    30. April 14 um 15:31 Uhr


  • ein mögliches Duplikat von FILTER_SANITIZE_STRING entfernt das <-Zeichen und jeglichen Text danach

    – mario

    30. April 14 um 15:42 Uhr

Was macht FILTER SANITIZE STRING
rr-

Gemäß PHP-Handbuch:

Tags entfernen, Sonderzeichen optional entfernen oder codieren.

Gemäß W3Schulen:

The FILTER_SANITIZE_STRING Filter entfernt oder kodiert unerwünschte Zeichen.

Dieser Filter entfernt Daten, die für Ihre Anwendung potenziell schädlich sind. Es wird verwendet, um Tags zu entfernen und unerwünschte Zeichen zu entfernen oder zu codieren.

Das sagt uns jetzt nicht viel. Sehen wir uns einige PHP-Quellen an.

ext/filter/filter.c:

static const filter_list_entry filter_list[] = {                                       
    /*...*/
    { "string",          FILTER_SANITIZE_STRING,        php_filter_string          },  
    { "stripped",        FILTER_SANITIZE_STRING,        php_filter_string          },  
    { "encoded",         FILTER_SANITIZE_ENCODED,       php_filter_encoded         },  
    /*...*/

Sehen wir uns jetzt an, wie php_filter_string ist definiert.
ext/filter/sanitizing_filters.c:

/* {{{ php_filter_string */
void php_filter_string(PHP_INPUT_FILTER_PARAM_DECL)
{
    size_t new_len;
    unsigned char enc[256] = {0};

    /* strip high/strip low ( see flags )*/
    php_filter_strip(value, flags);

    if (!(flags & FILTER_FLAG_NO_ENCODE_QUOTES)) {
        enc['''] = enc['"'] = 1;
    }
    if (flags & FILTER_FLAG_ENCODE_AMP) {
        enc['&'] = 1;
    }
    if (flags & FILTER_FLAG_ENCODE_LOW) {
        memset(enc, 1, 32);
    }
    if (flags & FILTER_FLAG_ENCODE_HIGH) {
        memset(enc + 127, 1, sizeof(enc) - 127);
    }

    php_filter_encode_html(value, enc);

    /* strip tags, implicitly also removes  chars */
    new_len = php_strip_tags_ex(Z_STRVAL_P(value), Z_STRLEN_P(value), NULL, NULL, 0, 1);
    Z_STRLEN_P(value) = new_len;

    if (new_len == 0) {
        zval_dtor(value);
        if (flags & FILTER_FLAG_EMPTY_STRING_NULL) {
            ZVAL_NULL(value);
        } else {
            ZVAL_EMPTY_STRING(value);
        }
        return;
    }
}

Ich werde das Kommentieren von Flaggen überspringen, da sie bereits im Internet erklärt werden, wie Sie sagten, und mich auf das konzentrieren, was ist stets stattdessen durchgeführt, was nicht so gut dokumentiert ist.

Zuerst – php_filter_strip. Es macht nicht viel, nimmt nur die Flags, die Sie an die Funktion übergeben, und verarbeitet sie entsprechend. Es macht die gut dokumentierten Sachen.

Dann konstruieren wir eine Art Karte und rufen an php_filter_encode_html. Es ist interessanter: Es konvertiert Sachen wie ", ', & und Zeichen mit ihren ASCII-Codes kleiner als 32 und größer als 127 zu HTML-Entities, also & in deinem String wird &#38;. Auch hier verwendet es Flags.

Dann werden wir angerufen php_strip_tags_ex, das nur HTML-, XML- und PHP-Tags entfernt (gemäß seiner Definition in /ext/standard/string.c) und entfernt NULL-Bytes, wie der Kommentar sagt.

Der folgende Code wird für die interne Stringverwaltung verwendet und führt keine wirkliche Bereinigung durch. Na ja, nicht genau – undokumentierte Flagge passieren FILTER_FLAG_EMPTY_STRING_NULL wird zurückkehren NULL wenn der bereinigte String leer ist, anstatt nur einen leeren String zurückzugeben, aber es ist nicht wirklich nützlich. Ein Beispiel:

var_dump(filter_var("yo", FILTER_SANITIZE_STRING, FILTER_FLAG_EMPTY_STRING_NULL));
var_dump(filter_var("", FILTER_SANITIZE_STRING, FILTER_FLAG_EMPTY_STRING_NULL));
var_dump(filter_var("yo", FILTER_SANITIZE_STRING));
var_dump(filter_var("", FILTER_SANITIZE_STRING));

string(2) "yo"
NULL
string(2) "yo"
string(0) ""

Es ist nicht viel mehr los, also war das Handbuch ziemlich korrekt – um es zusammenzufassen:

  • Immer: HTML-, XML- und PHP-Tags entfernen, NULL-Bytes entfernen.
  • FILTER_FLAG_NO_ENCODE_QUOTES – Dieses Flag kodiert keine Anführungszeichen.
  • FILTER_FLAG_STRIP_LOW – Zeichen mit ASCII-Wert unter 32 entfernen.
  • FILTER_FLAG_STRIP_HIGH – Zeichen mit ASCII-Wert über 127 entfernen.
  • FILTER_FLAG_ENCODE_LOW – Codieren Sie Zeichen mit einem ASCII-Wert unter 32.
  • FILTER_FLAG_ENCODE_HIGH – Codieren Sie Zeichen mit einem ASCII-Wert über 127.
  • FILTER_FLAG_ENCODE_AMP – Codieren Sie das Zeichen & in &#38; (nicht &amp;).
  • FILTER_FLAG_EMPTY_STRING_NULL – Zurückkehren NULL anstelle von leeren Zeichenfolgen.

  • Wie üblich ist die Definition der W3School völlig nutzlos. ohne zu definieren, was “unerwünschte Zeichen” sind, könnte dies ihnen zufolge praktisch alles bewirken.

    – Krake

    8. Juni 15 um 18:21 Uhr

  • Wie noch üblicher ist die offizielle PHP.net-Definition nicht vorhanden

    – Wilhelm Entriken

    6. Mai 20 um 21:09 Uhr

Ich war mir nicht sicher, ob “Tags entfernen” nur das bedeutet < > Zeichen, und wenn es Inhalte zwischen Tags beibehält, z. B. die Zeichenfolge “Hello!” von <b>Hello!</b>, also beschloss ich zu überprüfen. Hier sind die Ergebnisse mit PHP 7.1.5 (und Bash für die Befehlszeile):

curl --data-urlencode 'my-input="
"1. ASCII b/n 32 and 127: ABC abc 012 '
'2. ASCII higher than 127: Çüé '
'3. PHP tag: <?php $i = 0; ?> '
'4. HTML tag: <script type="text/javascript">var i = 0;</script> '
'5. Ampersand: & '
'6. Backtick: ` '
'7. Double quote: " '
'8. Single quote: '"'" 
http://localhost/sanitize.php
    • sanitize.php: <?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING);
    • Ausgang: 1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: &#34; 8. Single quote: &#39;
    • sanitize.php: <?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
    • Ausgang: 1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
    • sanitize.php: <?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
    • Ausgang: 1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: &#34; 8. Single quote: &#39;
    • sanitize.php: <?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_BACKTICK);
    • Ausgang: 1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: 7. Double quote: &#34; 8. Single quote: &#39;
    • sanitize.php: <?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH);
    • Ausgang: 1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: &#195;&#135;&#195;&#188;&#195;&#169; 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: &#34; 8. Single quote: &#39;
    • sanitize.php: <?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_AMP);
    • Ausgang: 1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: &#38; 6. Backtick: ` 7. Double quote: &#34; 8. Single quote: &#39;

Da meine Bash diese Zeichen nicht anzeigt, habe ich für die Flags FILTER_FLAG_STRIP_LOW & FILTER_FLAG_ENCODE_LOW mit dem Glockenzeichen (, ASCII 007) und der Restman Chrome-Erweiterung Folgendes überprüft:

  • ohne eines dieser Flags bleibt der Charakter erhalten
  • mit FILTER_FLAG_STRIP_LOW wird es entfernt
  • mit FILTER_FLAG_ENCODE_LOW wird es kodiert &#7;

  • Was ist mit Backslash?

    – Guido

    27. März 18 um 7:25 Uhr

.

757930cookie-checkWas macht FILTER_SANITIZE_STRING?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy