manish-gusain8909 Ответов: 2

Объект устанавливается в экземпляр при создании файла cookie


я создаю страницу формы входа в систему и хочу сохранить имя пользователя и пароль в файлах cookie.
при создании файла cookie в моем проекте он выдает ошибку объекта, установленного не на экземпляр.
на линии :ответ.Cookies.Добавить(mycookie);


чтобы проверить код, я создал другой проект, в котором работает тот же код.

Что я уже пробовал:

string cookieUsername, cookiePassword;
cookieUsername = objDataTable.Rows[0]["USERNAME"].ToString();
cookiePassword = objDataTable.Rows[0["USER_PASSWORD"].ToString();
HttpCookie mycookie = new HttpCookie("LoginUsername");
mycookie["UserName"] = cookieUsername;
mycookie["UserPassword"] = cookiePassword;
mycookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(mycookie);



В datatable я получаю данные. получение ошибки в выделенной строке

TommoDotCommo

У меня нет ответа, но вы действительно не должны хранить пароли в файлах cookie.

manish-gusain8909

хорошо, спасибо.я сохраню пароль после шифрования. но вопрос в том, почему это дает ошибку. в то время как тот же код работает над другим проектом.

F-ES Sitecore

"Ответ" - это ноль или "ответ.Cookies" - это null. Мы не можем запустить ваш код, поэтому не можем проверить, какой именно, и мы не знаем, в каком контексте этот код работает, поэтому не можем сказать вам, почему они могут быть нулевыми. Скорее всего, есть что-то о том, как работает код, что Вы нам не говорите.

2 Ответов

Рейтинг:
2

OriginalGriff

Цитата:
У меня нет ответа, но вы действительно не должны хранить пароли в файлах cookie.

хорошо, спасибо.я сохраню пароль после шифрования.

Нет.
Никогда не шифруйте пароли - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^]

Что касается вашей "главной проблемы", то это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, в которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы можете узнать!


manish-gusain8909

HttpCookie mycookie = новый HttpCookie("UserLogin");
Микки.Значения["UserName"] = "nnnnnnnn";
Микки.Значения["USER_PASSWORD"] = "мммммм";
Микки.Expires = DateTime.Now.AddMinutes(1);
Ответ.Cookies.Добавить(mycookie);

я попробовал и это. теперь также получаю ту же ошибку

OriginalGriff

И что же вам показал отладчик?

OriginalGriff

И когда отладчик остановился там, вы посмотрели на различные части строки, чтобы узнать, что было null?
И ваш файл webconfig не будет иметь никакой реальной пользы - нулевые ссылки часто являются вашими данными, а не вашей конфигурацией, и у меня нет к этому доступа!

manish-gusain8909

публичный список<menubarclass> UserLoin(строковое имя пользователя, строковый пароль)
{
objSQLHeplper = новый SQLHelper();
MenuBarClass objMenu = новый класс меню();
DcryptPassword = objSQLHeplper.Шифрование(пароль, "sblw-3hn8-sqoy19");
List<menubarclass> ObjMenuName = новый список<menubarclass>();
пробовать
{
соединение = новое MySqlConnection(SQLHelper.Параметр connectionString);
строке Command = "выберите имя пользователя,ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ,ROLE_ID от user_master Где UserName = '" + имя + "', и значение user_password='" + DcryptPassword + "'";
MySqlDataAdapter sda = новый MySqlDataAdapter(команда, соединение);
DataTable objDataTable = новый DataTable();
sda.Fill(objDataTable);


если (objDataTable.Строк.Считай != 0)
{
HttpCookie mycookie = новый HttpCookie("UserInfo");
mycookie["UserName"] = имя пользователя;
mycookie["UserPassword"] = DcryptPassword;
Микки.Expires = DateTime.Now.AddDays(5);
Ответ.Cookies.Добавить(mycookie);

команда = "выберите SM.MENU_DESC,SMM.SUB_MENU_DESC,SMM.CONTROLLER_NAME,SMM.ACTION_NAME из sec_role_main_menus SRMM, sec_menus SM ,submenu_master SMM, где SM.MENU_ID=SRMM.MAIN_MENU_ID и SMM.SUB_MENU_ID= SRMM.SUB_MENU_ID и SRMM.ROLE_ID=" + objdatable.Строки[0]["ROLE_ID"].ToString() + " заказ по SM.MENU_DESC;";
sda = новый MySqlDataAdapter(команда, соединение);
sda.Fill(objDataTable);
foreach (DataRow dr в objDataTable.Строки)
{
if (dr["MENU_DESC"].Метод toString() !="")
{
objMenu = новый класс меню();
objMenu.Ошибка = "";
objMenu.MENU_DESC = dr["MENU_DESC"].Метод toString();
objMenu.SUB_MENU_DESC = dr["SUB_MENU_DESC"].Метод toString();
objMenu.CONTROLLER_NAME = dr["CONTROLLER_NAME"].Метод toString();
objMenu.ACTION_NAME = dr["ACTION_NAME"].Метод toString();
ObjMenuName.Add(objMenu);
objMenu = нуль;
}

}
// return View("Домашняя страница", ObjMenuName.Список());
return (ObjMenuName.Список());
}
еще
{
objMenu.Ошибка = "Сбой";
ObjMenuName.Add(objMenu);
return (ObjMenuName.Список());

}
}
поймать (исключение бывший)
{
бросать;
}

}

OriginalGriff

Но сделайте себе большое одолжение: исправьте свой код. Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

OriginalGriff

И что же?
Я повторяю: "и когда отладчик остановился там, вы смотрели на различные части строки, чтобы узнать, что было null?"

manish-gusain8909

Ответ.Cookies.Добавить(mycookie);

эта строка выдает ошибку:"ССЫЛКА на объект не установлена на экземпляр объекта." nullreference исключение поймал

я попробовал другие строки response.write() для тестирования это также дает ту же ошибку

Я искал то же самое в интернете. некоторые дали нить повода для того же самого.

до сих пор не решен

OriginalGriff

А ЧТО ПОКАЗЫВАЕТ ВАМ ОТЛАДЧИК?
Есть ли смысл печатать здесь, если все, что вы делаете, это игнорируете все, что я говорю, и бросаете в меня одну и ту же чушь каждый раз?

manish-gusain8909

Reponse.cookies.add(объект httpcookie)

когда отладчик останавливается в этот момент, httpcookie coject также имеет значение.

Ответ.Напишите также, давая ту же ошибку.

manish-gusain8909

спасибо за вашу помощь

проблема решена, Reponse.cookies.add() должен быть в методе actionresult в MVC

OriginalGriff

Всегда пожалуйста!

Рейтинг:
0

Gerry Schmitz

Цитата:
чтобы проверить код, я создал другой проект, в котором работает тот же код.


Поскольку у вас есть рабочая версия и нерабочая версия, вы можете:

1) бросьте один ("нерабочий") и продолжайте жить
2) Сделайте "файл diff", чтобы увидеть, почему / где работает рабочая версия