当我调试代码时,我一直将输出写入控制台,以便我可以监视错误和 sql 输出。当然,为了防止 SQL 注入(inject),我在需要时对查询进行了参数化。在网上阅读了一些有关某些注入(inject)攻击程序工作方法的文章后,我现在质疑以下做法是否是一个好主意。
考虑以下方法。
public void MyQuery(int item_id)
{
string sql = "SELECT * FROM table WHERE item_id = @id";
SqlCommand sqlQuery = new SqlCommand(sql,conn);
sqlQuery.Parameters.Add("@id", SqlDbType.Int).Value = item_id;
try
{
conn.Open();
sqlQuery.ExecuteNonQuery();
conn.Close();
}
catch (SqlException ex)
{
Console.WriteLine(sql);
Console.WriteLine(ex.Message);
}
}
在我的开发机器上,控制台输出很好 - 这里没有风险。但是,如果我在应用程序上线时将代码保留为现在的样子,是否可能会开辟其他利用途径?
我知道如果我这样做 MessageBox.Show(ex.Message);
那肯定会很糟糕,因为它就在你面前。
最佳答案
您正在部署一个 WinForms 应用程序,该应用程序使用显然允许应用程序写入该 SQL Server 的凭据连接到 SQL Server。
将 SQL 错误泄漏到控制台是您最不用担心的。
恶意用户可以简单地使用您的应用程序使用的凭据在该服务器上执行任意 SQL。
您在客户端计算机上部署的任何内容都必须被视为不安全。泄漏查询不是问题(用户可以反编译您的应用程序或检查其资源并检查 SQL 字符串),问题在于客户端具有直接数据库连接。
如果您想阻止客户端知道数据库在哪里、其凭据是什么以及应用程序执行什么查询,则必须从应用程序中删除所有这些代码,并让数据库内容完全发生在不同的计算机上。例如,您可以通过网络服务与这台机器对话。
然后 Web 服务处理身份验证,并拒绝对未经身份验证的用户执行任何操作。
关于c# - 将 SqlException.Message 打印到控制台的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36766703/