nar86 Ответов: 2

При обновлении двух строк, затронутых в таблице SQL server


ALTER PROCEDURE [dbo].[sp_update_farmer_registration_web] 
@originname varchar(100), 
@farmerctscode varchar(100), 
@farmerseason varchar(100), 
@dateofjoinseco varchar(100), 
@governmentcode varchar(100), 
@firstname varchar(100), 
@lastname varchar(100), 
@surname varchar(100), 
@gender varchar(100), 
@dateofbirth varchar(100), 
@birthlocation varchar(100), 
@fathername varchar(100), 
@mothername varchar(100), 
@village varchar(100), 
@currentyearcooperative varchar(100), 
@phonenumber varchar(100), 
@observation varchar(100), 
@nooffarms varchar(100), 
@productionestimation varchar(100), 
@otherdetails varchar(max), 
@previouscropsdetails varchar(max),
@firstlevelapprovalstatus varchar(100), 
@firstlevelapprovedby varchar(100), 
@secondlevelapprovalstatus varchar(100), 
@secondlevelapprovedby varchar(100), 
@firstlevelcomments varchar(max), 
@secondlevelcomments varchar(max), 
@updatedby varchar(100), 
@mastertype varchar(100) 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @sqlQuery VARCHAR(MAX) 
 
IF @mastertype = '' 
BEGIN 

