É possível explorar o parâmetro bash script?

9

Desejo passar um endereço de email de um formulário da web para um script bash. Estou usando o seguinte regex:

/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/

Isso é suficiente? Ou alguém poderia incorporar uma exploração?

O script é chamado do PHP:

system('/usr/local/bin/script.sh "$email"');
chris
fonte
4
Bem feito, mesmo para perguntar. Não vejo potencial de exploração, mas você pode rejeitar alguns endereços de email válidos e aceitar outros inválidos. Ah - e você deve ancorar seu regex .
Curinga
1
@Wildcard De fato, a falta de ancoragem torna o regexp inútil como teste de segurança!
Gilles 'SO- stop be evil'
Este poderia ser um endereço de email válido "the doctor"@gallifrey.com. Observe o espaço entre aspas no componente de nome de usuário.
roaima 21/05
em que ponto você está preocupado com uma exploração? A linha de assunto diz 'bash', assim como a preocupação com a expansão ao passar $ email como um argumento (entre aspas) para script.sh, ou como o script.sh manipula o valor passado ou a severidade do (presumivelmente baseado em PHP ) regex ou ???
Jeff Schaller
Não está claro como o regexp é usado dentro do seu script. Para uma boa análise, forneça as partes relevantes do seu script.
Jofel

Respostas:

1

Você pode limpar e validar o endereço de email em PHP, que será mais rápido e seguro do que chamar um shell script. Chamar um script de shell com dados não autorizados de um serviço da Web adicionará mais uma coisa que pode ser interrompida.

$sanitized_email = filter_var($email, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_email, FILTER_VALIDATE_EMAIL)) {
    echo "This sanitized email address is considered valid.\n";
    echo "Before: $email\n";
    echo "After:  $sanitized_email\n";    
} else {
    echo "This sanitized email address is considered invalid.\n";
}

Exemplo acima adaptado de exemplos no site PHP.net .

Kusalananda
fonte