mysql_query("SELECT important_data FROM users WHERE password = $password")
のようなものよりもSQLインジェクションの影響を受けにくいですか?SQLストアドプロシージャは安全ですか?
答えて
あなたの行っているものよりも安全です。あなたのクエリは未処理のSQLをdbにポストしています。つまり、パラメータがSQLパラメータとして扱われるのではなく、古いSQLと同じように扱われます。
ここが私の言いたいことです。
ストアドプロシージャでは、パスワード変数はSQLにすることはできません。システムが探している情報の一部でなければなりません。 .....そう誰かがSELECT
ような何かを行うことができます - あなたの例では、実際にパスワード=($パスワード変数「ここであなたのパスワード」)がユーザからデシベルである
SELECT *に送られているもの* FROM user WHERE Password =( 'あなたのパスワードはここ'; SELECT * FROM User - $ password変数)。まだ
か悪いか:ユーザから
SELECT * WHEREパスワード=( 'ここにあなたのパスワード'; DROPのデータベースdatabase_name - $パスワード変数)。
入力パラメータが余分なSQLとして実行されないため、非動的SQLストアドプロシージャはこれを許可しません。
パラメータ化されたSQLはこれを処理しますが、テーブル内の情報にアクセスするユーザーには読み取りアクセスが必要ないため、技術的にストアドプロシージャはまだ少し安全です。ストアドプロシージャを実行できるだけで済みます。あなたの必要性に応じて、これは場に出るかもしれません。
基本的に、ストアド・プロシージャを使用すると、すべての入力値が実行不可能になりますが、生SQLではデータをコードとして解釈できます。とった。 – Green
ほとんどの場合、パラメータ化されたsqlを使用して同じ利点を得ることができ、動的コードを実行するストアドプロシージャを書くことができるので、得られるセキュリティを元に戻すことができます。 – kemiller2002
安全な技術はありません。テクノロジーは安全な方法でのみ使用できます。
しかし、ストアドプロシージャでは、SQLインジェクションを可能にするために、わずかにクリエイティブなコーディングが必要です。何も私が認識している任意のSQLデータベースエンジンで文字列を連結することを妨げません。
必ずしもそうではありませんが、内部で文字列連結を行うことができ、エクスポージャーは同じになります。動的SQLをパラメータ変数(SQLを生成する文字列連結なし)と一緒に使用すると、かなり保護されます。
+1 - また、パラメータ化されたクエリの実行計画はキャッシュされているので、より迅速です。 – karim79
@karim:ストアドプロシージャプランもキャッシュされています。パフォーマンスはSPとパラメータ化されたクエリの間ではもう問題にはなりません。 –
彼らが正しくパラメータ化されていると、あなたは彼らがより安全です、動的SQLをしていないと、あなたも限り、あなたはパラメータを使用してUSER-のための文字列の連結を使用していないとして、実行計画の再利用から
自分のprocsまたは動的SQLにビジネスロジックを持たないITショップがいくつあるか教えてください。すべてのお店は、それを認めるかどうかは関係ありません。そのため、ストアドプロシージャのこの引数は決して保持されません。 – PositiveGuy
の利益になる場合SQLインジェクションのリスクはありません。ストアドプロシージャは、パラメータを使用することを推奨するため、この側面では少し「安全」です。しかし、手順の中であなたが何かをする場合
EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password
その後、あなたはSQLインジェクションに非常に脆弱です。
また、ストアドプロシージャではなくパラメータも使用できる「prepared statements」などがあります。したがって、SQLインジェクションを回避するために使用できます。
- 1. SQLインジェクションからSQL Serverストアドプロシージャを安全にする
- 2. ブーストメッセージキューのスレッドは安全でプロセスは安全ですか?
- 3. SQL Server:ストアドプロシージャ全体のロックテーブル
- 4. 安全で安全なセッション名とは何ですか?
- 5. .net viewstateはSQLインジェクションから安全ですか?
- 6. これはSQLインジェクションから安全ですか?
- 7. "User.Identity.Name"は安全ですか?
- 8. PhoneGapは安全ですか?
- 9. req.refererは安全ですか?
- 10. Context.MODE_PRIVATEは安全ですか?
- 11. フォームは安全ですか?
- 12. SecureStringは安全ですか?
- 13. window.screenは安全ですか?
- 14. signed_requestは安全ですか?
- 15. Locale.setDefault()は安全ですか?
- 16. Flex:removeEventListenerは安全ですか?
- 17. HttpUtility.HtmlEncodeは安全ですか?
- 18. JDBCは安全ですか?
- 19. NetworkStreamは安全ですか?
- 20. StrToInt()は安全ですか?
- 21. カピストラーノは安全ですか?
- 22. Reduxは安全ですか?
- 23. pthread_cond_waitは完全に安全ですか?
- 24. SQLインジェクションでNamedParameterJdbcTemplateまたはSimpleJdbcTemplateの方が安全ですか?
- 25. SQLをpublic gitリポジトリにアップロードするのは安全ですか?
- 26. AJAXの準備はSQLステートメントから安全です。
- 27. このSQLコードは並行して安全ですか?
- 28. SQLインジェクション:このラインは安全ですか?
- 29. このGETはSQLインジェクションに安全ですか?
- 30. SQLで安全にカウント(フィールド)を更新
これはSQLインジェクションを脆弱にする古典的な方法です。つまり、SQLステートメントを作成してユーザーの入力を検証しないように(たとえば$ passwordのために)一緒につなぎます。 –
これは、reyjavikviが言っていたことだと思います。データベースのストアドプロシージャを使用する方が、例のような構成のSQLクエリよりも安全です。 – cheduardo