我正在创建一个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;
}
这是检查编辑安全查询的正确方法,还是有其他更可靠的方法来实现这一目标?
我知道向用户授予权利但由于我没有超级用户帐户而无效。
答案 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;
也许您可以查看允许参数或者根据查询的复杂性构建自己的“查询构建器”(基于数据库中的什么下拉列表?)。
只是一些建议。
但是,如果有任何可能,请遵循关于只读用户的建议。