Webの脆弱性の最大のクラスの1つは、「SQLインジェクション」またはSQLiとして知られています。 構造化クエリ言語、別名SQLは、 大多数のデータベースと対話するために使用される言語。ただし、データベースによっては、言語のさまざまなバリエーションが使用されます。 プラットホーム。 アカウント情報などのユーザーデータを保存するWebサイト、または画像ホスティングWebサイトなどのユーザーアップロード機能を提供するWebサイトは、データベースを使用してそのデータを保存します。
ヒント:SQLは通常、「ess cue ell」または「sequel」と発音されます。最初のオプションはイギリス英語でより一般的であり、2番目のオプションはアメリカ英語でより一般的です。 どちらの発音も、データベースについて話すという文脈で一般的に理解されています。
SQLiとは何ですか?
SQLiは、の間で通信するコードを設計するWeb開発者が ウェブサーバーとデータベースは、によって送信されるSQLコマンドに対する保護を実装していません ユーザー。 問題は、データベースステートメントから脱出して、新しい引数またはまったく新しいステートメントを追加できる可能性があることです。 変更された、または2番目のデータベースステートメントは、大規模な削除やデータ漏洩の可能性を含むさまざまなアクションを実行できます。
エクスプロイトは通常、既存のステートメントをすべての状況で真にすること、またはすべてのデータの削除や表示などの特定のアクションを実行する2番目のバッチコマンドを提供することを中心に展開されます。 たとえば、WebサイトにログインするためのSQLステートメントは、送信されたユーザー名とパスワードがデータベースのエントリと一致するかどうかを確認する場合があります。 SQLインジェクションのエクスプロイトにアクセスしようとすると、「または1 = 1」などの「またはtrue」句を追加しようとする場合があります。 これにより、「パスワードが[this]の場合、またはthisステートメントがtrueの場合、[this] usernameでログインする」という行に沿ってコマンドが作成されます。
SQLiを防ぐ方法
SQLiは、Webサイトがデータベースを侵害し、オンラインでリークする非常に一般的な方法でした。 セキュリティ意識が開発者トレーニングの一部であることを保証するための協調的な取り組みにより、このクラスの脆弱性は大部分が解決され、もはやほとんど見られません。
SQLiを防ぐ正しい方法は、パラメータ化されたクエリとも呼ばれるプリペアドステートメントを使用することです。 従来、SQLステートメントは宣言されており、その宣言中にユーザー入力が連結されます。 プリペアドステートメントを使用すると、データベースコマンドが書き出され、sperate関数がコマンドを実行してユーザーデータを挿入します。 これは小さな違いのように見えるかもしれませんが、コマンドの処理方法を完全に変更します。 この違いにより、意味のあるSQLコマンドが実行されなくなり、すべてのユーザー入力が文字列として扱われるため、SQLインジェクションが発生しなくなります。