2009-06-21 9 views
1

mysql_query("SELECT important_data FROM users WHERE password = $password")のようなものよりもSQLインジェクションの影響を受けにくいですか?SQLストアドプロシージャは安全ですか?

+0

これはSQLインジェクションを脆弱にする古典的な方法です。つまり、SQLステートメントを作成してユーザーの入力を検証しないように(たとえば$ passwordのために)一緒につなぎます。 –

+1

これは、reyjavikviが言っていたことだと思います。データベースのストアドプロシージャを使用する方が、例のような構成のSQLクエリよりも安全です。 – cheduardo

答えて

5

あなたの行っているものよりも安全です。あなたのクエリは未処理のSQLをdbにポストしています。つまり、パラメータがSQLパラメータとして扱われるのではなく、古いSQLと同じように扱われます。

ここが私の言いたいことです。

ストアドプロシージャでは、パスワード変数はSQLにすることはできません。システムが探している情報の一部でなければなりません。 .....そう誰かがSELECT

ような何かを行うことができます - あなたの例では、実際にパスワード=($パスワード変数「ここであなたのパスワード」)がユーザからデシベルである

SELECT *に送られているもの* FROM user WHERE Password =( 'あなたのパスワードはここ'; SELECT * FROM User - $ password変数)。まだ

か悪いか:ユーザから

SELECT * WHEREパスワード=( 'ここにあなたのパスワード'; DROPのデータベースdatabase_name - $パスワード変数)。

入力パラメータが余分なSQLとして実行されないため、非動的SQLストアドプロシージャはこれを許可しません。

パラメータ化されたSQLはこれを処理しますが、テーブル内の情報にアクセスするユーザーには読み取りアクセスが必要ないため、技術的にストアドプロシージャはまだ少し安全です。ストアドプロシージャを実行できるだけで済みます。あなたの必要性に応じて、これは場に出るかもしれません。

+0

基本的に、ストアド・プロシージャを使用すると、すべての入力値が実行不可能になりますが、生SQLではデータをコードとして解釈できます。とった。 – Green

+0

ほとんどの場合、パラメータ化されたsqlを使用して同じ利点を得ることができ、動的コードを実行するストアドプロシージャを書くことができるので、得られるセキュリティを元に戻すことができます。 – kemiller2002

0

安全な技術はありません。テクノロジーは安全な方法でのみ使用できます。

しかし、ストアドプロシージャでは、SQLインジェクションを可能にするために、わずかにクリエイティブなコーディングが必要です。何も私が認識している任意のSQLデータベースエンジンで文字列を連結することを妨げません。

4

必ずしもそうではありませんが、内部で文字列連結を行うことができ、エクスポージャーは同じになります。動的SQLをパラメータ変数(SQLを生成する文字列連結なし)と一緒に使用すると、かなり保護されます。

+0

+1 - また、パラメータ化されたクエリの実行計画はキャッシュされているので、より迅速です。 – karim79

+0

@karim:ストアドプロシージャプランもキャッシュされています。パフォーマンスはSPとパラメータ化されたクエリの間ではもう問題にはなりません。 –

0

彼らが正しくパラメータ化されていると、あなたは彼らがより安全です、動的SQLをしていないと、あなたも限り、あなたはパラメータを使用してUSER-のための文字列の連結を使用していないとして、実行計画の再利用から

+0

自分のprocsまたは動的SQLにビジネスロジックを持たないITショップがいくつあるか教えてください。すべてのお店は、それを認めるかどうかは関係ありません。そのため、ストアドプロシージャのこの引数は決して保持されません。 – PositiveGuy

2

の利益になる場合SQLインジェクションのリスクはありません。ストアドプロシージャは、パラメータを使用することを推奨するため、この側面では少し「安全」です。しかし、手順の中であなたが何かをする場合

EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password 

その後、あなたはSQLインジェクションに非常に脆弱です。

また、ストアドプロシージャではなくパラメータも使用できる「prepared statements」などがあります。したがって、SQLインジェクションを回避するために使用できます。

関連する問題