De perlsec :
...otherwise the only way to bypass the
tainting mechanism is by referencing subpatterns from a regular
expression match. Perl presumes that if you reference a substring
using $1, $2, etc., that you knew what you were doing when you wrote
the pattern.
Portanto, supondo que você precise obter dados de um script externo e agir, é necessário validar os dados obtidos. Eu vou sair em um membro e sugerir que o seu compareDate.sh
é esperado para retornar o número de dias entre a data indicada e hoje. Semelhante a:
$ /bin/sh ./compareDate.sh "$date_tmp"
42
Então pode ser limpo assim:
my $new = '/bin/sh ./compareDate.sh "$date_tmp"'; # TAINTED
if ($new =~ /^(\d+)$/) {
$new = $1; # Not tainted
} else {
die "Unexpected output from compareDate.sh!\n";
}
O código não simplesmente desvendou a variável (embora isso seja possível por ser excessivamente permissivo com nossas verificações), ela validou que ela tinha o que era esperado. Se alguém tivesse mexido com isso para que ele contivesse:
$ /bin/sh ./compareDate.sh "$date_tmp"
42; /bin/rm -rf *;
Em seguida, a validação falhará. Apenas números podem passar e não esperamos que eles nos causem problemas. Obviamente, saídas mais complexas podem exigir mais validação.
Quando eu escrevi o acima, eu estava olhando para o código principalmente, e há $date_tmp
é atribuída uma string literal do código e deve ser imaculada. Mas, como aponta o jordanm, a mensagem de erro está nos dizendo que a execução do backtick não está acontecendo. Em vez de a saída do shell ser o problema, alguma mancha anterior está impedindo sua execução.
A única variável nos backticks é $date_tmp
, portanto, uma validação semelhante precisa acontecer entre a atribuição e o uso nos backticks.