2009-10-09 17 views
5

¿Es posible imponer permisos de solo lectura utilizando el código System.Data.SqlClient que accede a una base de datos del servidor Sql?¿Es posible aplicar el comportamiento de solo lectura con SqlCommand?

Quiero permitir que los usuarios de confianza escriban sus propias instrucciones SELECT, en un sitio web.

NO Im no trolling aquí! Las soluciones obvias son crear un usuario de solo lectura en la base de datos y usar esas credenciales en la cadena de conexión, y seguramente solo un idiota acepta una declaración de SQL en una página web. Este es un problema de implementación del usuario, no confío en que alguien más lo configure correctamente y no quiero escribir código para verificar que la cadena de conexión de solo lectura sea de solo lectura.

Una solución sería analizar el SQL y verificar que sea un comando de solo lectura, o hacer algo similar. Lo que quiero hacer es hacer algo como;

SqlConnection conn = new SqlConnection(myConnectionString, Flags.Readonly) 

actualización dado una cadena de conexión con privilegios SA, "crear bla usuario con password = xxx" "usar mi-db" "crear inicio de sesión, bla" "concesión seleccionar en mitabla a bla". Luego crea una nueva cadena de conexión.

Respuesta

2

No, no hay una función incorporada para garantizar que las acciones del usuario final no tengan efectos secundarios. Si bien puede ser simple en su escenario, una implementación de propósito general de esto sería increíblemente compleja, si no imposible. ¿Qué pasa si la declaración seleccionada utiliza una UDF que tiene efectos secundarios?

+0

gracias por responder la pregunta –

+1

EXEC ('DR' + 'OP' + 'Tab' + 'LE' + 'Us' + 'ers') –

2

Puede usar una transacción y siempre retroceder? (pero asegúrese de que el sql ejecutado no confirma)

5

Cree un nuevo inicio de sesión en SQL Server y solo dé a ese inicio de sesión los permisos que desea en las tablas. Luego, en la cadena de conexión, la aplicación debe usar ese inicio de sesión. Mencionas esto como una solución obvia en tu publicación, pero no veo por qué no quieres hacerlo de esta manera.

+1

yup, esa es la manera más fácil de hacerlo: manejar los permisos en la base de datos, entonces no importa cómo este usuario acceda a los datos, nunca puede dañar nada –

+0

gracias, es lo que haré, pero quería saber si fue posible una solución de solo código –

1

crear otra base de datos, posiblemente restaurar la copia de seguridad nocturna, por lo que es un día de antigüedad. solo permite a los usuarios acceder a esta base de datos. Entonces los usuarios no pueden ralentizar la producción con sus horribles consultas o realmente pueden perjudicar cualquier cosa si su seguridad falla y se realiza un cambio.

Cuestiones relacionadas