2016-04-23 3 views
0

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

Вот мой код:

CREATE FUNCTION get_password_for_user (p_username varchar(30)) 
    returns varchar(32) 
BEGIN 
    declare passwd varchar(32) default ""; 

    PREPARE stmt FROM 'select password into @passwd from users where name=?'; 
    SET @name = p_username; 
    EXECUTE stmt USING @name; 
    DEALLOCATE PREPARE stmt; 

    return passwd; 
END $$ 

Когда я пытаюсь создать его, он выдает ошибку Dynamic SQL:

Error Code: 1336. Dynamic SQL is not allowed in stored function or trigger

Я нашел решение, связанное с CONCAT в Интернете, но это означает быть уязвимым для SQL-инъекции, и я, очевидно, этого не хочу.

Есть ли что-то, что я могу сделать по этому поводу? Или существует какой-либо другой способ справиться с этой ситуацией?

+1

использовать фреймворк (который вызывает функцию), который обрабатывает инъекции. не используйте динамический sql для его обработки. –

ответ

1

Почему вы используете динамический sql?

CREATE FUNCTION get_password_for_user (p_username varchar(30)) 
    returns varchar(32) 
BEGIN 
    declare passwd varchar(32) default ''; 

    select passwd := u.password 
    from users u 
    where u.name = p_username; 

    return passwd; 
END $$ 
+0

Что делать, если p_username содержит инструкцию SQL-инъекции? – conectionist

+0

@conctist. , , Вы, кажется, смущены. Вы не можете вводить в нединамический SQL. 'p_username' будет рассматриваться как строка, независимо от каких-либо странных и странных символов в строке. –