Member 13680033 Ответов: 3

Как я могу удалить эту ошибку"


я получаю эту ошибку в своем proj..тот же оператор обновления успешно работает на других страницах, но плохо себя ведет на этой странице.Заранее благодарю за ответ.
Syntax error in UPDATE statement. at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteNonQuery() at fyp_template.Changepassword.btnsubmitpassword_Click(Object sender, EventArgs e) in C:\Users\anam\Documents\Visual Studio 2015\Projects\FYP\fyp_template\fyp_template\Changepassword.aspx.cs:line 57"


Мой код выглядит следующим образом
ne 57
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.OleDb;
namespace fyp_template
{
    public partial class Changepassword : System.Web.UI.Page
    {
        OleDbConnection mconn = new OleDbConnection();
        OleDbCommand cmd = new OleDbCommand();
        protected void Page_Load(object sender, EventArgs e)
        {
            lblusername.Text = Session["Name"].ToString();
            if (Session["ID"] == null)
            { Label3.Text = "User"; }
            else
            {
                Label3.Text = Session["Name"].ToString();
            }
            try
            {
//                mconn.ConnectionString = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = E:\abc.accdb";

                
                mconn.Open();
            }
            catch (Exception ex) { Response.Write("Error is " + ex); }
            finally { mconn.Close(); }

        }

        protected void btnsubmitpassword_Click(object sender, EventArgs e)
        {

            if (Session["ID"] == null)
            {
                string log1 = "Login first to change the password";
                ClientScript.RegisterStartupScript(this.GetType(), "Incorrect Password", "alert('" + log1 + "');", true);
                Response.Redirect("~/Login.aspx");

            }
            else
            {
                if (txtnewpassword.Text == "") { lblerrormessage.Text = "Enter New Password"; }
                else
                {
                    try
                    {
                        int id = Convert.ToInt32(Session["ID"]);
                        mconn.Open();
                        string squery = "update users set Password="+ txtnewpassword.Text + " where userId=" + id;
                        cmd = new OleDbCommand(squery, mconn);
                        cmd.ExecuteNonQuery();
                        mconn.Close();


                        string log1 = "Password updated successfully";
                        ClientScript.RegisterStartupScript(this.GetType(), " Password updated", "alert('" + log1 + "');", true);

                    }
                    catch (Exception ex) { Response.Write(ex); }
                    finally
                    {
                        mconn.Close();
                    }
                }
            }
        }

        

        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            Response.Redirect("My_Account.aspx");
        }

        protected void btnresetpassword_Click(object sender, EventArgs e)
        {
            txtnewpassword.Text = "";
        }
    }
}


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

я успешно выполнил тот же запрос на других страницах.

Member 13680033

я просто принимаю ввод в текстовое поле, но он находится в режиме пароля

Richard Deeming

Неуместный. Вы все еще храните пароли в базе данных в виде обычного текста. Если вы подключитесь к своей базе данных и запустите SELECT * FROM users, вы увидите пароль для всех ваших пользователей.

Прочитать статью. Понять проблему. Затем обновите свой код так, чтобы он хранил только соленый хэш паролей пользователей.

Richard Deeming

И почему вы заново изобретаете колесо? ASP.NET имеет несколько совершенно хороших встроенных систем аутентификации - например, Личность ASP.NET [^]

Member 13680033

я нашел какую-то ошибку в этой системе аутентификации, поэтому я ее и построил

Richard Deeming

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

Я предполагаю, что вы сообщили об этом в Microsoft. Можете ли вы предоставить ссылку на свой отчет об ошибке?

3 Ответов

Рейтинг:
21

Patrice T

string squery = "update users set Password="+ txtnewpassword.Text + " where userId=" + id;

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Member 13680033

Тогда что же мне делать, чтобы избежать sql-инъекции?

Member 13680033

Спасибо за внимание.

Рейтинг:
2

Member 13680033

Пароль был ключевым словом, я изменил его пароль на pw, и теперь он работает.Спасибо всем, кто рассмотрел этот вопрос и предоставил свои решения.


Рейтинг:
0

MadMyche

Как ppolymorphe заявленный синтаксис является приглашением для SQL-инъекции, и вы должны просмотреть эти статьи. Не хотелось бы в будущем называть тебя "маленький Бобби Тэйблс"...

Хотя класс OleDB не поддерживает именованные параметры[1], они используют AddWithValue метод, имеющий именованные параметры. Что вам нужно сделать, так это добавить параметры в том же порядке, в каком они появляются в запросе
Я предпочитаю делать это так, как это отражает синтаксис при работе с AdoDB и SQL server.

Следующие строки должны заменить соответствующие строки в вашем Попробуй блок:

string squery = "update users set Password=? where userId= ?";
cmd = new OleDbCommand(squery, mconn);
cmd.Parameters.AddWithValue("@Password", txtnewpassword.Text);
cmd.Parameters.AddWithValue("@userId", id);

Рекомендации:
[1] Объект oledbcommand.свойства параметров[^]
Поставщик OLE DB .NET не поддерживает именованные параметры для передачи параметров в инструкцию SQL или хранимую процедуру, вызываемую OleDbCommand, когда CommandType имеет значение Text. В этом случае необходимо использовать заполнитель вопросительного знака (?).