タグ付けされた質問 「sql-injection」

SQLインジェクションはコードインジェクション技術であり、データ駆動型アプリケーションを攻撃するために使用されます。悪意のあるSQLステートメントが入力フィールドに挿入されて実行されます(データベースの内容を攻撃者にダンプするなど)。

28
PHPでSQLインジェクションを防ぐにはどうすればよいですか?
この質問の答えはコミュニティの努力です。この投稿を改善するには、既存の回答を編集してください。現在、新しい回答や相互作用を受け入れていません。 OverаэтотвопросестьответынаStack Overflowнарусском:КакимобразомизбежатьSQL-инъекцийвPHP? ユーザー入力を変更せずにSQLクエリに挿入すると、次の例のように、アプリケーションがSQLインジェクションに対して脆弱になります。 $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')"); これは、ユーザーがのようなものを入力できvalue'); DROP TABLE table;--、クエリが次のようになるためです。 INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--') これを防ぐために何ができますか?



7
PDOの準備済みステートメントはSQLインジェクションを防ぐのに十分ですか?
私がこのようなコードを持っているとしましょう: $dbh = new PDO("blahblah"); $stmt = $dbh->prepare('SELECT * FROM users where username = :username'); $stmt->execute( array(':username' => $_REQUEST['username']) ); PDOドキュメントは言う: 準備済みステートメントのパラメーターは引用符で囲む必要はありません。ドライバーが処理します。 SQLインジェクションを回避するために本当に必要なことはそれだけですか?本当にそんなに簡単ですか? それが違いを生む場合、MySQLを想定できます。また、SQLインジェクションに対するプリペアドステートメントの使用についてのみ興味があります。このコンテキストでは、XSSやその他の考えられる脆弱性については気にしません。

4
mysql_real_escape_string()を回避するSQLインジェクション
mysql_real_escape_string()関数を使用してもSQLインジェクションの可能性はありますか? このサンプル状況を考えてみましょう。SQLはPHPで次のように構築されます。 $login = mysql_real_escape_string(GetFromPost('login')); $password = mysql_real_escape_string(GetFromPost('password')); $sql = "SELECT * FROM table WHERE login='$login' AND password='$password'"; そのようなコードは依然として危険であり、mysql_real_escape_string()関数を使用してもハッキングする可能性があると多くの人々が私に言うのを聞いたことがあります。しかし、私は可能性のある悪用を考えることができませんか? このような古典的な注射: aaa' OR 1=1 -- 動作しない。 上記のPHPコードを通過する可能性のあるインジェクションを知っていますか?

9
準備されたステートメントはSQLインジェクション攻撃からどのように保護できますか?
準備されたステートメントは、SQLインジェクション攻撃の防止にどのように役立ちますか? ウィキペディアは言う: 後で別のプロトコルを使用して送信されるパラメーター値を正しくエスケープする必要がないため、準備されたステートメントはSQLインジェクションに対して回復力があります。元のステートメントテンプレートが外部入力から派生していない場合、SQLインジェクションは発生しません。 その理由がよくわかりません。簡単な英語での簡単な説明といくつかの例は何でしょうか?

12
Java-SQLインジェクションを防止するエスケープ文字列
私はいくつかのアンチSQLインジェクションをJavaに配置しようとしていますが、「replaceAll」文字列関数を操作するのは非常に困難です。最終的に、既存の\to \\、any "to \"、any 'to \'、およびany \nを変換\\nして、文字列がMySQL SQLインジェクションによって評価されるときにブロックされるようにする関数が必要です。 使用していたコードをいくつかジャッキアップしました\\\\\\\\\\\が、関数内のすべてが目を凝らしています。誰かがこの例を偶然持っているなら、私はそれを大いに感謝します。

18
単一引用符をエスケープし、単一引用符でユーザー入力を囲むことで、SQLインジェクションから保護できますか?
ユーザー入力を含むクエリを作成する場合、パラメーター化されたSQLクエリがユーザー入力をサニタイズするための最適な方法であることを理解していますが、ユーザー入力を取得して一重引用符をエスケープし、文字列全体を一重引用符で囲むと何が問題になるのでしょうか。これがコードです: sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'" ユーザーが入力する一重引用符はすべて二重一重引用符に置き換えられます。これにより、ユーザーは文字列を終了できなくなります。そのため、セミコロンやパーセント記号など、ユーザーが入力する可能性のある他のすべてはすべて文字列の一部となり、コマンドの一部として実際には実行されません。 私たちはMicrosoft SQL Server 2000を使用しています。これは、単一引用符が唯一の文字列区切り文字であり、文字列区切り文字をエスケープする唯一の方法であると私は考えているため、ユーザーが入力するものを実行する方法はありません。 これに対してSQLインジェクション攻撃を仕掛ける方法は見当たらないが、もしこれが私のように弾丸であるとすれば、他の誰かがすでにそれを考えていて、それが一般的な慣行になるだろう。 このコードの何が問題になっていますか?このサニタイズ手法を超えてSQLインジェクション攻撃を取得する方法はありますか?この手法を利用するユーザー入力のサンプルは非常に役立ちます。 更新: このコードに対してSQLインジェクション攻撃を効果的に開始する方法はまだわかりません。一部の人々は、バックスラッシュが1つの単一引用符をエスケープし、もう1つを残して文字列を終了し、残りの文字列がSQLコマンドの一部として実行されるようにすることを提案しました。 MySQLデータベースですが、SQL Server 2000では、単一引用符をエスケープする唯一の方法(私が見つけたもの)は、別の単一引用符を使用することです。バックスラッシュはそれをしません。 また、単一引用符のエスケープを停止する方法がない限り、ユーザー入力の残りの部分はすべて1つの連続した文字列と見なされるため、実行されません。 入力をサニタイズするより良い方法があることを理解していますが、上記で提供した方法が機能しない理由を学ぶことに本当に興味があります。このサニタイズ方法に対するSQLインジェクション攻撃を実装する特定の方法を誰かが知っている場合は、ぜひご覧ください。


