2016-04-23 14 views
0

SQLインジェクションを避けながら、パラメータとして与えられたユーザー名のパスワードを取得する関数をMySQLで作成しようとしています。ここで安全にストアド関数を使用して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 $$ 

私はそれを作成しようとすると、それは動的SQLエラーを与える:私はウェブ上でCONCATを含むソリューションを見つけた

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

が、それは希望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注入文が含まれているとどうなりますか? @ copectionist。 – conectionist

+0

。 。あなたは混乱しているようです。非動的SQLにインジェクトすることはできません。 'p_username'は、文字列中の奇妙で奇妙な文字にかかわらず、文字列として扱われます。 –

関連する問題