¿Por qué la gente piensa que Perl es propenso a errores de seguridad?

El lema de Perl es “Hay más de una forma de hacerlo”. Desafortunadamente, ese poder y flexibilidad necesita un subtítulo: “pero solo algunas formas CORRECTAS”. Como ejemplo, cuando necesita insertar un valor en una base de datos, puede escribir algo como

my $ instrucción = ‘insertar en valores de my_table (col1, col2) (?,?)’;
my $ sth = $ dbh-> prepare ($ extracto, $ val1, $ val2);
$ sth-> execute ();

Pero eso es feo, y toma tres declaraciones para hacer una tarea relativamente simple. Perl también te permite escribir algo como

$ dbh-> execute (“insertar en los valores de my_table (col1, col2) ($ val1, $ val2)”);

Parece que hace lo mismo, solo se necesita una declaración para ejecutarse, y se va a la siguiente parte de lo que sea que esté trabajando, ¿verdad?

Incorrecto.

Por casi cualquier valor que le arrojes, ambas piezas de código harán exactamente lo mismo. El segundo incluso puede ser un poco más eficiente en algunas circunstancias, y definitivamente es más rápido escribir. Desafortunadamente, el segundo tiene un defecto no inmediatamente obvio cuando se le pasan ciertos valores. Por ejemplo, si

$ var2 = ‘); truncar tabla my_table; ‘;

y ejecuta la primera pieza, obtendrá un error o col2 contendrá el valor que ingresó en $ var2 (dependiendo del tipo de datos de col2). Si ejecuta el segundo código, acaba de perder todo en esa tabla en la base de datos. Espero que tengas buenas copias de seguridad! Ese problema particular se llama “ataque de inyección SQL”, y es uno de los ataques más comunes utilizados para eliminar sitios web. El primer método, utilizando declaraciones preparadas, desinfecta su entrada para que sus datos permanezcan seguros. El segundo método es más fácil de recordar y más rápido de escribir, pero no proporciona absolutamente ninguna protección contra entradas maliciosas.

EDITAR: Esta respuesta me hace sonar como un enemigo de Perl. No soy; Uso Perl casi todos los días, tanto profesionalmente como en mis proyectos personales. Puede ser uno de los idiomas más potentes disponibles y tiene una biblioteca de código preexistente masiva (busque casi cualquier problema que desee resolver o cualquier servicio con el que desee interactuar, en CPAN y estoy seguro de que ‘ daré una respuesta). Si conoce las posibles dificultades, el código escrito en Perl puede ser tan seguro como en cualquier otro idioma, pero debe vigilar dónde pisa.

Porque puedes escribirlo como quieras. El lenguaje en sí no es el problema, es el scripter.

No creo que sea verdad. Existe una percepción bastante común de que Perl es un lenguaje de solo escritura y los programas no pueden escribirse muy claramente y, por lo tanto, son difíciles de mantener. Siempre que sea cierto es discutible, pero de todos modos los críticos de Perl a menudo lo dicen. Pero no he escuchado a la gente decir que Perl es propenso a errores de seguridad. O al menos no tan a menudo. Históricamente, la comunidad de Perl se tomaba muy en serio las preguntas de seguridad y, por lo tanto, Perl tiene muy pronto una serie de características importantes de programación segura, como el modo corrupto o los marcadores de posición en DBI (API de base de datos de Perl).

Entre los lenguajes de script hay un lenguaje que tiene una mala reputación con respecto a los problemas de seguridad: PHP. Solía ​​contener algunas características muy inseguras como Register Globals que causó numerosos errores de seguridad en el pasado. Creo que ha mejorado mucho en los últimos años, pero aún si hay un lenguaje de programación con mala reputación relacionada con problemas de seguridad, definitivamente es PHP.