Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net c中的Sql错误#_C#_Asp.net_Sql - Fatal编程技术网

C# asp.net c中的Sql错误#

C# asp.net c中的Sql错误#,c#,asp.net,sql,C#,Asp.net,Sql,如果你能帮助我,我的代码有一个错误,我不能理解它 错误是: 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源 异常详细信息:System.Data.SqlClient.SqlException:“Login”附近的语法不正确 我的代码是: public static void ChangePassword(string login, string password) { var sqlCon = new SqlC

如果你能帮助我,我的代码有一个错误,我不能理解它

错误是:

描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

异常详细信息:System.Data.SqlClient.SqlException:“Login”附近的语法不正确

我的代码是:

 public static void ChangePassword(string login, string password)
    {
        var sqlCon = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
        string query = @"update Organizer set Password ="+ password + "where Login=" + login + "";
        SqlCommand cmd = new SqlCommand(query, sqlCon);
        cmd.CommandType = CommandType.Text;
        try
        {
            sqlCon.Open();
            cmd.ExecuteNonQuery();
            sqlCon.Close();
        }
        catch (Exception ee) { throw ee; }
    }
试一试

您缺少了字符串周围的,也就是说,您可能非常容易受到攻击(我猜是因为代码,并且缺少清除功能)。

还要确保您的密码不是以纯文本形式存储的:)


的用法与sql中的类似。

如果要使用上述代码,您的问题是您没有将新密码或登录信息用单引号括起来:

 string query = 
     @"update Organizer set Password = '" + 
       password + 
       "' where Login= '" + login + "'";
但我根本不会使用该代码。这非常危险,因为它允许人们传入任意SQL。我将使用参数化查询:

var query = "update organizer set password = @password where login = @login";
var command = new SqlCommand(query, sqlCon);

command.Parameters.Add("@password", SqlDbType.VarChar, 100, password);
command.Parameters.Add("@login", SqlDbType.VarChar, 100, login);

你需要单引号

set Password = ' /*<---*/ "+ password + "' /*<---*/  where Login=' /*<---*/ " + login + "' /*<---*/ "
set Password='/*
  • 我们已经看到了足够多的sql注入攻击,我们不需要其他攻击,请修复您的代码并使用参数
  • 使用
    使用
    块以避免连接泄漏
  • 安装一个异常处理程序,如
  • }


@emilios-这可能会起作用,但会导致危险的代码。您应该检查参数化查询以删除安全漏洞。@贾斯汀·尼斯纳是正确的,您需要检查自己的安全漏洞或使用内置系统。参数化查询和未加密密码只是问题的一部分。他正在使用自己的身份验证操作系统。这不会很好地结束。永远不要使用
命令。参数。使用字符串添加
。它会将参数添加为NVARCHAR,并且数据类型优先级规则将强制WHERE子句忽略筛选列上的任何索引。始终使用显式SqlDbType并强制使用适当的类型。第二个问题是,此模式添加了段落长度为字符串的精确长度的米,这会导致不必要的缓存污染,因为SQL计划不能在不同的输入类型之间重复使用,并且不同长度的参数表示不同的类型。请始终使用显式长度。@Remus-您每天都会学到一些新东西。感谢您的深入了解。更新。+111111到-all-Remus点为了人类,请听他的话!
set Password = ' /*<---*/ "+ password + "' /*<---*/  where Login=' /*<---*/ " + login + "' /*<---*/ "
using (var sqlCon = new SqlConnection(...))
{
    string query = @"update Organizer set Password =@password where Login=@login";
    SqlCommand cmd = new SqlCommand(query, sqlCon);
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.Add("@password", SqlDbType.VarChar, 8000);
    cmd.Parameters["@password"].Value = password;  
    cmd.Parameters.Add("@login", SqlDbType.VarChar, 8000);
    cmd.Parameters["@login"].Value = login;  

    sqlCon.Open();
    cmd.ExecuteNonQuery();
    sqlCon.Close();