【问题标题】:How can I check if user enter correct username password and database name?如何检查用户输入的用户名密码和数据库名称是否正确?
【发布时间】:2013-09-13 19:51:37
【问题描述】:

我有以下表格,如果以下任何条目不正确,我想给用户提醒。在哪里可以在代码下方添加我的异常?

我的代码:

 public static void GetTables(Members src)
    {

        OracleConnection conn1 = MyConnectionClass.GetConnection(src.DB, src.ID, src.Password);

        conn1.Open();
        using (OracleCommand command= new OracleCommand("SELECT * FORM DBA_USERS WHERE USER NAME=" + src.ID + " and PASSWORD=" + src.Password + "", conn1))
        {
            using (OracleDataReader reader = command.ExecuteReader())
            {
                int count = 0;
                while (reader.Read())
                {
                    count = count + 1;
                }
            }
        }
  }

【问题讨论】:

  • Little Bobby Tables 将对您的应用程序造成严重破坏。考虑使用参数化查询来防御此类用户。
  • 我当然希望src.Password包含散列密码,而不是纯文本密码。
  • 那么是什么让您无法实现目标?
  • @TimS。这就是这段代码中困扰你的地方吗?真的吗?
  • 要检查数据库名称,您只需连接到它,如果连接打开,您就很好。然后开始测试用户信息。

标签: c# winforms exception-handling oracle11g


【解决方案1】:

我刚刚再次查看了代码,这完全是一场灾难。 所以你告诉我应用程序建立的连接可以访问 DBA_Users 表?这是一面巨大的红旗。

你应该:

  • 创建一个作为您的应用程序架构的架构

  • 在连接字符串中使用该架构的密码和用户名,对其进行加密,用户无法访问

  • 在您的应用程序中有一个表,该表不仅调用“用户”,而且类似于“users1f0tm34m”。

  • 使用该表来验证您的应用程序传入用户。

基本上,您将使用应用程序加密的连接字符串建立连接。这是您检查连接是否正确的地方。如果用户凭据正确,第二次检查将针对您的表。

现在,你需要停止争论:

"SELECT * FROM DBA_USERS WHERE USERNAME=" + src.ID + " and PASSWORD=" + src.Password + ""

除了 SQL 注入之外还有优化。上面的这段代码将导致 oracle 优化器在下次用户登录时为查询创建一个计划。为避免这种情况,您需要通过参数使用绑定变量:

SELECT * FROM DBA_USERS WHERE USERNAME=:uname and PASSWORD=:pwd

这是 Oracle 推荐的方式,而您所做的是 Oracle 不推荐的动态 SQL。

如果你的公司曾经有过审计,那你就完蛋了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多