Member 13783167 Ответов: 3

Несанкционированный доступ deanied dotnet developer


protected void OnRowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            Label lblEditID = (Label)gvDepartments.Rows[e.RowIndex].FindControl("lblRowId");
            GridViewRow row = gvDepartments.Rows[e.RowIndex];
            TextBox txtCDOR = (TextBox)row.Cells[4].Controls[0];
            TextBox txtCOrganization = (TextBox)row.Cells[5].Controls[0];
            TextBox txtCBranch = (TextBox)row.Cells[7].Controls[0];
            TextBox txtCLocation = (TextBox)row.Cells[8].Controls[0];
            SqlCommand cmd = new SqlCommand("update tbl_hr_client_Reg_Data set CDOR='" + txtCDOR.Text + "',COrganization='" + txtCOrganization.Text + "',CBranch='" + txtCBranch.Text + "',CLocation='" + txtCLocation.Text + "' where id=" + lblEditID.Text, con);
            cmd.CommandTimeout = 0;
            cmd.ExecuteNonQuery();
            con.Close();
            bindgrid();
//VKJ
        }


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

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

3 Ответов

Рейтинг:
23

Vincent Maverick Durano

Я уступаю Originalgriff's take в отношении SQL-инъекции.

Вплоть до вашей проблемы, поскольку вы не указали, в какой строке взорвется ошибка, то я предполагаю, что в строке, где вы делаете FindControl или доступ к Controls коллекция.

При обращении к Server Control от GridView, то вы можете либо использовать FindControl или Controls коллекция точно такая же, как у вас сейчас. Но имейте в виду, что у них есть определенная цель. Как правило, вы используете FindControl метод, когда ваш серверный элемент управления находится с TemplateField колонка. И вы, как правило, используете Controls[index] когда вы используете a BoundField колонка.

К примеру, давайте поставим в GridView который покажет 2 столбца данных, как показано ниже:

<asp:GridView ID="GridViewEmployee" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateField HeaderText="Employee Name">
            <EditItemTemplate>
                <asp:TextBox ID="TextBoxEditEmployee" runat="server" Text='<%# Bind("Employees") %>'/>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="LabelEmployee" runat="server" Text='<%# Bind("Employees") %>'/>
            </ItemTemplate>
        </asp:TemplateField >
        <asp:TemplateField HeaderText="Position">
            <EditItemTemplate>
                <asp:TextBox ID="TextBoxEditPosition" runat="server" Text='<%# Bind("Position") %>'/>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="LabelPosition" runat="server" Text='<%# Bind("Position") %>'/>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
 </asp:GridView>


Теперь, если вы хотите получить доступ к значениям TextBox выше по адресу RowUpdating событие, вы могли бы сделать что-то вроде этого:

protected void GridViewEmployee_RowUpdating(object sender, GridViewUpdateEventArgs e){

       //Accessing Edited values from the GridView
        string employee = ((TextBox)GridViewEmployee.Rows[e.RowIndex].Cells[0].FindControl("TextBoxEditEmployee")).Text; //Employee

        string position = ((TextBox)GridViewEmployee.Rows[e.RowIndex].Cells[1].FindControl("TextBoxEditPosition")).Text; //Position

        // Your Update code here
        // Do database changes
        GridViewEmployee.EditIndex = -1; //Turn the Grid back to read only mode
        BindGridView(); // Rebind GridView to reflect changes made
 }


Заметил, что мы ссылаемся на Control с помощью Cells[0].FindControl("TextBoxEditEmployee") Это указывает на то, что мы смотрим на первый столбец таблицы. GridView с помощью ссылки Cells[0] Индекс столбца GridView всегда будет начинаться с нуля. Затем мы находим контроль, который мы хотим внутри этого Column с помощью FindControl("TextBoxEditEmployee"). Этот ID серверный элемент управления должен совпадать с тем, который вы передаете в серверный элемент управления. FindControl метод, иначе он будет бросать Null Reference Exception.

Доступ к элементу управления из BoundField Колонка-это другое. Например, если у нас есть такая разметка GridView:

<asp:GridView ID="GridViewEmployee" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="Employees" HeaderText="Name"/>
            <asp:BoundField DataField="Position" HeaderText="Position"/>
        </Columns>
 </asp:GridView>


Чтобы получить доступ к отредактированным значениям в событии RowUpdating, вы можете сделать что-то вроде этого:
protected void GridViewEmployee_RowUpdating(object sender, GridViewUpdateEventArgs e){

        //Accessing Edited values from the GridView

        string employee = ((TextBox)GridView1.Rows[e.RowIndex].Cells[0].Controls[0]).Text; 
        string position = ((TextBox)GridView1.Rows[e.RowIndex].Cells[1].Controls[0]).Text; 

        // Your Update code here
        // Do database changes
        GridViewEmployee.EditIndex = -1; //Turn the Grid back to read only mode
        BindGridView(); // Rebind GridView to reflect changes made

}


Заметили, что мы сейчас пользуемся Cells[0].Controls[0] получить ссылку на созданный Server Control Это указывает на то, что мы смотрим на первый Column из GridView с помощью ссылки Cells[0]... и когда мы найдем в нем тот контроль, который нам нужен Column с помощью Controls[0] что такое автоматически сгенерированное редактирование TextBox.

Здесь следует иметь в виду, что вы должны указать правильный индекс ячеек при доступе к элементу управления из GridView, в противном случае он будет бросать Null Reference Exception.

Если у вас есть type cast error, то, возможно, это связано с несоответствием типа данных вашей базы данных. Другими словами, вы проходите через string тип, который исходит от вашего TextBox/Label К integer введите в свою базу данных. Например, в вашем SQL Where Clause вы используете id что может быть int введите из своей базы данных, но вы передавали Label.Text ценность для него, которая является string Вы должны проверить каждый тип, которому вы передаете значения, и исправить это, а также рассмотреть возможность использования параметризованного запроса, как это было предложено, чтобы избежать Атака Sql-инъекций.


Рейтинг:
2

Patrice T

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

Он также должен сообщить вам номер строки ошибки.
SqlCommand cmd = new SqlCommand("update tbl_hr_client_Reg_Data set CDOR='" + txtCDOR.Text + "',COrganization='" + txtCOrganization.Text + "',CBranch='" + txtCBranch.Text + "',CLocation='" + txtCLocation.Text + "' where id=" + lblEditID.Text, con);

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


Рейтинг:
0

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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

Как только вы это исправите, вы можете начать смотреть на это - но есть вероятность, что ваш GridView содержит строки, а не текстовые поля.