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
filtroThe 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
- DevuelveNULL
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: " 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:
- 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:
- 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: " 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:
- 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: " 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:
- 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: Çüé 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:
- 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: & 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:
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