ホームページ >バックエンド開発 >PHPチュートリアル >SQLインジェクションとは具体的に何ですか?
私は PHP を学んだばかりなのですが、PHP コードを書くときに SQL インジェクションに注意する文章を書いているのをよく見かけます。 SQL インジェクションとは正確には何ですか? データベースにいくつかの特殊なシンボルを書き込むだけで十分だと思われますが、質問があります。などの特殊な記号が書かれているので、セキュリティに脅威を与えることはありません
PHP 環境では、実際には SQL 攻撃はありません
SQL 攻撃と呼ばれる攻撃は、次の 2 つの側面から実行されます。
1. 実行された SQL 命令が何らかの手段で複数の命令に分割され、更新命令と削除命令が埋め込まれます。データベースに致命的な脅威をもたらすため
php が提供するデータベース関数では、一度に 1 つの命令しか実行できません (mysqi には 1 つの例外があります)。そのため、この点での脅威は存在しません
2. 何らかの手段を通じて、実行されるクエリ命令が変更されます 条件付きクエリは、「機密」情報を取得するための無条件クエリになります
php では、クエリ結果はプログラム コードを通じて表示される必要があるため、攻撃者は実際にはそれ以上のデータを見ることができません
SQL サーバーから発生する SQL 攻撃2000 HTML サービス: ブラウザのアドレス バーに sql コマンドを入力してデータベースを操作します。そして、結果を HTML ページの形式で表示します
これは非常に快適なサービスですが、悪意のある人がそれを利用した、いわゆる SQL 攻撃です
そのため、このサービスには現在、厳格なユーザー認証が装備されています。そして、それによりすべてのデータベース システムがリモート アクセスを制限し、データベースのアプリケーションが大幅に減少しました
つまり、これらの特殊文字がデータベースに配置されると、どのような害が生じる可能性がありますか?
特殊文字はそれほど多くありません
データベースには A: ' (一重引用符) しかありません
簡単な例
たとえば、ユーザーがログインするために入力したユーザー名とパスワードが正しいかどうかを確認したいとします。
$username = 'fdipzone';
$password = '123456';
$sql = "username='".$username."' およびpassword='".$password."'" のテーブルから * を選択します。
しかし、$password に次の文字を入力すると、チェックを回避できます。
$password = "abc" または '1'='1"
クエリ ステートメントは次のようになります
select * from table where username='fdipzone' およびpassword='abc' または '1'='1'
この方法ではいいえ問題 ユーザー名とパスワードとして入力されたものはすべて正常に通過できます。
アンチインジェクションとは、影響を与える一部の文字 (' など) をエスケープすることです。