Seguridad (LINQ to DataSet)
En este tema se tratan temas de seguridad en LINQ to DataSet.
Pasar una consulta a un componente que no sea de confianza
Una consulta de LINQ to DataSet se puede formular en un punto de un programa y ejecutarse en otro diferente. En el momento en que se formula la consulta, ésta puede hacer referencia a cualquier elemento visible en ese momento, como miembros privados de la clase a la que pertenece el método de llamada o símbolos que representan variables o argumentos locales. En tiempo de ejecución, la consulta podrá obtener acceso a los miembros a los que la consulta hizo referencia durante la formulación, incluso si el código de llamada no puede verlos. Al código que ejecuta la consulta no se le ha agregado visibilidad de manera arbitraria por lo que no puede elegir a qué miembro debe obtener acceso. Sólo podrá obtener acceso a lo que la consulta obtenga acceso y sólo a través de la misma consulta.
Esto implica que, al pasar una referencia a una consulta realizada a otra parte del código, el componente que recibe la consulta tiene acceso a todos los miembros públicos y privados a los que hace referencia la consulta. En general, las consultas de LINQ to DataSet no se deben pasar a componentes que no sean de confianza a menos que la consulta se haya construido cuidadosamente para que no muestre la información que debe ser privada.
Entrada externa
A menudo, las aplicaciones obtienen entradas externas (de un usuario o de otro agente externo) y realizan acciones basadas en dicha entrada. En el caso de LINQ to DataSet, es posible que la aplicación construya una consulta de determinada manera en función de la entrada externa o utilice dicha entrada en la consulta. Las consultas de LINQ to DataSet aceptan parámetros siempre que se aceptan literales. Los desarrolladores de aplicaciones deben utilizar consultas parametrizadas en lugar de insertar literales en la consulta procedentes de un agente externo.
Cualquier entrada derivada directa o indirectamente del usuario o de un agente externo puede inyectar contenido que aproveche la sintaxis del lenguaje de destino para realizar acciones no autorizadas. Esto se conoce como ataque de inyección de SQL porque en el patrón de ataque el idioma de destino es Transact-SQL. La entrada de usuario inyectada directamente en la consulta se utiliza para quitar una tabla de base de datos, provocar un ataque de denegación de servicio o cambiar la naturaleza de la operación que se está realizando. Aunque en LINQ to DataSet se admite la composición de consultas, se lleva a cabo a través de la API del modelo de objetos. A diferencia de las consultas de Transact-SQL, las consultas de LINQ to DataSet no se crean mediante la manipulación ni la concatenación de cadenas y no son susceptibles a los ataques de inyección de SQL tradicionales.