登录 - 将用户输入与数据库进行比较

Posted

技术标签:

【中文标题】登录 - 将用户输入与数据库进行比较【英文标题】:Login - Comparing user input with database 【发布时间】:2011-12-15 19:05:15 【问题描述】:

我已经在谷歌上搜索了一段时间,但我仍然找不到我的问题的答案.. 即:我想知道是否有一种方法或方法可以获取数据库的值然后进行比较...我不太确定如何解释它..所以我想我会告诉你我得到了什么我的代码很远。顺便说一句,我使用 netbean 制作这个程序,我使用 odbc 数据库(mircosoft 访问)。我也在代码中使用了 try catch,但我不知道如何让它显示出来..

下面的程序并没有真正按照我想要的方式工作..因为我在比较时遇到了问题。 提前致谢。

if(request.getParameter("username")!=null && request.getParameter("username") !=""
        && request.getParameter("password")!=null && request.getParameter("password")!="") 

    String user = request.getParameter("username").toString();
    String pass = request.getParameter("password").toString();

    String check = "SELECT AccountType FROM Testing WHERE Username='"+user+"' AND Password ='"+pass+"'";
    rs = stmt.executeQuery(check); 
    String info = rs.getString(check); // trying to get the AccountType and store it into a string

    while(rs.next())
        if(info != null && info !="")  //checks to see if the account exist in the database                
            if(info.equals("Admin")) //checks to see if AccountType is "Admin"
                    response.sendRedirect("AdminConsole.jsp"); 
            else
                response.sendRedirect("UserConsole.jsp");
        else
            response.sendRedirect("ErrorPage2.jsp");
    
else
    response.sendRedirect("ErrorPage.jsp");

connection.close();

【问题讨论】:

你有一个 SQL 注入漏洞。 您永远不应该以纯文本形式存储密码。 解决上述问题; - 使用参数化查询来防止 SQL 注入 - 存储要比较的密码的哈希值(例如 MD5)。不试图否定,这段代码是非常危险的。 【参考方案1】:

请,请不要这样做。您不应在代码中执行 SQL,也不应以纯文本形式存储密码。您应该做的是调用一个参数化过程,该过程将用户名/密码作为参数,然后返回角色(或您想要的任何其他内容)。密码仍应至少进行哈希处理。

类似这样的:http://www.daniweb.com/software-development/csharp/threads/87556

在 MS Access 中,存储过程称为存储查询: http://msdn.microsoft.com/en-us/library/aa140021(v=office.10).aspx

相关部分:

过程:


create procedure ValidateUserLogin
  @UserName varchar(30)
  , @Password varchar(30)
as
begin
  if exists (select * from UsersTable as ut
    where ut.UserName = @UserName AND ut.Password = @Password)
    select 1;
  else
    select 0;
end


private bool IsValidatedUser( string username, string password ) 
  try 
    bool rv = false;

    using ( SqlConnection con = new SqlConnection( connectionString ) ) 
      using ( SqlCommand cmd = new SqlCommand() ) 
        con.Open();

        cmd.Connection = con;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "ValidateUserLogin";

        cmd.Parameters.Add( "@UserName", SqlDbType.VarChar, 30 ).Value = username;
        cmd.Parameters.Add( "@Password", SqlDbType.VarChar, 30 ).Value = password;

        rv = Convert.ToBoolean( cmd.ExecuteScalar() );

        con.Close();
      
    

    return rv;
   
catch ( Exception ex ) 
    // Log errors
    throw;
  

【讨论】:

哦,好吧,我试试这些方法。我对这些东西还是新手,所以只能反复试验。感谢所有回复。

以上是关于登录 - 将用户输入与数据库进行比较的主要内容,如果未能解决你的问题,请参考以下文章

比较用户登录输入的数组中的用户注册信息

如何将来自用户的输入图像与 C# 中数据库中存储的图像进行比较 [关闭]

UML类图-------实例

PHP用户注册与登录

将用户输入编辑文本与SQLite数据库Android Java进行比较

UML类图实例分析