SET @sqlQuery = 'UPDATE dbo.tbl_farmerregistration_' + @originname + ' SET farmerseason = ''' + @farmerseason + ''', 
dateofjoinseco = ''' + @dateofjoinseco + ''', governmentcode =''' + @governmentcode + ''', firstname = ''' + @firstname + ''', 
lastname = ''' + @lastname + ''', surname = ''' + @surname + ''', gender = ''' + @gender + ''', dateofbirth = ''' + @dateofbirth + ''', 
birthlocation = ''' + @birthlocation + ''', fathername = ''' + @fathername + ''', mothername = ''' + @mothername + ''', 
village = ''' + @village + ''', currentyearcooperative = ''' + @currentyearcooperative + ''', 
phonenumber = ''' + @phonenumber + ''', observation = ''' + @observation +''', nooffarms = ''' + @nooffarms + ''', produtionestimation = ''' + @productionestimation + ''', 
otherdetails = ''' + @otherdetails + ''',previouscropsdetails = ''' + @previouscropsdetails + ''', 
updatedby = ''' + @updatedby + ''', updateddate = GETDATE() 
WHERE farmerctscode = ''' + @farmerctscode + '''' 

END


Это и есть вышеупомянутый ИП


Когда я выполняю нижеприведенный запрос следующим образом

UPDATE dbo.tbl_farmerregistration_ivorycoast SET farmerseason = '2019', 
dateofjoinseco = '2012', governmentcode ='402787J', firstname = 'KITCHINDJOUHOU', 
lastname = 'OUATTARA', surname = 'A', gender = 'MALE', dateofbirth = '17/5/1981', 
birthlocation = 'FERKESSEDOUGOU', fathername = 'OUATTARA MEYERIGUE', mothername = 'OSSIELETIAN OUATTARA', 
WHERE farmerctscode = '1050669'


я получаю вывод в sql 2 строки затронуты

в таблице tbl_farmerregistration_ivorycoast вставлены две строки для этого farmerctscode = '1050669'

farmerseason dateofjoinseco governmentcode имя фамилия отчество пол dateofbirth birthlocation отчество mothername
2019 2012 402787J KITCHINDJOUHOU OUATTARA мужчина 17/5/1981 Ferek Ras Osel
2019 2012 402787J KITCHINDJOUHOU OUATTARA мужчина 17/5/1981 Ferek Ras Osel
как исправить эту проблему.

пожалуйста, дайте мне знать.

как исправить эту ошибку

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

Изменить процедуру [dbo].[sp_update_farmer_registration_web]
@originname varchar(100),
@farmerctscode varchar(100),
@farmerseason varchar(100),
@dateofjoinseco varchar(100),
@governmentcode varchar(100),
@firstname varchar(100),
@фамилия varchar(100),
@фамилия варчар(100),
@gender varchar(100),
@dateofbirth varchar(100),
@birthlocation varchar(100),
@fathername varchar(100),
@mothername varchar(100),
@деревня варчар(100),
@currentyearcooperative varchar(100),
@phonenumber varchar(100),
@наблюдение varchar(100),
@nooffarms varchar(100),
@productionestimation varchar(100),
@otherdetails varchar(Макс),
@previouscropsdetails varchar(Макс),
@firstlevelapprovalstatus varchar(100),
@firstlevelapprovedby varchar(100),
@secondlevelapprovalstatus varchar(100),
@secondlevelapprovedby varchar(100),
@firstlevelcomments varchar(макс.),
@secondlevelcomments varchar(макс.),
@updatedby varchar(100),
@mastertype varchar(100)
АС
НАЧАТЬ
УСТАНОВИТЕ NOCOUNT ON;

Объявить @sqlQuery VARCHAR(MAX)

Если @mastertype = "
НАЧАТЬ

Набор @SQL-запрос = 'ДБО обновление.tbl_farmerregistration_' + @originname + ' набор farmerseason = "' + @farmerseason + "',
dateofjoinseco = "' + @dateofjoinseco + "', governmentcode ="' + @governmentcode + "', firstname = "' + @firstname + "',
фамилия = "' + @фамилия + "', фамилия = "' + @фамилия + "', пол = "' + @пол + "', дата рождения = "' + @Дата рождения + "',
birthlocation = "' + @birthlocation + "', fathername = "' + @fathername + "', mothername = "' + @mothername + "',
деревня = "' + @деревня + "', currentyearcooperative = "' + @currentyearcooperative + "',
и phonenumber = "' + @номер_телефона + ", наблюдение = "' + наблюдение@+"', nooffarms = "' + @nooffarms + "', produtionestimation = "' + @productionestimation + "',
otherdetails = "' + @otherdetails + "',previouscropsdetails = "' + @previouscropsdetails + "',
updatedby = "' + @updatedby + "', updateddate = GETDATE()
Где farmerctscode = "' + @farmerctscode + ""

КОНЕЦ

Это и есть вышеупомянутый ИП


Когда я выполняю нижеприведенный запрос следующим образом

Обновление dbo.tbl_farmerregistration_ivorycoast SET farmerseason = '2019',
dateofjoinseco = '2012', governmentcode ='402787J', firstname = 'KITCHINDJOUHOU',
фамилия = 'Уаттара', фамилия = 'а', пол = 'мужчина', дата рождения = '17/5/1981',
birthlocation = 'ФЕРКЕССЕДОУГОУ', отчество = 'Уаттара MEYERIGUE', mothername = 'OSSIELETIAN Уаттара',
Где farmerctscode = '1050669'

я получаю вывод в sql 2 строки затронуты

в таблице tbl_farmerregistration_ivorycoast вставлены две строки для этого farmerctscode = '1050669'

farmerseason dateofjoinseco governmentcode имя фамилия отчество пол dateofbirth birthlocation отчество mothername
2019 2012 402787J KITCHINDJOUHOU OUATTARA мужчина 17/5/1981 Ferek Ras Osel
2019 2012 402787J KITCHINDJOUHOU OUATTARA мужчина 17/5/1981 Ferek Ras Osel
как исправить эту проблему.

пожалуйста, дайте мне знать.

как исправить эту ошибку

Richard Deeming

Вы говорите SQL обновить строки, соответствующие определенному условию.
У вас есть две строки в таблице, соответствующие этому условию.
SQL обновляет две строки.

Это не ошибка. То есть SQL делает именно то, что вы ему сказали.

Единственная ошибка-это уязвимость SQL-инъекции, которую вы ввели, как уже упоминалось в решении 2.

2 Ответов

Рейтинг:
2

Dave Kreskowiak

Это довольно просто. У вас было две строки в таблице, которые соответствовали предложению WHERE в вашем операторе UPDATE.

"farmerctscode", по-видимому, не имеет уникального ограничения на него, а также не является столбцом идентификаторов для записей в таблице.

Каждая запись в таблице должна иметь уникальное значение, идентифицирующее каждую строку в таблице, так что любая операция, выполняемая с предложением WHERE, указывающим это значение идентификатора, изменит только эту одну запись.


Рейтинг:
1

Patrice T

Цитата:
При обновлении двух строк, затронутых в таблице SQL server

Можно догадаться, что 2 записи соответствуют этому условию.
-----
Ух ты, ты просто сводишь меня с ума !
Вы используете хранимую процедуру с параметрами, которые защищают вас от SQL-инъекции, только для того, чтобы построить запрос изнутри процедуры с конкатенацией строк, которая делает процедуру уязвимой для SQL-инъекции.
SET @sqlQuery = 'UPDATE dbo.tbl_farmerregistration_' + @originname + ' SET farmerseason = ''' + @farmerseason + ''', 
dateofjoinseco = ''' + @dateofjoinseco + ''', governmentcode =''' + @governmentcode + ''', firstname = ''' + @firstname + ''', 
lastname = ''' + @lastname + ''', surname = ''' + @surname + ''', gender = ''' + @gender + ''', dateofbirth = ''' + @dateofbirth + ''', 
birthlocation = ''' + @birthlocation + ''', fathername = ''' + @fathername + ''', mothername = ''' + @mothername + ''', 
village = ''' + @village + ''', currentyearcooperative = ''' + @currentyearcooperative + ''', 
phonenumber = ''' + @phonenumber + ''', observation = ''' + @observation +''', nooffarms = ''' + @nooffarms + ''', produtionestimation = ''' + @productionestimation + ''', 
otherdetails = ''' + @otherdetails + ''',previouscropsdetails = ''' + @previouscropsdetails + ''', 
updatedby = ''' + @updatedby + ''', updateddate = GETDATE() 
WHERE farmerctscode = ''' + @farmerctscode + '''' 

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


Richard Deeming

Технически хранимые процедуры не защищают вас от SQLi; это делают параметризованные запросы. Вполне возможно выдать текстовую команду с параметрами и быть безопасным; и также вполне возможно вызвать хранимую процедуру с конкатенацией строк и быть уязвимым.

Но, как вы уже сказали, в этом случае динамический SQL внутри хранимой процедуры делает все это спорным. Независимо от того, как вы вызываете хранимую процедуру, вы все равно уязвимы для SQLi.

Типичным решением было бы использовать процедуры sp_executesql[^], правильно передавая параметры.

Но в этом случае "динамический" SQL на самом деле статичен, поэтому было бы гораздо проще просто выполнить UPDATE запрос напрямую. :)