Динамический sql - это хороший подход? - PullRequest
0 голосов
/ 06 марта 2012

У меня есть таблица, в которой есть столбец с именем категории. Тип столбца имеет значения типа «6,7,9,22,44». Я хотел бы знать, является ли этот подход эффективным для SQL Server 2005 или 2008. Я в основном передаю значение «6,7,9,22,44» хранимой процедуре. Я открыты ссылки / предложения для лучшего подхода.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ Примечание: я должен уточнить, что я поддерживаю приложение, написанное кем-то другим, и столбец категории уже имеет значения, разделенные запятыми. Я бы поместил данные в отдельную таблицу, но я не смогу сделать это в краткосрочной перспективе. Что касается SQL-инъекций - столбец заполняется значениями, отмеченными в списке флажков. Пользователи не могут вводить или вводить какие-либо данные, которые могут повлиять на этот конкретный сохраненный процесс. Возможно ли внедрение SQL по этому сценарию? Пожалуйста, объясните, как. Благодарю. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~ * * 1003

CREATE PROCEDURE [dbo].[GetCategories]
    -- Add the parameter that contain the string that is passed in
    @catstring varchar(300)
AS
DECLARE @SQLQuery nvarchar(500); 
BEGIN

    /* Build Transact-SQL String with parameter value */
    SET @SQLQuery = 'select id,category from categoryTable where id in ('+ @catstring +')' 
    /* Execute Transact-SQL String */
    EXECUTE(@SQLQuery)
END
GO

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Это очень плохая идея, потому что она оставляет вашу систему открытой для SQL-инъекций.Злонамеренный пользователь может передать строку типа "') DROP TABLE categoryTable -" (обратите внимание на одинарную кавычку в начале строки) или что-то еще хуже.

Существует множество способовЗащитите себя от SQL-инъекций, и есть множество ресурсов.Я бы посоветовал вам исследовать его самостоятельно, поскольку это слишком большая область, чтобы охватить его одним вопросом.

Но для вашей конкретной проблемы я бы предложил этому веб-сайту научиться создавать табличный параметр для передачи.в списке целочисленных идентификаторов: http://www.sommarskog.se/arrays-in-sql-2008.html

Это действительно только для SQL Server 2008, при необходимости вы можете перейти по ссылкам в этой статье, чтобы найти решения для SQL Server 2005.

0 голосов
/ 06 марта 2012

Как сказал Джек, это создает возможность SQL-инъекции .Sommarskog отлично смотрит на различные способы решения этой проблемы: Проклятие и благословение динамического SQL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...