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?
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 &
. 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&
(nicht&
).FILTER_FLAG_EMPTY_STRING_NULL
– ZurückkehrenNULL
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: " 8. Single quote: '
- sanitize.php:
-
- 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:
-
- 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: " 8. Single quote: '
- sanitize.php:
-
- 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: " 8. Single quote: '
- sanitize.php:
-
- 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: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
- sanitize.php:
-
- 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: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
- sanitize.php:
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

-
Was ist mit Backslash?
– Guido
27. März 18 um 7:25 Uhr
.
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