6
htmlspecialcharsとmysql_real_escape_stringはPHPコードをインジェクションから保護しますか?
本日、Webアプリでの入力検証戦略について質問がありました。 トップの答えは、執筆時点で、中に示唆するPHPだけで使用するhtmlspecialcharsとmysql_real_escape_string。 私の質問は、これは常に十分ですか?知っておくべきことがもっとありますか?これらの機能はどこで壊れますか?

7
SQLステートメントで常にパラメーターを使用することを好むのはなぜですか?
私はデータベースを扱うことに非常に慣れていません。今私は書くことができますSELECT、UPDATE、DELETE、およびINSERTコマンド。しかし、私は私たちが書くことを好む多くのフォーラムを見てきました: SELECT empSalary from employee where salary = @salary ...の代わりに: SELECT empSalary from employee where salary = txtSalary.Text なぜ常にパラメーターを使用することを好み、どのように使用するのですか? 最初の方法の使用方法と利点を知りたいと思いました。SQLインジェクションについてさえ聞いたことがありますが、完全には理解していません。SQLインジェクションが私の質問に関連しているかどうかもわかりません。

12
パラメータが文字列でない場合、SQLクエリをパラメータ化しないことは安全ですか?
SQLインジェクションに関しては、stringパラメーターをパラメーター化する必要性を完全に理解しています。それは本の中で最も古いトリックの1つです。しかし、いつパラメーター化しないことが正当化できるのSqlCommandでしょうか?パラメータ化しないで「安全」と見なされるデータ型はありますか? たとえば、私はSQLの専門家の近くにいるとは考えていませんが、SQLインジェクションに対して脆弱で、a boolまたはan を受け入れ、それをintクエリに直接連結する可能性があるとは考えられません。 私の仮定は正しいですか、それとも私のプログラムに大きなセキュリティの脆弱性を残す可能性がありますか? 明確にするために、この質問にはタグが付けられています c#これは強く型付けされた言語です。私が言うとき、「パラメータを、」のようなものだと思います public int Query(int id)。

21
パラメータなしでSQLインジェクションを回避する
ここで、コードでパラメーター化されたSQLクエリを使用することについて、別の議論が行われています。議論には2つの側面があります。私と、SQLインジェクションから常に保護するためにパラメーターを使用する必要があると言う他の人と、それが必要だと思わない他の人です。代わりに、SQLインジェクションを回避するために、すべての文字列で単一のアポストロフィを2つのアポストロフィに置き換えたいと考えています。私たちのデータベースはすべてSql Server 2005または2008を実行しており、コードベースは.NET Framework 2.0で実行されています。 C#で簡単な例を挙げましょう。 私はこれを使って欲しい: string sql = "SELECT * FROM Users WHERE Name=@name"; SqlCommand getUser = new SqlCommand(sql, connection); getUser.Parameters.AddWithValue("@name", userName); //... blabla - do something here, this is safe 他の人がこれをしたい間: string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name); SqlCommand getUser = new SqlCommand(sql, …

11
ドロップダウンを使用した場合、SQLインジェクションを防ぐ必要がありますか?
主にSQLインジェクションが発生する可能性があるため、フォームからのユーザー入力は絶対に信頼しないでください。 ただし、これはドロップダウンからの入力のみのフォームにも適用されますか(以下を参照)? 私は$_POST['size']、セッション全体を保存して、サイト全体で(mysqli選択クエリを使用して)さまざまなデータベースにクエリを実行します。SQLインジェクションを実行すると、データベースに悪影響が及ぶ可能性があります(ドロップされる可能性があります)。 入力されたユーザー入力でデータベースをクエリする領域はなく、ドロップダウンのみです。 <form action="welcome.php" method="post"> <select name="size"> <option value="All">Select Size</option> <option value="Large">Large</option> <option value="Medium">Medium</option> <option value="Small">Small</option> </select> <input type="submit"> </form>

9
パラメータは本当にSQLインジェクションを防ぐのに十分ですか?
私は同僚とここSOの両方に、SQLクエリ、特に.NETアプリケーションでパラメーターを使用することの良さについて説教してきました。私は、SQLインジェクション攻撃に対する耐性を与えることを彼らに約束することさえしました。 しかし、私はこれが本当に本当かどうか疑問に思い始めています。パラメータ化されたクエリに対して成功する既知のSQLインジェクション攻撃はありますか?たとえば、サーバーでバッファオーバーフローを引き起こす文字列を送信できますか? もちろん、Webアプリケーションが安全であることを保証するために行うべき他の考慮事項があります(ユーザー入力のサニタイズなど)が、今はSQLインジェクションについて考えています。MsSQL 2005および2008はプライマリデータベースであるため、特に攻撃に興味がありますが、すべてのデータベースが興味深いものです。 編集:パラメータとパラメータ化されたクエリの意味を明確にするため。パラメータを使用するということは、SQLクエリを文字列で作成する代わりに「変数」を使用することを意味します。 したがって、これを行う代わりに: SELECT * FROM Table WHERE Name = 'a name' 私たちはこれを行います: SELECT * FROM Table WHERE Name = @Name 次に、クエリ/コマンドオブジェクトの@Nameパラメータの値を設定します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.