validacion filtros filter_var filter_sanitize_url filter_sanitize_special_chars filter_sanitize_number_float filter_sanitize_email filter_flag_no_encode_quotes php sanitization

filter_var - filtros de validacion php



¿Qué hace FILTER_SANITIZE_STRING? (2)

Hay como un millón de preguntas y respuestas que explican las opciones como FILTER_FLAG_STRIP_LOW , pero ¿qué hace FILTER_SANITIZE_STRING por sí solo, sin ninguna opción? ¿Simplemente filtra las etiquetas?


De acuerdo con el Manual de PHP :

Etiquetas de tira, opcionalmente tira o codifica caracteres especiales.

De acuerdo con W3Schools :

The FILTER_SANITIZE_STRING filtro The FILTER_SANITIZE_STRING o codifica los caracteres no deseados.

Este filtro elimina datos que son potencialmente dañinos para su aplicación. Se usa para quitar etiquetas y eliminar o codificar caracteres no deseados.

Ahora, eso no nos dice mucho. Veamos algunas fuentes de PHP.

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 }, /*...*/

Ahora, vamos a ver cómo se define php_filter_string .
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 /0 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; } }

Me saltearé los indicadores de comentarios ya que ya están explicados en Internet, como dijiste, y te centrarás en lo que siempre se realiza en su lugar, que no está tan bien documentado.

Primero - php_filter_strip . No hace mucho, simplemente toma las banderas que pasa a la función y las procesa en consecuencia. Hace las cosas bien documentadas.

Luego construimos algún tipo de mapa y llamamos php_filter_encode_html . Es más interesante: convierte cosas como " , '' y "caracteres" con sus códigos ASCII inferiores a 32 y superiores a 127 en entidades HTML, por lo que & en su cadena se convierte en & Una vez más, usa indicadores para esto.

Luego recibimos una llamada a php_strip_tags_ex , que simplemente elimina las etiquetas HTML, XML y PHP (de acuerdo con su definición en /ext/standard/string.c ) y elimina los bytes NULL, como dice el comentario.

El código que lo sigue se usa para la administración interna de cadenas y realmente no hace ninguna desinfección. Bueno, no exactamente: pasar la bandera no documentada FILTER_FLAG_EMPTY_STRING_NULL devolverá NULL si la cadena desinfectada está vacía, en lugar de devolver solo una cadena vacía, pero en realidad no es tan útil. Un ejemplo:

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

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

No hay mucho más en marcha, por lo que el manual era bastante correcto, para resumir:

  • Siempre: elimine las etiquetas HTML, XML y PHP, elimine los bytes NULL.
  • FILTER_FLAG_NO_ENCODE_QUOTES - Este indicador no codifica las comillas.
  • FILTER_FLAG_STRIP_LOW - FILTER_FLAG_STRIP_LOW caracteres con valor ASCII por debajo de 32.
  • FILTER_FLAG_STRIP_HIGH : FILTER_FLAG_STRIP_HIGH caracteres con valor ASCII superior a 127.
  • FILTER_FLAG_ENCODE_LOW - Codifica caracteres con valor ASCII por debajo de 32.
  • FILTER_FLAG_ENCODE_HIGH - Codifica caracteres con valor ASCII superior a 127.
  • FILTER_FLAG_ENCODE_AMP - Codifica el & carácter a & (no & )
  • FILTER_FLAG_EMPTY_STRING_NULL - Devuelve NULL lugar de cadenas vacías.

No estaba seguro de si "pelar etiquetas" significa solo los < > caracteres, y si conserva el contenido entre las etiquetas, por ejemplo, la cadena "¡Hola!" de <b>Hello!</b> , así que decidí consultar. Aquí están los resultados, usando PHP 7.1.5 (y Bash para la línea de comando):

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);
    • salida: 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; 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);
    • salida: 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: '' 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);
    • salida: 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; 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);
    • salida: 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; 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);
    • salida: 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; 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);
    • salida: 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; 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;

Además, para las banderas FILTER_FLAG_STRIP_LOW y FILTER_FLAG_ENCODE_LOW, dado que mi Bash no muestra estos caracteres, he marcado utilizando el carácter de campana (, ASCII 007) y la extensión de Chrome de Restman que:

  • sin ninguno de estos indicadores, el personaje se conserva
  • con FILTER_FLAG_STRIP_LOW, se elimina
  • con FILTER_FLAG_ENCODE_LOW, está codificado para &#7;