読み取り専用接続を使用してSQL Serverに接続するWeb APIがあり、APIの技術に精通したユーザーがクエリ文字列にSQLのwhere句を入力できるようにしたいと考えています。基本的には、selectステートメントに入力されたものをタックしたいだけです。
最小限の特権(1つのテーブルでのみ機能を選択)、データベースへの読み取り専用接続で、すべての注入攻撃を防ぐことができますか?
いいえSQLインジェクションとデータインジェクションを混同している可能性があります。読み取り専用テーブルはSQLインジェクションを妨げず、せいぜい少しだけその影響を制限します。
SQLインジェクションとは、単にSQLコードをインジェクトする機能を意味します。読み取り専用テーブルでは、dataをテーブルに挿入する機能が制限される場合がありますが、次の機能には影響しません。
もし、あんたが
基本的には、彼らが
select
ステートメントに入力したものをタックしたいだけです。
次に、攻撃者がこれらのいずれかを試すことを明示的に許可します。
今、あなたは確かにこれを制限するために何かをすることができます。引用符とSQLステートメントの区切り文字を禁止できます。 [A-Za-z0-9"=]
(またはデータベースと実質的に同等)ではない入力を拒否できます。しかし、このパスをたどり始めたら、アプリケーションを正しく記述したほうがよい:チェックするキーを提供する、よりリッチなクエリインターフェイスを公開します。次に、ユーザーが入力した値に対して適切な引用を実行します。
いいえ、些細な例
EXEC ('SELECT COUNT(*)
FROM table
WHERE UserName =''''' + @UserName + ''''' AND Password = '''''+@Password+'''''')
@Passwordをa' OR 1=1;--
に設定します
そして、あなたのパスワードはバイパスされます
最小限の特権(1つのテーブルでのみ機能を選択)、データベースへの読み取り専用接続で、すべての注入攻撃を防ぐことができますか?
SQLインジェクションは、攻撃者が既存のステートメントを変更して、意図しないアクションを引き起こす方法です。これらのアクションは、データベースでの変更またはシステムでのコード実行である可能性がありますが、必要のないデータを単に返すか、リソースを大量に消費する操作を実行することによりサービス不能を引き起こします。
クエリを特定のテーブルのみを選択するように制限すると、影響が制限される可能性がありますが、サービス拒否が発生する可能性があります。また、クエリの結果が使用される場所によっては、予期しない結果を返すことによってアプリケーションの動作を変更する場合があります。
どういたしまして。 SQLインジェクションの欠陥はSQLサーバーではなくWebアプリケーションレベルにあるため、WebアプリケーションがSQLインジェクションに影響を受けやすい場合は、データベースへのアクセスレベルに関係なく影響を受けます。
ただし、あなたが言及した最小特権の原則により、誰かがWebアプリケーションでSQLインジェクションを悪用しても、データベースコンテンツへの読み取りアクセス権しか取得できず、データベースコンテンツまたは構造を変更することはできません。 。