【问题标题】:Session value in delete statement删除语句中的会话值
【发布时间】:2013-07-19 19:11:33
【问题描述】:

我想编写一个代码,用户可以通过它在登录后停用他的帐户。 在登录页面中,我创建了一个会话并在停用帐户页面的页面加载方法中获取它。 这是我的删除查询,但不适用于会话值。

String SQLQuery = "DELETE FROM SignUp Where Password=\'" + txtPassword.Text + "\' AND EmailAddress= \'" + Session["email"]+ "\'";

【问题讨论】:

  • 这个查询引发了很多很多危险信号。首先,正如其他人所说,SQL注入。使用参数。其次,根据未散列的密码删除帐户?我对您的应用了解不多,但请先阅读“密码哈希”和“sql 注入”,然后再进一步了解!

标签: c# asp.net


【解决方案1】:

您需要确保在查询中使用session["email"] 之前设置它并且它不是null 并且您从中获得价值。还要使用参数来避免SQL injection。您可以阅读这篇article 如何使用参数进行 SQL 查询。

String SQLQuery = "DELETE FROM SignUp Where Password=\'" + txtPassword.Text + "\' AND EmailAddress= \'" + Session["email"].ToString() + "\'";

【讨论】:

  • ToString 不正确。当您在这样的字符串表达式中使用非字符串对象时,会自动执行 ToString()。 sql查询中还添加了什么?
【解决方案2】:

你在 session["email"] 之后错过了 "ToString()" 方法

喜欢这个

session["email"].ToString()

建议在使用前检查会话是否可用

if(Session["email"] != null)
{
String SQLQuery = "DELETE FROM SignUp Where Password=\'" + txtPassword.Text + "\' AND EmailAddress= \'" + Session["email"].Tostring() + "\'";
}
else
{
   //session timeout
}

还有一件事,你的 sql 代码会让你暴露于 sqlinjection .. 建议您使用Parameterize执行sql查询以避免sql注入。像这样

if(Session["email"] != null)
    {
string password =  txtPassword.Text;
string email = Session["email"].Tostring();


    String SQLQuery = "DELETE FROM SignUp Where Password=@pass AND EmailAddress=@email";
SqlCommand dbComm = new SqlCommand(SQLQuery , new SqlConnection() );
dbComm.Parameters.Add("@pass", SqlDbType.NVarChar).Value = password ;
dbComm.Parameters.Add("@pass", SqlDbType.NVarChar).Value = email  ;

//execute sql
    }
    else
    {
       //session timeout
    }

【讨论】:

  • 我在调试我的代码字符串传递有值但字符串电子邮件没有任何内容时尝试过这种方法。我使用了登录控件,其用户名值等于会话值 Session["email"] = Login1 。用户名;这个查询给了我错误必须声明标量变量传递。
  • if (Session["email"] != null) 条件为真,但字符串 email 不包含任何内容
  • ToString 不正确。当您在这样的字符串表达式中使用非字符串对象时,会自动执行 ToString()。 sql查询中还添加了什么?
猜你喜欢
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
相关资源
最近更新 更多