检查只读查询字符串

时间:2012-01-09 10:33:23

标签: c# sql postgresql

我正在创建一个postgreSQL数据库阅读器,它还包括一个用户键入自己的查询的方法。我想通过检查键入的查询是否包含任何修改代码来保护数据库。这是我的检查:

    private bool chech_unwanted_text(string query)
    {
        if (query.Contains("DELETE") || query.Contains("delete") || query.Contains("CREATE") || 
          query.Contains("create") || query.Contains("COPY") || query.Contains("copy") || 
          query.Contains("INSERT") || query.Contains("insert") || query.Contains("DROP") || 
          query.Contains("drop") || query.Contains("UPDATE") || query.Contains("update") || 
          query.Contains("ALTER") || query.Contains("alter"))
        {
            return false;
        }
        else return true;
    }

这是检查编辑安全查询的正确方法,还是有其他更可靠的方法来实现这一目标?

我知道向用户授予权利但由于我没有超级用户帐户而无效。

5 个答案:

答案 0 :(得分:9)

您应该使用只对数据库具有读访问权限的帐户来处理此问题,而不是通过检查查询。大多数DBMS都有一种特权机制来处理这种事情,而PostgreSQL肯定会这样做。

答案 1 :(得分:1)

授予用户输入自己的查询绝不是一个好主意。唯一安全的方法是授予他们只读权利(你说你无法做到)。

关于您的代码段,检查查询是否包含动词的更好方法是使用LINQ:

private readonly string[] verbs = new string[]
   { "delete", "create", "insert", ... };

private bool check_unwanted_text(string query)
{
    // convert to lowercase
    query = query.ToLowerInvariant();

    // can any verb be found in query?
    return verbs.Any(v => query.Contains(v));
}

但不,我不会考虑将其用于SQL清理。

答案 2 :(得分:1)

没有可靠,通用的方法来检查给定查询是否正在更改数据库内容,仅基于查询文本。

考虑这个问题:

SELECT * FROM myview;

myview的定义如下:

CREATE VIEW myview AS select foo, bar FROM myfunc();

答案 3 :(得分:1)

如果您无法将帐户设置为只读,则仍可以通过在事务开始后立即发出SET TRANSACTION READ ONLY SQL命令将特定事务设置为只读。 然后,任何修改此事务中的数据的尝试都将失败并带有

  

错误:交易是只读的

答案 4 :(得分:0)

看一下这个比较简短的比较: Case insensitive 'Contains(string)'

基本上使比较案例不敏感(否则你需要大量的代码来检查不同版本的DeLetE(DELEte等)。

此外,您可以使用禁用的关键字构建一个列表并循环显示,也许更清洁一点?

如果用户需要使用这些关键字查询内容,会发生什么?

SELECT IsDeleted FROM Users;

也许您可以查看允许参数或者根据查询的复杂性构建自己的“查询构建器”(基于数据库中的什么下拉列表?)。

只是一些建议。

但是,如果有任何可能,请遵循关于只读用户的建议。