潜在的なセキュリティの脅威
彼らは基本的にあなたのシステムを攻撃することができる人々の2つのグループです
- ハッカー–不正なデータにアクセスしたり、アプリケーションを妨害したりすることを目的としています
- ユーザー– WebサイトまたはWebアプリケーションに悪影響を与える可能性のあるフォームに、無邪気に間違ったパラメーターを入力する可能性があります。
以下は、注意が必要な攻撃の種類です。
SQLインジェクション –このタイプの攻撃は、有害なコードをに追加します SQL ステートメント。
これは、ユーザー入力フォームまたは変数を使用するURLのいずれかを使用して行われます。
追加されたコードは、SQLステートメントのWHERE句の条件をコメント化します。 追加されたコードは次のこともできます。
- 常に真になる条件を挿入します
- テーブルからデータを削除する
- テーブルのデータを更新する
- このタイプの攻撃は通常、アプリケーションへの不正アクセスを取得するために使用されます。
クロスサイトスクリプティング– このタイプの攻撃は、通常JavaScriptの有害なコードを挿入します。 これは、お問い合わせフォームやコメントフォームなどのユーザー入力フォームを使用して行われます。 これはに行われます。
- Cookieデータなどの機密情報を取得する
- ユーザーを別のURLにリダイレクトします。
- その他の脅威には、PHPコードインジェクション、シェルインジェクション、電子メールインジェクション、スクリプトソースコード開示などがあります。
PHPアプリケーションセキュリティのベストプラクティス
ここで、アプリケーションを開発するときに考慮しなければならないPHPセキュリティのベストプラクティスのいくつかを見てみましょう。
PHPのstrip_tags
strip_tags関数はHTMLを削除し、 JavaScript または文字列からのPHPタグ。
この関数は、クロスサイトスクリプティングなどの攻撃からアプリケーションを保護する必要がある場合に役立ちます。
ユーザーからのコメントを受け入れるアプリケーションを考えてみましょう。
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
phptutsフォルダーにcomments.phpを保存したと仮定して、URLを参照します http://localhost/phptuts/comments.php
ユーザー入力
<?php $user_input = "<script>alert('Your site sucks!');</script>"; echo strip_tags($user_input); ?>
URLを参照します http://localhost/phptuts/comments.php
PHPfilter_var関数
filter_var関数は、データの検証とサニタイズに使用されます。
検証では、データが正しいタイプであるかどうかがチェックされます。 文字列の数値検証チェックは、誤った結果を返します。
サニタイズとは、文字列から不正な文字を削除することです。
完全なリファレンスについては、このリンクを確認してください filter_var
コードはコメントシステム用です。
filter_var関数とFILTER_SANITIZE_STRIPPED定数を使用して、タグを削除します。
<?php $user_input = "<script>alert('Your site sucks!');</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
出力:
alert('Your site sucks!');
mysqli_real_escape_string関数この関数は、SQLインジェクションからアプリケーションを保護するために使用されます。
ユーザーIDとパスワードを検証するための次のSQLステートメントがあるとします。
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
悪意のあるユーザーは、ユーザーIDテキストボックスに次のコードを入力できます。 'OR 1 = 1-そしてパスワードテキストボックスの1234認証モジュールをコーディングしましょう
<?php $uid = "' OR 1 = 1 -- "; $pwd = "1234"; $sql = "SELECT uid,pwd,role FROM users WHERE uid = '$uid' AND password = '$pwd';"; echo $sql; ?>
最終結果は
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
ここに、
- 「SELECT * FROM users WHERE user_id = ''」は、空のユーザーIDをテストします
- 「 'OR1 = 1」は、常に真になる条件です。
- 「-」は、パスワードをテストする部分にコメントします。
上記のクエリはすべてのユーザーを返します。次に、mysqli_real_escape_string関数を使用してログインモジュールを保護しましょう。
<?php $uid = mysqli_real_escape_string("' OR 1 = 1 -- "); $pwd = mysqli_real_escape_string("1234"); $sql = "SELECT uid,pwd,role FROM users WHERE uid = '$uid' AND password = '$pwd';"; echo $sql; ?>
上記のコードは出力されます
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
注意 2番目の一重引用符はエスケープされており、ユーザーIDの一部として扱われ、パスワードはコメントされません。
PHPMd5およびPHPsha1
Md5はMessageDigest 5の頭字語であり、sha1はSecure Hash Algorithm1の頭字語です。
どちらも文字列の暗号化に使用されます。
文字列が暗号化されると、それを復号化するのは面倒です。
Md5とsha1は、データベースにパスワードを保存するときに非常に便利です。
以下のコードは、md5とsha1の実装を示しています。
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
ファイルhashes.phpをphptutsフォルダーに保存したと仮定して、URLを参照します。
上記のハッシュからわかるように、攻撃者がデータベースにアクセスした場合でも、攻撃者はログインするためのパスワードを知りません。
概要
- セキュリティとは、偶発的および悪意のある攻撃からアプリケーションを保護するために実施される対策を指します。
- strip_tags関数は、入力データから