将 SqlException.Message 打印到控制台的安全性

Security of printing SqlException.Message to console

虽然我一直在调试我的代码,但我一直在将输出写入控制台,以便我可以监视错误和 sql 输出。当然,为了防止 sql 注入,我在需要的地方对查询进行了参数化。在网上阅读了一些关于一些注入攻击程序的工作方法的文章后,我现在怀疑下面的做法是否是一个好主意。

考虑以下方法。

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); 那肯定会很糟糕,因为它在你的脸上。

您正在部署连接到 SQL 服务器的 WinForms 应用程序,其凭据显然允许应用程序写入该 SQL 服务器。

将 SQL 错误泄漏到控制台是您最不担心的事情。

恶意用户可以简单地使用您的应用程序使用的凭据在该服务器上执行任意 SQL。

您在客户端机器上部署的任何东西都必须被认为是不安全的。泄漏查询不是问题(用户可以反编译您的应用程序或检查其资源并检查 SQL 字符串),问题是客户端具有直接数据库连接。

如果你想阻止客户端知道数据库在哪里,它的凭据是什么以及你的应用程序执行了什么查询,你必须从你的应用程序中删除所有这些代码,让数据库的东西发生在不同的机器上共。例如,您可以通过网络服务与这台机器对话。

然后 Web 服务处理身份验证,并拒绝为未通过身份验证的用户执行任何操作。