SQLクエリからすべての '文字を削除する場合、データベースへのSQLインジェクション攻撃を行うための他の方法がありますか?'文字が削除されてもSQLを挿入する方法はありますか?
どうすればできますか?誰も私に例を与えることができますか?
SQLクエリからすべての '文字を削除する場合、データベースへのSQLインジェクション攻撃を行うための他の方法がありますか?'文字が削除されてもSQLを挿入する方法はありますか?
どうすればできますか?誰も私に例を与えることができますか?
はい、あります。 Wikipedia
"SELECT * FROM data WHERE id = " + a_variable + ";"
それは著者が「ID」フィールドに相関する数であるようにa_variable意図していること、この文から明らかであるから抜粋。しかし、実際には文字列であれば、エンドユーザは選択したとおりにその文を操作し、エスケープ文字の必要性を回避することができます。
SELECT * FROM DATA WHERE id=1;DROP TABLE users;
SQLインジェクションである:例えば、次のようにSQLがレンダリングされることになるので、データベースから "ユーザー" テーブルを削除(消去)します
1;DROP TABLE users
にa_variable設定ではない単純な攻撃と戦う。私はあなたのことをとても慎重に研究します。
はい、使用しているステートメントによって異なります。ストアドプロシージャを使用するか、少なくともパラメータ化されたクエリを使用して自分自身を保護するほうがよいでしょう。
防止サンプルについては、WikiPediaを参照してください。
もし私が1兆千億回もあなたを調整できるなら、私はそうするでしょう。パラメタライゼーションを提供するドライバ/ライブラリを書いていない限り、私はSQLインジェクションからの保護のために他の何かを考慮することも考えられません。 –
。 。 。
は多分、SQLのようなものかもしれ結果5; drop table employees; --
ように気にいらええとについて50000000他の方法: select * from somewhere where number = 5; drop table employees; -- and sadfsf
(--
コメントを開始します)
それは、あなたが一緒にクエリを置く方法によって異なります本質的にはいです。
あなたがこの(故意言語道断な例)を行うにした場合たとえば、Javaで:
String query = "SELECT name_ from Customer WHERE ID = " + request.getParameter("id");
を、あなたはインジェクション攻撃に自分自身を開放しているの良いチャンスがあります。
Javaには、PreparedStatements( "SELECT name_ from Customer WHERE ID =?"のような文字列を渡し、JDBCレイヤーがエスケープを処理するときに?トークンを置き換えるなど)しかし、他の言語ではそれほど役に立ちません。
はい、絶対に:あなたのSQLの方言などに応じて、アポストロフィを使用しない注入を実現する方法はたくさんあります。
SQLインジェクション攻撃に対する唯一の信頼できる防御は、データベースインターフェイスによって提供されるパラメータ化されたSQLステートメントサポートを使用することです。
アポストロフィは多分本物の入力であり、コード内でインラインSQLを使用しているときは、それらを倍増させてエスケープする必要があります。
\;.*--\
途中で本物の声明、オリジナルの本物のステートメントから末尾のSQLをコメントアウトするために二重ハイフンに続くいくつかの注入されたSQLを終了するために使用セミコロン:何あなたが探していることのような正規表現パターンです。攻撃でハイフンを省略することができます。
したがって、答えは:いいえ、単にアポストロフィを削除しても、SQLインジェクションの安全性は保証されません。
代わりに、どの文字を除外するかを判断するために、代わりにパラメータ化されたクエリを使用し、問題を完全に削除します。
はい、間違いなく可能です。
あなたは整数であなたの次のSELECT文を作るために期待するフォームを持っている場合は、あなたが似て何も入力できます。thingy
FROM
SELECT *をWHERE attributeID =
users
; (悪い、悪い、悪い...)次のWebサイトでは、さらに古典的なSQLインジェクション技術について説明しています。SQL Injection cheat sheet。
パラメータ化されたクエリまたはストアドプロシージャを使用することはそれほど優れていません。これらは渡されたパラメータを使用したあらかじめ作成されたクエリです。これは注入のソースにもなります。このページにも記載されています:Attacking Stored Procedures in SQL。
ここで、単純引用符を押せば、特定の一連の攻撃だけを防ぐことができます。しかし、それらのすべてではありません。
いつものように、外部からのデータは信用しないでください。明白なもの(ドロップダウン選択リストは、フリーテキストフィールドよりも優れている)
お気軽にWikiPediaに回答してください。
/VEY
「SQLでのストアドプロシージャの攻撃」記事をホストしているドメインの記事が無効になっているようです。 – Funka
Also-あなただけのアポストロフィを探しても、あなたはそれを削除する必要はありません。あなたはをエスケープしたいと思う。あなたは、すべてのアポストロフィを2つのアポストロフィで置き換えることでそれを行います。
しかし、パラメータ化されたクエリ/ストアドプロシージャは非常に優れています。
パラメータ化されたインラインSQLまたはパラメータ化ストアドプロシージャは、自分自身を保護する最善の方法です。他の人が指摘しているように、単引用符を取り除く/エスケープするだけでは不十分です。
「パラメータ化された」ストアドプロシージャについて特にお話しします。ストアドプロシージャを単に使用するだけでは、プロシージャの渡されたパラメータを連結して戻す場合でも、いずれかでは不十分です。言い換えれば、ストアドプロシージャ内にまったく同じ脆弱なSQL文をラッピングしても、それをより安全にすることはできません。インラインSQLの場合と同様に、ストアドプロシージャ内のパラメータを使用する必要があります。
私はほかの人の言葉を繰り返すことができます。パラメータ化されたSQLは道のりです。確かに、それをコーディングしているバットの痛みですが、一度それをしたら、そのコードをカットアンドペーストし、必要な修正を加えることは難しくありません。 Webサイト訪問者が検索基準の全範囲を指定できる多くの.Netアプリケーションがあります。コードはSQL Select文を即座に構築しますが、ユーザーが入力した可能性のあるものはすべてパラメータに入ります。
変数をパラメータとして渡し、独自のSQLを構築しないことをお勧めします。さもなければ、私たちが現在気付いていない方法で、SQLインジェクションを行う方法があります。あなたは「その中で私のような名前を持っている場合
' Not Tested
var sql = "SELECT * FROM data WHERE id = @id";
var cmd = new SqlCommand(sql, myConnection);
cmd.Parameters.AddWithValue("@id", request.getParameter("id"));
:
は、作成したコードは、その後のようなものです。すべての '文字が削除されたり、無効とマークされたりすることは非常に面倒です。
このStackoverflow question about SQL Injectionsをご覧になることもできます。
これは間違いなくベストプラクティスです –
数値パラメータが必要な場合は、数値を確認するために入力を常に検証する必要があります。注射から守るのを助ける以外に、妥当性検査のステップは、アプリをより使いやすくするでしょう。
id = 1044と予想されたときにid = "hello"を受け取った場合、データベースにエラーを返させるのではなく、有用なエラーをユーザーに返してください。
これは比較的古い質問なので、この回答のほとんどの側面は1つのポスターで言及されているので、私は完全で包括的な答えを書いていきたいと思います。
しかし、ここで誰も触れていない別の問題、つまりSQLの密輸を引き起こすことが必要だとわかります。特定の状況では、を削除しようとしても、クエリー文字に「」を混入することは可能です。実際には、適切なコマンド、パラメータ、ストアドプロシージャなどを使用しても、これは可能です。
http://www.comsecglobal.com/FrameWork/Upload/SQL_Smuggling.pdfの完全な調査レポートを参照してください(これは主な研究者でした)またはGoogleの「SQL Smuggling "
システムで複数のSQLクエリを一度に実行できる場合にのみ発生します。 PHPのmysql_queryはそうではありません。 – DisgruntledGoat