【发布时间】:2011-05-07 08:36:10
【问题描述】:
有没有一种很好的方法来解析 SQL 语句以确保它只包含一个 SELECT 语句而没有其他内容?我正在使用 C#、System.Data.SqlConnection 和 MS SQL Server
【问题讨论】:
标签: c# sql-server sqlconnection query-parser
有没有一种很好的方法来解析 SQL 语句以确保它只包含一个 SELECT 语句而没有其他内容?我正在使用 C#、System.Data.SqlConnection 和 MS SQL Server
【问题讨论】:
标签: c# sql-server sqlconnection query-parser
我认为解析 sql 将是解决方案: from another question
【讨论】:
我猜你可以想出一个正则表达式,但它可能不是 100% 安全的。
最好的方法是:
1. 要么编写存储过程和视图,并且限制用户的权限只能使用它们。 (以及某些表上的 SELECT 语句)
2. 构建数据抽象层。您构建查询,而不是其他人。让其他人只访问您公开的一些方法。
3. 使用 LINQ to SQL,但隐藏 DataContext 对象,因此不能对数据库进行任何更改。
【讨论】:
您应该以除SELECT 之外无权执行任何操作的用户身份连接到数据库。
这样,任何非SELECT的语句都将无法执行。
这是最安全的解决方案,没有复制 SQL Server 的解析器。
【讨论】:
检查以确保语句以 SELECT 关键字开头,然后确保该语句不包含不是文字字符串一部分的分号(这将开始另一个 SQL 语句)。
【讨论】:
select 1 select 1,并将其作为两个单独的命令执行
由于 SELECT 语句需要位于语句的最开头,因此您只需检查字符串以查看前 6 个字符是否为 SELECT:
if (stringSql.Substring(0, 6).ToUpper() == "SELECT")
{
//execute statement
}
【讨论】: