Знатокам SQL

aleks058

SQL Serevr 2005.
Нужно программно создать логин.
Делаю хранимку с необходимыми параметрами.
В ней пытаюсь написать:
CREATE LOGIN @login WITH 
PASSWORD = @password,
DEFAULT_DATABASE = @database,
CHECK_EXPIRATION = OFF,
CHECK_POLICY = OFF

Получаю сообщение, что синтаксис выражения неверный.
Как выкрутиться?

6yrop

выкрутиться можно, например, так

CREATE PROCEDURE CreateLogin
@password NVARCHAR(50
@database NVARCHAR(50)
AS
BEGIN
EXEC ('
CREATE LOGIN @login WITH
PASSWORD = ''' + @password + ''',
DEFAULT_DATABASE = ''' + @database + ''',
CHECK_EXPIRATION = OFF,
CHECK_POLICY = OFF
')
END

aleks058

Что посоветуешь, чтобы бороться с SqlInjection в этом случае?

6yrop

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

aleks058

Не. Это лучше делать на сервере. Не хватало еще клиенту динамический SQL разрешать выполнять. Дырища в безопасности.
Я подумал и решил, что достаточно будет сделать в хранимке REPLACE на параметр и заменить каждую одиночную кавычку на двойную.
Это будет безопасно?
Параметры, например, в строке SQL не парсит?

evgen5555

Это лучше делать на сервере.
Ну если ты сам всё знаешь, то зачем спрашиваешь-то? Или трудно обработать в приложении строку перед подачей на сервер?
Дырища в безопасности.
Не в безопасности дырища совсем.

aleks058

Я хотел хранимку сделать и дать права на ее выполнение опреденной группе пользователей.
Перед подачей не трудно обработать, но я предпочитаю, чтобы сервер был устойчив к хаканью, а не клиент.
Клиента на крайняк можно и декомпилить, и подменить.
Так как насчет дабл-квотинга? Поможет?

Dasar

> Так как насчет дабл-квотинга? Поможет?
нет, конечно
надо еще, как минимум, спец. символы квотить

aleks058

Есть функция QUOTENAME. По описалову так и не понял, достаточно ли ее будет.
Может, кто пользовал и знает?
Вообще, проблема-то стандратная. Неужели никто?

evgen5555



Вообще, проблема-то стандратная.
Дичайший пиздёж.
Ни один вменяемый администратор не даёт прямого доступа в SQL заведомо ненадежным в плане инжекции лицам.

6yrop

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

aleks058

Поменьше эмоций!
Двухзвенка, че поделать...

6yrop


нет, конечно
надо еще, как минимум, спец. символы квотить

вроде не надо. Насколько я понял из BOL, строковые константы в MSSQL могу содержать любые символы
Character string constants
Character string constants are enclosed in single quotation marks and include alphanumeric characters (a-z, A-Z, and 0-9) and special characters, such as exclamation point (! at sign (@ and number sign (#). Character string constants are assigned the default collation of the current database, unless the COLLATE clause is used to specify a collation. Character strings typed by users are evaluated through the code page of the computer and are translated to the database default code page if necessary. For more information, see Collations.
...
If a character string enclosed in single quotation marks contains an embedded quotation mark, represent the embedded single quotation mark with two single quotation marks. This is not necessary in strings embedded in double quotation marks.

Т.е. достаточно заменить только апострофы.

aleks058

Благодарю!
Оставить комментарий
Имя или ник:
Комментарий: