为了节省时间,我编写了一个SQL模块,它允许我以简写的方式编写内容,而不是每次我想在模块内运行查询时都必须初始化SqlCommand
对象。
我出于安全原因尝试将此模块移至WCF服务(阻止Winforms应用程序直接访问数据库)。
以下函数用于查询数据库并返回DataTable
结果
public DataTable FillTable(string sql)
{
query = new SqlCommand();
query.Connection = conn;
query.CommandText = sql;
DataTable dt = new DataTable();
try
{
conn.Open();
dt.Load(query.ExecuteReader());
conn.Close();
}
catch (Exception ex)
{
conn.Close();
Console.Write("fillTable: " + ex.Message);
}
return dt;
}
鉴于这只是一个字符串作为输入,我可以假设它对潜在的注入攻击是开放的 - 尽管它不是直接在数据库上运行的吗?如果潜在攻击者只知道服务的位置(基于应用程序中的服务引用),是否可以轻松替换提交的字符串并提取未经授权的数据?
我正在使用的数据库很小,但我想确保我正确地执行安全操作。
当然,我知道我可以为每个实例编写一个单独的函数,但到目前为止,仅在该函数中有近100个用途,这不仅是一件痛苦的事情,而且将来的维护也是如此。真是个头疼的问题
答案 0 :(得分:2)
是,代码可以轻松注入。更安全的方法是使用Some ORM来实现此目的。例如实体框架或 Hibernate ,它们将帮助您处理SQL注入等问题。
OR
正如@Fil所说,你可以通过将它包装在一些可以向用户公开的外部方法中来隐藏实现。
答案 1 :(得分:1)
服务器应该是唯一使用此方法FillTable的服务器。它对客户来说无法到达。
客户端应该只知道,例如,getBooks()和服务器调用FillTable("选择*来自书籍")。