danimera escribiste:4. What general practices do you follow to insure site security and what specifically for Perl/MYSQL/PostgreSQL? How do you handle client state?
¡Escape! ¡Use placeholders! ¡Use -T (tainting)! ¡Siempre comprueba que los datos contienen solo lo que es seguro, nunca trates de buscar algo que inseguro!
Es muy habitual que programadores incluyen variables en HTML, SQL, URLs y otras lugares similares sin escapar los símbolos que son especiales en ese contexto. O peor, sólo escapan uno o dos de esos símbolos.
Creo que todos ustedes han visto cosas así:
Using perl Syntax Highlighting
print "<p>Blah blah blah $nombre blah blah.</p>";
# que pasa si $nombre contiene < por ejemplo?
print qq{<input type
="text" name
="blah" value
="$blah">\n};
# que pasa si $blah contiene " ?
print qq{<img src
="script.cgi?algo=$algo&otro=$otro">};
# que pasa si $algo o $otro contiene & por ejemplo?
my $sql = "SELECT * FROM Table WHERE Nombre = '$nombre'";
# Que por demonios pasa si
# $nombre = "hola'; delete from Table; select 'adios"; ???
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Siempre tienes que escapar o comprobar que no necesitas escapar (por ejemplo si sabes con seguridad que
$var es un número, no tienes por qué escaparlo).
Y cuando conectas a la base de datos siempre use los
placeholders:
Using perl Syntax Highlighting
my $sth = $dbh->prepare("SELECT * FROM Table WHERE Nombre = ?");
...
$sth->execute( $nombre);Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
es más seguro y más rápido, especialmente si buscas más nombres.
El parámetro -T en Perl te ayuda a saber qué datos son fijos en el script (y son seguros) y quienes vienen del cliente y son inseguros. Y ayuda a forzarte a comprobar los datos. Seguro si haces algo así, podría ser seguro:
Using perl Syntax Highlighting
$inseguro =~ /^(.*)$/;
my $seguro = $1;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Sí, es verdad que ahora
$seguro no está
tainted, pero no has comprobado nada, los datos pueden ser inseguros. Debes ser más específico.
Por
client state puedes usar los cookies, reglones (
frames) ocultos en
forms, parámetros en el
query de un URL, uno de los módulos
session, ...
danimera escribiste:21.We have had issue with spam being sent through contact forms using the Perl sendmail method by users including mail header in the fields. What solution would you propose?
No trates de enviar los correos usando el ejecutable
sendmail. Usa uno de los montones de módulos de CPAN para enviar correos. Y comprueba que los datos que recibes de los
forms son los que de verdad quieres aceptar.
danimera escribiste:29. You are a programmer for MySpace.com. Tom wants a new feature - people should be able to preview changes to their profiles before making them permanent. This includes the layout, the text, friends, top friends, photos, etc. The user can go into "preview mode" and review different configurations before making one live. What Design Pattern would you use? What is a potential problem with this feature?
Design Patterns es un término de márquetin. La mayoría de los famosos
design patterns deberían formar parte del lenguaje de programación o algún módulo, pero algunas lenguajes lo impiden, así que tienes que reescribir casi el mismo código cada vez. En este caso no es posible decir casi nada sobre la implementación de este modo
preview antes de conocer su código actual. La implementación podría ser fácil si los scripts leen los opciones por un módulo u objeto que puede ser modificado para trabajar en un modo
preview y leer los datos de un lugar diferente de lo normal, pero también puede forzarte a cambiar muchísimo el código.