La mejor forma de evitar este tipo de ataques es programar bien la prueba de entrada de datos.
De hecho, la primera regla de lectura de datos desde el exterior del programa es no confiar nunca en los datos que llegan desde el usuario.
Con Perl, se puede usar el par prepare/execute:
my $sth = $dbh->prepare('SELECT * FROM usuarios WHERE nombre=? AND clave=?');
$sth->execute($nombre, $clave);
Además, si el nombre y/o clave cumplen alguna regla de escritura, podemos poner un filtrado previo a $nombre y $clave, y así reducir aún más la posibilidad de ataque. Por ejemplo: las claves no deben contener espacios en blanco.