Muchos scripts CGI invocan a otros programas, ya sean creados por el usuario o del sistema, lo que supone el principal agujero de seguridad en CGI.
El problema básico es que por ejemplo un script CGI llame a grep con una expresión regular de cualquiera de las maneras siguientes (en Perl o C):
system("grep $exp database"); sprintf(comando,"grep %s database",exp);system(comando);
tiene varios problemas, sobre todo si consideramos que exp puede valer ``root /etc/passwd; rm'', con lo que lee el fichero de passwords y además inutiliza el sistema.
La solución puede ser colocar comillas de la siguiente manera:
system("grep \"$exp\" database"); sprintf(comando,"grep \"%s\" database",exp);system(comando);
pero surge el problema que de las comillas se emparejen con otras dentro de exp con lo que se anule su efecto.