C# System.Data.SqlClient.SqlException:“`”附近的语法不正确
我正在尝试使用ASP.NET创建一个登录字段,它将从文本框字段中获取输入,并根据数据库中的用户表检查它们。这些列是用户ID和密码。但这是一个错误 System.Data.SqlClient.SqlException:'附近的语法不正确'`' 使用登录表单时显示。我看不出语法有任何问题 我是新手,所以如果错误很明显,请原谅C# System.Data.SqlClient.SqlException:“`”附近的语法不正确,c#,sql-server,asp.net-mvc,visual-studio,C#,Sql Server,Asp.net Mvc,Visual Studio,我正在尝试使用ASP.NET创建一个登录字段,它将从文本框字段中获取输入,并根据数据库中的用户表检查它们。这些列是用户ID和密码。但这是一个错误 System.Data.SqlClient.SqlException:'附近的语法不正确'`' 使用登录表单时显示。我看不出语法有任何问题 我是新手,所以如果错误很明显,请原谅 public partial class Login_Page : System.Web.UI.Page { protected void Page_Load(obje
public partial class Login_Page : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
lblErrorMessage.Visible = false;
SqlConnection con = new SqlConnection("Data Source=JACKS-PC\\SQLEXPRESS;Initial Catalog=CBR;Integrated Security=True");
con.Open();
}
protected void btnLogin_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=JACKS-PC\\SQLEXPRESS;Initial Catalog=CBR;Integrated Security=True";
con.Open();
string userid = txtUsername.Text.Trim();
string password = txtPassword.Text.Trim();
SqlCommand cmd = new SqlCommand("select `user id`,`password` from user where `user id`='" + txtUsername.Text + "'and `password`='" + txtPassword.Text + "'", con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
Session["username"] = txtUsername.Text.Trim();
Response.Redirect("Homepage.aspx");
}
else
{
lblErrorMessage.Visible = true;
}
con.Close();
}
}
只需删除“`”字符就可以了
您的代码易受注入攻击。请尝试使用SqlCommand.Parameters.add方法添加值
使用此代码:
SqlCommand cmd = new SqlCommand("select userid, password from user where user id = @id and password = @password", con);
cmd.Parameters.Add("@id", SqlDbType.VarChar).Value = txtUsername.Text;
cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = txtPassword.Text;
正如@marc_s所提到的,用户id不是有效的列名,它应该类似于用户id,或者如果其中有空格,则应该类似于:[user id]您的代码有很多问题: 不要在程序或应用程序配置中存储纯文本密码。 不要在程序中嵌入连接字符串 `不是SQL Server语法。 如果输入来自用户,请不要在查询中特别使用字符串连接。使用参数化查询。 完成工作后,请始终处理对象。为此,请使用SqlConnection conn=new SqlConnection。 所有实现IDisposable的方法都可以在using语句中使用
只需删除“`”字符,它就会起作用。您确定要使用SQL Server吗?Backtick`是MySQL的引号字符。你的申请也有两个主要问题;SQL不是参数化的,这意味着它可以被注入,并且您将密码存储为纯文本。密码应该是散列和盐析的。在进一步操作之前,您需要解决这些问题。这不是构建SQL的正确方法—使用参数—密码永远不应以明文形式存储。在SQL Server中,除非将列名放在方括号中,否则在列名中加空格(如用户id)是不起作用的。另外,user是一个保留的T-SQL关键字,所以也不能用作表名——除非您也将其放在方括号中。因此,您需要使用:选择[user id],[user]中的密码…一个带有空格的列名,就像user id在SQL Server中不起作用一样-除非将其放在方括号中。另外,user是一个保留的T-SQL关键字,所以也不能用作表名——除非您也将其放在方括号中。因此,您需要使用:选择[user id],[user]中的密码…我建议添加一个关于密码的注释,存储纯文本密码是一个非常糟糕的主意。@marc_s是的,您是对的,实际上我没有看到。@Wraithrider很好,除了它本身转换数据类型,您不需要在“”之间扭曲字符串,因为它知道应该这样做,并且自己也会这样做,例如cmd.parameters。Add@date,SqlDbType.DateTime.Value=DateTime.Now;。但是,否则,您必须将datetime格式化为sql能够理解的兼容字符串格式,…@Wraithrider,是的,您遵循的是一个糟糕的教程。对于参数,包含参数令牌的SQL语句将作为RPC请求发送到SQL Server。该请求包括本机形式的强类型参数值,数据库引擎可以按原样使用,无需解析。这不仅阻碍了SQL注入,而且帮了大忙,谢谢!是的,纯文本是绝对不行的,以后将作为散列存储,但我担心在我处理更复杂的事情之前,我需要先从数据库的其他部分获得一些更基本的知识!另外,有可能听起来很愚蠢,嵌入连接字符串有什么问题?还有什么更好的选择?谢谢你的帮助!最好在SQL方面使用SSMS来获得经验,并更好地正确编码:如果你觉得这个答案对你有帮助,请考虑向上投票:谢谢你在需要改变连接字符串时需要编译嵌入的连接字符串。嵌入到应用程序中的字符串可以很容易地反编译。
using (SqlCommand cmd = new SqlCommand("select 1 from tbl where id=@id", conn))
{
var idParameter = new SqlParameter()
idParameter.ParameterName = "@id";
idParameter.Value = 1234;
cmd.Parameters.Add(idParameter);
....
}