C# 在SQL查询中用双引号替换单引号

C# 在SQL查询中用双引号替换单引号,c#,sql,sql-server,winforms,ado.net,C#,Sql,Sql Server,Winforms,Ado.net,我正在使用C#创建一个易受攻击的Windows窗体应用程序,以练习SQL注入,并理解为什么首先会发生此漏洞。我知道我应该使用参数化查询来开发安全的应用程序 应用程序需要用户输入用户名和密码才能登录。以下代码负责根据用户的输入动态生成SQL查询: public SqlDataReader performLogin(String username_input, String password_input) { String username = username_input; Str

我正在使用C#创建一个易受攻击的Windows窗体应用程序,以练习SQL注入,并理解为什么首先会发生此漏洞。我知道我应该使用参数化查询来开发安全的应用程序

应用程序需要用户输入用户名和密码才能登录。以下代码负责根据用户的输入动态生成SQL查询:

public SqlDataReader performLogin(String username_input, String password_input)
{
    String username = username_input;
    String password = password_input;

    String sqlquery = "SELECT * FROM users where username='" + username + "' and password='" + password + "'";

    SqlCommand query = new SqlCommand(sqlquery, conn);

    SqlDataReader reader = query.ExecuteReader();

    return reader;
}
SQL Server数据库包含一个名为“admin”的用户名,通过在用户名字段中输入以下数据,我可以作为该用户登录,而不知道其密码:

admin'--
但是,我想修改动态生成的SQL查询,以便我必须输入双引号(而不是两个单引号),而不是一个单引号,才能作为管理员登录:

admin"--
我试着用单引号替换每个双引号字符,用双引号替换每个单引号。我还尝试用双引号替换每个单引号字符,并按如下方式对其进行转义:

String sqlquery = "SELECT * FROM users where username=\"" + username + "\" and password=\"" + password + "\"";

String sqlquery = "SELECT * FROM users where username=@"" + username + "@" and password=@"" + password + "@"";

我还没有找到有效的解决办法。在尝试登录后,我可能会遇到语法错误或应用程序崩溃。

为什么不在将用户名传递到查询之前替换它呢

string finalUsername = username.Contains("\"") ? username.Replace("\"", "'") : username;
string sqlQuery = "SELECT * FROM users where username='" + finalUsername + "' and password='" + password + "'";
如果需要,甚至可以阻止原始向量:

string finalUsername = username.Contains("\"") ? username.Replace("\"", "'") : (username.Contains("'") ? username.Replace("'", "") : username);
string sqlQuery = "SELECT * FROM users where username='" + finalUsername + "' and password='" + password + "'";

在SQL查询中不能对字符串使用双引号。除非您将
QUOTED\u IDENTIFIER设置为OFF
您说您想“练习SQL注入”,然后说“我想…输入双引号…以管理员身份登录”?这不是SQL注入,那么您认为这将实现什么呢?使用双引号是绕过非常常见的SQL注入缓解技术的有效方法-将单引号字符列入黑名单。开发人员可能会在动态SQL查询中使用双引号而不是单引号,因为他们认为自己的代码是安全的。我只是想看看如何在C#中实现它。感谢您指出XY问题,这是一本有趣的读物,我的问题很可能不是很清楚,对不起。对于其他看这个问题的人(他们不想接受SQL注入),可能值得一读。在这个问题上使用的方法是非常危险的。不应该使用它。你在谁的服务器上练习?有了所有需要学习的东西,这是一个你可以带着信念继续前进的地方。谢谢!这正是我想要的