Se podía array_map
strip_tags
a $_POST
, pero es mucho más agradable para escribir una función personalizada para obtener datos de él:
function post_data($name) {
global $post_cache;
if (in_array($name, $post_cache)) {
return $post_cache[$name];
}
$val = $_POST[$name];
if (is_string($val)) {
$val = strip_tags($val);
} else if (is_array($val)) {
$val = array_map('strip_tags', $val);
}
$post_cache[$name] = $val;
return $val;
}
Esto hará que su código sea más legible (otros que buscan en ella generalmente asumir que $_POST['foo']
son los datos en el campo de formulario foo
, no algo que ya haya preprocesado), no le causará problemas con complementos o bibliotecas que intenten acceder $ _POST directamente, facilita agregar más lógica al preprocesamiento $_POST
(unescape cuando magic quotes están habilitados es uno común) sin buscar todo el lugar s en su código donde ha utilizado datos POST, y lo salva de grandes dolores de cabeza cuando se da cuenta de que hay algunos campos POST donde necesita etiquetas HTML. En general, es una mala idea cambiar directamente cualquiera de los superglobales.
Además, es mejor desinfectar los datos en la salida, no en la entrada. Diferentes usos requerirán diferentes métodos, por ejemplo, si se utiliza
<div class="user_photo">
<img src="<?php echo photo_path($user_id) ?>" alt="<?php echo $user_name ?>" />
</div>
continuación $user_name
es un vector de ataque XSS, y strip_tags
no ayuda en contra de ella en absoluto; necesitarías htmlspecialchars. Si los datos del usuario se utilizan como una URL, necesitaría otro método para defenderse contra las URL de javascript:
y así sucesivamente.
Impresionante.Esto es exactamente lo que estaba buscando. –
Esto no protegerá de XSS cuando hay campos de formulario con nombres como 'foo [bar]' o 'foo []' que PHP convierte automáticamente a matrices. – Tgr
@Tgr: Sí, esto no funcionará como usted dijo, pero creo que tuvo la idea de personalizar de acuerdo con lo que necesita – w00d