【问题标题】:HttpResponse when trying to make cookie in C#尝试在 C# 中制作 cookie 时的 HttpResponse
【发布时间】:2012-11-11 08:13:48
【问题描述】:

错误是:当我尝试使用 Response.Cookies.Add(cookie) 时,当前上下文中不存在名称“响应”;

我不确定我还需要添加什么才能使其正常工作。 我制作了用户可以登录的应用程序,并在他们登录时制作了 cookie,因此他们在重新打开应用程序时不需要再次登录。

using MySql.Data.MySqlClient;
using System.Web;




namespace login
{

    public partial class Form1 : Form
    {
        MySqlConnection konekcija;
        string baza = "host=localhost;database=test;user=root;password=";
        MySqlCommand comm;
        MySqlDataReader reader;
        HttpCookie cookie;




        public Form1()
        {
            InitializeComponent();
        }



        private void Form1_Load(object sender, EventArgs e)
        {
            konekcija = new MySqlConnection(baza);
            comm = konekcija.CreateCommand();
            konekcija.Open();


        }



        private void button1_Click(object sender, EventArgs e)
        {

            string user = textBox2.Text.ToString();
            string pass = textBox1.Text.ToString();
            trylogin( user,  pass);

        }

        public void trylogin(string user, string pass)
        {

            if (checkBox1.Checked)
            {
                cookie = new HttpCookie("remember_me");
                cookie["Username"] = textBox2.Text;
                cookie["Expire"] = "365 Days";
                cookie.Expires = DateTime.Now.AddDays(365);
                Response.Cookies.Add(cookie);


            }

            comm.CommandText = "SELECT * FROM korisnici WHERE user='"+user+"' AND pass='"+pass+"'";

            reader = comm.ExecuteReader();
            if (reader.Read() == true)
            {

                reader.Dispose();
            }
            else 
            {
                reader.Dispose();
            }

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            konekcija.Close();
        }
    }
}

【问题讨论】:

  • 你所做的并不安全——你不能相信 cookie 会告诉你这样的用户名。而且您甚至在知道他们是否提供了有效的登录信息之前就设置了 cookie...而且您不想只是将未经处理的用户输入放入您的非参数化查询...对不起,我知道这没有答案你的问题,但这里有更大的问题。
  • trylogin 中存在 SQL 注入。任何人都可以在没有凭据的情况下登录。

标签: c# mysql httpresponse httpcontext


【解决方案1】:

在网上搜索“remember me in c#”,你会发现很多讨论,即:

"Remember Me" in ASP.Net

http://forums.asp.net/t/1303629.aspx

不管怎样,你正在尝试用你的代码做一些非常不安全的事情,小心。


不管你的“记住我”任务,好吧,你可能想“即时”编写你的 sql 查询,只记得在发送到 sql 引擎之前用替换双引号:

user = user.Replace("'", "''"); //Assuming string values are not null here
password = password .Replace("'", "''");
comm.CommandText = "SELECT * FROM korisnici WHERE user='"+ user +"' AND pass='"+ password +"'";

我强烈建议您学习使用参数(即“...和 ​​user=@user”):它们将为您的代码提供更高的安全性和稳健性,并且您无需使用替换。

另一个好的做法是只提取需要的字段。如果有人以某种方式访问​​此结果,并且您还以明文形式输入了密码字段,则很高兴将其显示出来。 如果你不“选择*”,系统可能仍然不安全,但至少你不会免费提供任何东西:

comm.CommandText = "SELECT user_name,login_level,anything_you_really_need FROM korisnici WHERE user=@user AND pass=@pass";
MySqlParameter pUser = new MySqlParameter("@user", user);
MySqlParameter pPass = new MySqlParameter("@pass", password);

comm.SelectCommand.Parameters.Add(pUser);
comm.SelectCommand.Parameters.Add(pPass);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2012-10-07
    相关资源
    最近更新 更多