如何限制用户只能通过应用程序文本框字段选择查询?

Nev*_*ing 3 security sql-server sql-injection

假设我有一个 Web 应用程序,它允许用户输入 SQL 查询(SQL Server 2008+)。我希望用户能够运行任何 SELECT 查询并读取数据库中的任何内容,但我不希望他们能够插入/更新/删除/截断/执行等(简而言之:仅选择)。请注意,整个数据库中没有数据甚至数据库元数据被视为机密。

目前的规则:

  1. 不 ”;” 特点。如果它在那里,它必须正好是 1 并且位于修剪后的查询字符串的末尾。
  2. 查询必须以 select 开头(忽略大小写,空格是正则表达式的一部分)。
  3. 所有换行符都从查询中删除。

这够了吗?除了选择之外,还有什么办法可以做吗?

编辑:谢谢 Thomas Stringer 关于 SELECT ... INSERT 的说明。这正是我所追求的信息。我将从查询字符串中删除所有换行符,这应该有助于解决这个问题。有没有其他方法可以解决这个问题并能够修改数据?

注意:CTE 与这种情况无关。让我们假设查询必须以 SELECT 开头。

db2*_*db2 6

确保应用程序使用仅被授予读取权限的登录名连接到服务器(在数据库中为其授予 db_datareader 角色以允许读取所有表),并且您应该处于良好状态。防止更改数据的最简单方法是确保用户无权更改任何内容。

授予执行权限时要小心,因为您可能会无意中允许用户根据过程所做的更改数据。