Как я защищаю эту функцию от Внедрения SQL?

Примечание C#

class _{static void Main(){Main();}}

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

Для таланта, я сделал имя класса столь небольшим, как я мог.

10
задан Jon Seigel 4 March 2010 в 18:44
поделиться

10 ответов

Самая распространенная рекомендация для борьбы с SQL-инъекцией - использовать параметр запроса SQL (это предлагали несколько человек в этой ветке).

В данном случае это неправильный ответ. Вы не можете использовать параметр запроса SQL для имени таблицы в операторе DDL.

Параметры запроса SQL могут использоваться только вместо буквального значения в выражении SQL. Это стандартно для каждой реализации SQL.

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

Вы можете получить список допустимых имен таблиц из INFORMATION_SCHEMA :

SELECT table_name 
FROM INFORMATION_SCHEMA.Tables 
WHERE table_type = 'BASE TABLE'
  AND table_name = @tableName

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

Вы также можете проверить имя таблицы по списку конкретных таблиц, которые вы определяете как допустимые для усечения вашего приложения, как @John Бьюкенен предлагает .

Даже после проверки того, что tableName существует как имя таблицы в вашей СУБД, я бы также предложил разделить имя таблицы, на всякий случай, если вы используете имена таблиц с пробелами или специальные символы. В Microsoft SQL Server разделителями идентификаторов по умолчанию являются квадратные скобки:

string sqlStatement = string.Format("TRUNCATE TABLE [{0}]", tableName);

Теперь вы

23
ответ дан 3 December 2019 в 14:34
поделиться

Насколько мне известно, вы не можете использовать параметризованные запросы для выполнения операторов DDL / указания имен таблиц, по крайней мере, не в Oracle или Sql Server. Что бы я сделал, если бы у меня была сумасшедшая функция TruncateTable, которая должна быть защищена от внедрения sql, - это создать хранимую процедуру, которая проверяет, является ли ввод таблицей, которую можно безопасно усечь.


-- Sql Server specific!
CREATE TABLE TruncableTables (TableName varchar(50))
Insert into TruncableTables values ('MyTable')

go

CREATE PROCEDURE MyTrunc @tableName varchar(50)
AS
BEGIN

declare @IsValidTable int
declare @SqlString nvarchar(50)
select @IsValidTable = Count(*) from TruncableTables where TableName = @tableName

if @IsValidTable > 0
begin
 select @SqlString = 'truncate table ' + @tableName
 EXECUTE sp_executesql @SqlString
end
END
6
ответ дан 3 December 2019 в 14:34
поделиться

Используйте хранимую процедуру. Любая приличная библиотека db (я использую библиотеку MS Enterprise) будет правильно обрабатывать экранирующие строковые параметры.

Кроме того, re: параметризованные запросы: я предпочитаю НЕ повторять развертывание моего приложения, чтобы исправить проблему с базой данных. Хранение запросов в виде буквенных строк в исходном коде увеличивает сложность обслуживания.

2
ответ дан 3 December 2019 в 14:34
поделиться

Взгляните на эту ссылку

Предотвращает ли этот код внедрение SQL?

Удалите ненужное из строки tableName.

Я не думаю, что вы можете использовать запрос параметров для имя таблицы.

1
ответ дан 3 December 2019 в 14:34
поделиться

Использовать параметризованные запросы.

0
ответ дан 3 December 2019 в 14:34
поделиться

На самом деле вы можете использовать прерывание ROM BIOS 1Ah с функцией 00h, 'Read Current Clock Count'. Или вы можете читать dword по адресу $ 40: $ 6C, но вы должны обеспечить атомарное чтение. Он увеличивается в MS-DOS примерно с частотой 18,2 Гц.

Для получения дополнительной информации прочтите: Если вы разрешаете какой-то внешний объект (конечный пользователь, другая система, что?) чтобы назвать таблицу, которую нужно удалить, почему бы вам просто не дать им права администратора.

Если вы создаете и удаляете таблицы, чтобы обеспечить некоторые функции для конечного пользователя, не позволяйте им напрямую указывать имена для объектов базы данных. Помимо SQL-инъекции, у вас будут проблемы с конфликтами имен и т. Д. Вместо этого самостоятельно сгенерируйте настоящие имена таблиц (например, DYNTABLE_00001, DYNTABLE_00002, ...) и сохраните таблицу, которая связывает их с именами, предоставленными пользователем.


Некоторые примечания по генерации динамического SQL для операций DDL:

  • В большинстве СУБД- s вам придется использовать динамический SQL и вставлять имена таблиц как текст. Будьте особенно осторожны.

  • Используйте заключенные в кавычки идентификаторы ([] в MS SQL Server, "" во всех СУРБД, совместимых с ANSI). Это поможет избежать ошибок, вызванных недопустимыми именами.

  • Сделайте это в хранимых процедурах и проверьте, все ли объекты, на которые есть ссылки, действительны.

  • Не делайте ничего необратимого. Например, не отбрасывать таблицы автоматически. Вы можете пометить их для удаления и отправить своему администратору баз данных по электронной почте. Она сбросит их после резервного копирования.

  • Избегайте этого, если можете. Если вы не можете, сделайте все возможное, чтобы свести к минимуму права других (нединамические) таблицы, которые будут иметь обычные пользователи.

0
ответ дан 3 December 2019 в 14:34
поделиться

