【问题标题】:How can I make a "username and password" type search on a SQL server?如何在 SQL 服务器上进行“用户名和密码”类型的搜索?
【发布时间】:2018-02-09 20:35:32
【问题描述】:

我正在尝试搜索托管在免费 SQL 托管站点 (www.000webhost.com) 上的表(以编程方式,在 C# 中)以在表中搜索用户名并将其与存储在用户名旁边的“密码”字符串进行比较.因为我以前从未处理过 C# SQL 连接,所以我不知道如何做到这一点。

{ SqlConnection myConnection = new SqlConnection("user id=XXXXXXXXXXXXXXX;" + "password=XXXXXXXXXXXXXX;server=databases-auth.000webhost.com;" + "Trusted_Connection=yes;" + "database=XXXXXXXXXXXXXXXX; " + "connection timeout=30"); }

“用户名”将由用户在 TextBox1 中输入,而“密码”将在 TextBox2 中。任何有关我能够使用的代码或示例/网站链接的帮助将不胜感激。提前谢谢!

【问题讨论】:

  • Nooo...不要存储原始密码,始终对其进行哈希处理...
  • @WillemVanOnsem 是的,这是以后的计划。
  • 你用的是什么框架? ASP.NET? MVC?两者都带有已正确实现的身份验证。不要重新发明轮子,尤其是如果您构建的轮子是三角形的。
  • 如果你现在不以正确的方式做事,你什么时候才能回去做对的事?答案……你不会的。做对而不是现在做,否则你会后悔的。

标签: c# mysql sql-server


【解决方案1】:

我建议的第一件事是不要以原始格式发送密码。至少尝试散列它们并以散列形式保存它们。当您想使用密码进行查询时,只需发送散列字符串即可。

对于散列,您可以使用“单向”加密格式,例如 MD5 或 SHA-256。您可以在 System.Security.Cryptography 中找到这些。

然后,永远不要连接字符串来构造查询。而是使用参数化命令,这样您将拥有一定程度的安全性。看看这个link关于参数化命令

最后,如果您需要返回多于 1 列,请使用 DataReader。如果您只需要返回 1 列,请使用 ExecuteScalar 函数,该函数返回单个值。在this link,您将找到有关如何使用 ExecuteScalar 的信息。

【讨论】:

  • 谢谢 - 它现在按预期工作,我已经使用系统密码术来拥有它们。向你致敬。
【解决方案2】:
public String auth(String u, String p)
{

string recuperatedData = "";

        //Create Connection
        SqlConnection conn = new SqlConnection(@"Data Source=DRACARYS\SQLEXPRESS;Initial Catalog=test;Integrated Security=SSPI");

        //SQL Command
        SqlCommand cmd = new SqlCommand("SELECT password FROM dbo.databasename WHERE username = '" + u +"'"  , conn); 

        //Open connection
        conn.Open();

        //To read from SQL Server
        SqlDataReader dr = cmd.ExecuteReader();

        while (dr.Read())
        {
            recuperatedData = dr["password"].ToString();
        }

        //Close Connections
        dr.Close();

        if (recuperatedData == p)
        {
             //return flag value to shos you've logged in to a different function with post log in functionalities
        } 
} 

【讨论】:

  • 如果我的用户名是' OR ''='怎么办
  • 然后添加与上面相同语法格式的OR注释。就像 SQL 语法一样。这是来自个人项目的代码,它将为提出问题的人提供他们进行项目所需的想法。一旦最初的概念问题得到解决,总可以根据需要进行添加。
  • @SoumyajyotiBhattacharya 我认为 DourHighArch 指的用户名实际上是' OR ''='。重点是您的查询对 SQL 注入开放。如果我尝试使用用户名' OR ''=' 登录,那么您的 SQL 将是:SELECT password FROM dbo.databasename WHERE username = '' OR ''='',这将导致返回每一行。
猜你喜欢
  • 2021-11-29
  • 2011-05-24
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2013-03-05
  • 2021-05-18
  • 2016-02-09
  • 1970-01-01
相关资源
最近更新 更多