Member 14479161 Ответов: 2

Этот SQL-код предотвращает SQL-инъекцию


CREATE PROCEDURE SelectAll
AS
  Declare @Quary nvarchar(1000);

  set @Quary = 'select ID,Name from tblStudents where ID = ID and Name = Name';

  exec(@Quary);

RETURN 0


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

добавление дополнительных переменных в код но он попросил меня добавить sacaler varible

CREATE PROCEDURE SelectAll
AS
  Declare @Quary nvarchar(1000);

  declare @ID int;

  Declare @Name Varchar(100);

  set @Quary = 'select ID,Name from tblStudents where ID = ID and Name = Name';

  exec(@Quary);

RETURN 0

Member 14479161

привет
как этот код сделать, это избежать атак путем внедрения кода SQL

alter proc SP_SelectAll
@SQL  varchar (1000) output
as
begin
    select person_ID,FullName,Email,Date_OF_Birth,Age,GenderValue,City, [DepartementName] ,[location],[DepartementHead] ,Salary
           from Person
           join PersonGender
           on Person.Gender_ID = PersonGender.Gender_ID
           join Departements
           on Person.DepartementID = Departements.Dpartement_ID
           join DatesOfBirth 
           on Person.dateOfBirthID = DatesOfBirth.Date_ID
end

2 Ответов

Рейтинг:
7

Patrice T

Цитата:
Этот SQL-код предотвращает SQL-инъекцию

Да, потому что запрос не использует внешние/пользовательские данные.
Но запрос может быть значительно упрощен:
от
CREATE PROCEDURE SelectAll
AS
  Declare @Quary nvarchar(1000);

  set @Quary = 'select ID,Name from tblStudents where ID = ID and Name = Name';

  exec(@Quary);

RETURN 0

к
CREATE PROCEDURE SelectAll
AS
  Declare @Quary nvarchar(1000);

  set @Quary = 'select ID,Name from tblStudents';

  exec(@Quary);

RETURN 0

и затем
CREATE PROCEDURE SelectAll
AS
select ID,Name from tblStudents;

RETURN 0


Взгляните туда: Хранимые процедуры SQL[^]
чтобы узнать, как использовать параметры в хранимой процедуре.


Рейтинг:
15

OriginalGriff

Нет.

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

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

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


Member 14479161

привет

я хочу спросить как насчет отображения обычной таблицы на странице aspx без формы из базы данных просто не отображающей никаких входных данных

Member 14479161

я написал его именно так

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace Learn_Ado
{
    public partial class WebForm12 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string cs = ConfigurationManager.ConnectionStrings["MSSQLDATABASE"].ConnectionString;

            using(SqlConnection con = new SqlConnection(cs))
            {
                con.Open();

                SqlDataAdapter da = new SqlDataAdapter("select * from tblStudents where Name like @Name;", con);

                da.SelectCommand.Parameters.AddWithValue("@Name",TextBox1.Text);

                DataSet ds = new DataSet();

                da.Fill(ds);

                GridView1.DataSource = ds;

                GridView1.DataBind();


            }
        }
    }
}
<pre>

OriginalGriff

Это нормально - строка является параметром, так что не уязвима.
Но есть пара деталей:
SQL LIKE-это не точное сравнение, но для его работы требуются подстановочные знаки.
... SqlDataAdapter("select * from tblStudents where Name like '%' + @Name + '%';", con);
Будет работать лучше: % - это подстановочный знак SQL для "соответствовать чему-либо".

Ваш DataAdapter также должен быть в блоке using, как и ваше соединение.

Кстати: сделайте себе одолжение и перестаньте использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам придется изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo", - и ваш код станет легче читать, более самодокументируемым, легче поддерживать - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...

Member 14479161

хорошо понял большое спасибо каша

OriginalGriff

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