Есть еще несколько сообщений, которые помогут с SQL-инъекцией, поэтому я буду их поддерживать, но еще одна вещь, которую следует учитывать, - это то, как вы будете обрабатывать разрешения для этого. Если вы предоставляете пользователям роли db + owner или db_ddladmin, чтобы они могли усекать таблицы, просто избежать стандартных атак SQL-инъекций недостаточно. Хакер может отправить другие имена таблиц, которые могут быть действительными, но которые вам не нужно усекать.

Если вы даете разрешение ALTER TABLE пользователям в определенных таблицах, которые вы разрешаете усекать, то вы находитесь в немного лучшей форме, но это все равно больше, чем я хотел бы допускать в обычной среде.

Обычно TRUNCATE TABLE не используется при обычном повседневном использовании приложения. Он используется для сценариев ETL или во время обслуживания базы данных. Единственная ситуация, когда я мог бы представить, что это будет использоваться во фронтальном приложении, будет, если вы позволите пользователям загружать таблицу, специфичную для этого пользователя, для целей загрузки, но даже в этом случае я, вероятно, использовал бы другое решение.

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

Если вы предоставляете пользователям права ALTER TABLE для определенных таблиц, которые вы разрешите усекать, тогда вы будете в немного лучшей форме, но это все равно больше, чем я хотел бы допускать в нормальной среде.

Обычно TRUNCATE TABLE не Не используется в повседневном использовании. Он используется для сценариев ETL или во время обслуживания базы данных. Единственная ситуация, когда я мог бы представить, что это будет использоваться во фронтальном приложении, будет, если вы позволите пользователям загружать таблицу, специфичную для этого пользователя, для целей загрузки, но даже тогда я, вероятно, использовал бы другое решение.

Конечно, не зная специфики того, почему вы его используете, я не могу категорически сказать, что вам следует изменить дизайн, но если бы я получил запрос на это как администратор базы данных, я бы задал разработчику много вопросов.

Если вы предоставляете пользователям права ALTER TABLE для определенных таблиц, которые вы разрешите усекать, тогда вы будете в немного лучшей форме, но это все равно больше, чем я хотел бы допускать в нормальной среде.

Обычно TRUNCATE TABLE не Не используется в повседневном использовании. Он используется для сценариев ETL или во время обслуживания базы данных. Единственная ситуация, когда я мог бы представить, что это будет использоваться во фронтальном приложении, будет, если вы позволите пользователям загружать таблицу, специфичную для этого пользователя, для целей загрузки, но даже тогда я, вероятно, использовал бы другое решение.

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

re в немного лучшей форме, но это все же больше, чем мне хотелось бы допускать в обычной среде.

Обычно TRUNCATE TABLE не используется при обычном повседневном использовании приложения. Он используется для сценариев ETL или во время обслуживания базы данных. Единственная ситуация, в которой я могу представить, что это будет использоваться во фронтальном приложении, - это если вы позволите пользователям загружать таблицу, специфичную для этого пользователя, для целей загрузки, но даже в этом случае я, вероятно, использовал бы другое решение.

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

re в немного лучшей форме, но это все же больше, чем мне хотелось бы допускать в обычной среде.

Обычно TRUNCATE TABLE не используется при обычном повседневном использовании приложения. Он используется для сценариев ETL или во время обслуживания базы данных. Единственная ситуация, когда я мог бы представить, что это будет использоваться во фронтальном приложении, будет, если вы позволите пользователям загружать таблицу, специфичную для этого пользователя, для целей загрузки, но даже в этом случае я, вероятно, использовал бы другое решение.

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

t используется в повседневной работе. Он используется для сценариев ETL или во время обслуживания базы данных. Единственная ситуация, в которой я могу представить, что это будет использоваться во фронтальном приложении, - это если вы позволите пользователям загружать таблицу, специфичную для этого пользователя, для целей загрузки, но даже в этом случае я, вероятно, использовал бы другое решение.

Конечно, не зная специфики того, почему вы его используете, я не могу категорически сказать, что вам следует изменить дизайн, но если бы я получил запрос на это как администратор базы данных, я бы задал разработчику много вопросов.

t используется в повседневной работе. Он используется для сценариев ETL или во время обслуживания базы данных. Единственная ситуация, когда я мог бы представить, что это будет использоваться во фронтальном приложении, будет, если вы позволите пользователям загружать таблицу, специфичную для этого пользователя, для целей загрузки, но даже в этом случае я, вероятно, использовал бы другое решение.

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

1
ответ дан 3 December 2019 в 14:34
поделиться

Вы можете использовать SQLParameter для передачи значения tableName. Насколько я знаю и протестировал, SQLParameter берет на себя всю проверку параметров и, таким образом, отключает возможность внедрения.

-2
ответ дан 3 December 2019 в 14:34
поделиться

Если вы не можете использовать параметризованные запросы (а вам следует это сделать) ... простая замена всех экземпляров 'на' 'должна работать.

string sqlStatement = string.Format("TRUNCATE TABLE {0}", tableName.Replace("'", "''")); 
-4
ответ дан 3 December 2019 в 14:34
поделиться

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

Лучшим вариантом было бы запустите эту команду через собственное безопасное соединение и не дайте ей вообще никаких прав SELECT. Все, что нужно TRUNCATE для запуска, - это разрешение ALTER TABLE. Если вы используете SQL 2005 и выше, вы также можете попробовать использовать хранимую процедуру с EXECUTE AS внутри.

3
ответ дан 3 December 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: