【发布时间】:2014-02-13 16:23:40
【问题描述】:
每当我用正确的数据检查我的数据库时,数据库将它作为错误的用户名返回,我不确定是我的代码还是我的数据库,她就是代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button_Login_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection("Data Source=TOSHIBA0007\\TESTSERVER;Initial Catalog=users;Integrated Security=True");
conn.Open();
string checkuser = "select count(*) from userdatabase where Username=' " + Username.Text + " ' ";
SqlCommand UserComm = new SqlCommand(checkuser, conn);
int temp = Convert.ToInt32(UserComm.ExecuteScalar().ToString().Replace(" ", ""));
conn.Close();
if (temp == 1)
{
conn.Open();
string checkPasswordQuery = "select Password from userdatabase where Username=' "+Username.Text+" ' ";
SqlCommand passCom = new SqlCommand(checkPasswordQuery, conn);
string password = passCom.ExecuteScalar().ToString().Replace(" ", "");
if(password == Password.Text)
{
Session["New"] = Username.Text;
Response.Write("Password Accepted");
}
else
{
Response.Write("Password Incorrect");
}
}
else
{
Response.Write("Username is Incorrect");
}
}
}
任何和所有的帮助都将不胜感激,因为我不知道为什么这不起作用。
【问题讨论】:
-
这里需要注意两点:1) 您的代码对 SQL 注入攻击完全开放,请改用参数化查询。 2)您以纯文本形式存储密码。 切勿以纯文本形式存储密码。 收到密码后立即对密码进行哈希处理并存储哈希值。检查密码时,对其进行哈希处理并比较哈希值。
-
如果我改变它产生的 temp 值并出错,实际上这可能是问题
-
好的大卫,我把它搞定了,我只是开始它的本地化,所以它现在不是很多问题,但谢谢你的建议
-
正如大卫所说,这里需要解决许多安全问题。除此之外,您还要在检查密码之前添加空格,这很可能会导致密码永远不会匹配。
-
@user3306240:好吧,将安全问题分为两个不同的类别。 SQL注入漏洞确实是你自己的问题,你可以及时解决。但密码存储是另一回事。一旦您从实际用户那里接受密码,不正确地处理这些密码就是严重不负责任的行为。 SQL 注入会使您的系统受到攻击,但不正确的密码处理会使您的用户 受到攻击。首先考虑用户。
标签: c# .net database sql-server-2012 visual-studio-2013