2012-01-03 6 views
5

hasta donde yo sé una vez que una variable está contaminada, Perl no permitirá usarla en un sistema(), exec(), entubado abierto, eval(), comando de retroceso o cualquier función que afecte algo fuera del programa (tales como desvincular). Entonces, ¿cuál es el proceso para deshacerlo?¿Cómo "desatare" una variable?

+0

La mayor parte del capítulo Seguridad de Mastering Perl pasa por esto, y no es sólo lo que está en perlsec. :) –

Respuesta

12

utilizar una expresión regular en la variable contaminada para sacar los valores "seguros":

A veces hay sólo para aclarar taintedness de sus datos. Los valores pueden no estar contaminados al usarlos como claves en un hash; de lo contrario, la única forma de eludir el mecanismo de contaminación es haciendo referencia a los subpatrones de una coincidencia de expresión regular. Perl supone que si hace referencia a una subcadena usando $ 1, $ 2, etc., sabe lo que estaba haciendo cuando escribió el patrón.

No ignore esta advertencia:

Eso significa utilizar un poco de pensamiento - no nada a ciegas untaint, o que derrotar a todo el mecanismo. Es mejor verificar que la variable solo tenga caracteres buenos (para ciertos valores de "bueno") en lugar de verificar si tiene algún carácter incorrecto. Eso es porque es demasiado fácil perderse a los personajes malos que nunca pensaste.

Perlsec: Laundering and Detecting Tainted Data

+1

+1 para la documentación estándar apropiada. Quiero agregar que el uso de '$ 1' y amigos no es obligatorio, una expresión de coincidencia con capturas devuelve una lista de escalares que no están contaminados, también. Ejemplo: 'perl -T -MDevel :: Peek -e'Dump [$ ARGV [0] = ~/(\ d +)/g] '' Fiorina" Fury "161 Unidad correccional de trabajo de clase C (reg. 12037154) en un punto mantuvo a miles de presos de máximo riesgo de cromosoma doble Y, pero en 2179 apoyaron a veintidós presos y tres custodios ". – daxim

6

use Untaint:

DESCRIPCIÓN

Este módulo se utiliza para el blanqueo de datos que se ha contaminado utilizando el interruptor -T estar en modo de mancha. Esto se puede utilizar para los scripts CGI , así como los scripts de línea de comandos. El módulo anulará escalas, matrices y hash. Al lavar una matriz, solo se blanquearán los elementos de la matriz que estén contaminados.

SINOPSIS

use Untaint; 

my $pattern = qr(^k\w+); 

my $foo = $ARGV[0]; 

# Untaint a scalar 
if (is_tainted($foo)) { 
     print "\$foo is tainted. Attempting to launder\n"; 
     $foo = untaint($pattern, $foo); 
}else{ 
     print "\$foo is not tainted!!\n"; 
} 
Cuestiones relacionadas