PHP セキュリティ関数:strip_tags、filter_var、MD5、sha1

⚡ スマートサマリー

PHP Security は、データの検証、サニタイズ、安全な保存によって、Web アプリケーションを攻撃者や不注意な入力から保護します。このチュートリアルでは、主な脅威について説明した後、strip_tags、filter_var、esca を紹介します。pingまた、XSS、SQLインジェクション、および盗まれた認証情報から保護するために、password_hashを使用した最新のパスワードハッシュ化も提供します。

  • 🛡️ 脅威を把握する: 主なリスクは、SQLインジェクション、クロスサイトスクリプティング、コードインジェクションであり、通常はフォームや URL パラメーター。
  • 🧹 ストリップタグ: strip_tags は HTML を削除します。 Java入力からのスクリプトとPHPタグを削除することで、保存されたクロスサイトスクリプティングのリスクを低減します。
  • ✅ 入力を検証: filter_var はデータを検証およびサニタイズし、コードが値を信頼する前に、その値が期待される型であることを確認します。
  • 🔒 エスケープまたはバインド: mysqli_real_escape_string はクエリ入力をエスケープしますが、パラメータ化されたプリペアドステートメントは SQL インジェクションに対するより強力な防御策です。
  • 🔑 パスワードを正しくハッシュ化する: パスワードはMD5やSHA1で保存しないでください。低速でソルト付きのbcryptハッシュを適用するpassword_hashとpassword_verifyを使用してください。
  • 💡 多層防御: 検証、エスカレーションを組み合わせるping単一の制御に依存するのではなく、HTTPS、最小権限のデータベースアカウントを使用する。
  • 🤖 AIアシスト: AIツールはPHPコードのセキュリティ上の欠陥を監査し、SQLインジェクションやXSSの脆弱性を安全に修正するのに役立ちます。

PHPセキュリティ

潜在的なセキュリティ上の脅威

あなたのシステムを攻撃できる人物は、基本的に2つのグループに分けられます。

  • ハッカー – 不正なデータにアクセスしたり、アプリケーションを妨害したりすることを目的としています。
  • ユーザーは、意図せずフォームに誤ったパラメータを入力してしまう可能性があり、それがウェブサイトやウェブアプリケーションに悪影響を与える可能性があります。

注意する必要がある攻撃の種類は次のとおりです。

SQLインジェクション – このタイプの攻撃は、有害なコードを SQL ステートメント。

これは、ユーザー入力フォームまたは URL変数を使用するもの。

追加されたコードは、SQL文のWHERE句の条件をコメントアウトします。追加されたコードには、以下の機能もあります。

  • 常に真となる条件を挿入する
  • テーブルからデータを削除する
  • テーブル内のデータを更新する

このタイプの攻撃は通常、アプリケーションへの不正アクセスを取得するために使用されます。

クロスサイトスクリプティング(XSS) – この種の攻撃は、通常、有害なコードを挿入します。 Javaスクリプト。これは、お問い合わせフォームやコメントフォームなどのユーザー入力フォームを使用して行われます。これは次の目的で行われます。

  • 次のような機密情報を取得します。 クッキーデータ
  • ユーザーを別のページにリダイレクトする URL.

その他の脅威としては、PHPコードのインジェクション、シェルインジェクション、メールインジェクション、スクリプトのソースコード漏洩などが挙げられる。

PHP アプリケーションのセキュリティのベスト プラクティス

それでは、PHP を開発する際に考慮すべきセキュリティのベストプラクティスをいくつか見ていきましょう。ping 私たちのアプリケーション。

PHP ストリップタグ

strip_tags 関数は HTML を削除します。 Javaスクリプトまたは文字列からのPHPタグ。

この機能は、クロスサイトスクリプティングなどの攻撃からアプリケーションを保護する必要がある場合に役立ちます。

ユーザーからのコメントを受け付けるアプリケーションを考えてみましょう。

<?php
 
$user_input = "Your site rocks";
 
echo "<h4>My Commenting System</h4>";
 
echo $user_input;
 
?>

comments.php を phptuts フォルダに保存したと仮定して、 URL http://localhost/phptuts/comments.php

PHP ストリップタグ

ユーザーからの入力として、以下のような内容を受け取ったと仮定しましょう。 alert(‘Your site sucks!’);

<?php
 
$user_input = "<script>alert(0);</script>";
 
echo "<h4>My Commenting System</h4>";
 
echo $user_input;
 
?>

を参照 URL http://localhost/phptuts/comments.php

PHP ストリップタグ

それでは、strip_tags関数を使用して、このような攻撃からアプリケーションを保護しましょう。

<?php
 
$user_input = "<script>alert(0);</script>";
 
echo strip_tags($user_input);
 
?>

を参照 URL http://localhost/phptuts/comments.php

PHP ストリップタグ

PHPのfilter_var関数

filter_var 関数は、データの検証とサニタイズに使用されます。

検証では、データの型が正しいかどうかがチェックされます。 文字列の数値検証チェックでは、偽の結果が返されます。

サニタイズとは、不正な文字をファイルから削除することです。 string.

完全な参考資料については、こちらのリンクをご確認ください。 フィルター変数

以下のコードはコメントシステム用です。filter_var関数とFILTER_SANITIZE_STRIPPED定数を使用してタグを削除します。

<?php
 
$user_input = "<script>alert(0);</script>";
 
echo filter_var($user_input, FILTER_SANITIZE_STRIPPED);
 
?>

出力:

alert('Your site sucks!');

注意: FILTER_SANITIZE_STRIPPED(FILTER_SANITIZE_STRING の別名)は PHP 8.1 以降非推奨です。新しいコードでは strip_tags() を使用するか、安全な表示のために htmlspecialchars() を使用してください。

PHP mysqli_real_escape_string

mysqli_real_escape_string 関数は、SQLインジェクションからアプリケーションを保護するために使用されます。

ユーザーIDとパスワードを検証するための以下のSQL文があると仮定しましょう。

<?php
SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass';
?>

悪意のあるユーザーが侵入することができます ' OR 1 = 1 — ユーザーIDテキストボックスに「1234」と入力し、パスワードテキストボックスに「1234」と入力します。それでは、認証モジュールをコーディングしましょう。

<?php
 
$uid = "0$uid1$pwd';";
 
echo $sql;
 
?>

最終的な結果は以下のとおりです。

SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';

ここに、

  • 「WHERE uid = 」は、空のユーザーIDをテストします。
  • 「' OR 1 = 1」は常に真となる条件です。
  • 「–」はパスワードをテストする部分をコメントアウトします。

上記のクエリはすべてのユーザーを返します。次に、mysqli_real_escape_string 関数を使用してログインモジュールを保護しましょう。実際のコードでは、この関数はデータベース接続を最初の引数として受け取ることに注意してください。

<?php
 
$uid = mysqli_real_escape_string($conn, "0$uid1$pwd';";
 
echo $sql;
 
?>

上記のコードを実行すると、以下の出力が得られます。

SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';

注:2番目のシングルクォーテーションはエスケープされているため、ユーザーIDの一部として扱われ、パスワードはコメントアウトされません。

ベストプラクティス: エスカping も役立ちますが、mysqli や PDO のパラメータ化されたプリペアド ステートメントは、データがクエリ テキストに混入しないため、SQL インジェクションに対する推奨される防御策です。

PHP Md5 および PHP sha1

MD5はMessage Digest 5の略で、SHA1はSecure Hash Algorithm 1の略です。どちらも一方向ハッシュ関数です。

以下のコードは、md5とsha1の実装例を示しています。

<?php
echo "MD5 Hash: " . md5("password");
echo "SHA1 Hash: " . sha1("password");
?>

hashes.php ファイルを phptuts フォルダに保存したと仮定して、 URL.

PHP Md5 および PHP sha1

重要: MD5とSHA1は高速で塩なしハッシュであり、 パスワードを保存する場所としてはもはや安全とはみなされていないなぜなら、最新のハードウェアとレインボーテーブルを使えば簡単に解読できてしまうからです。セキュリティに関係のないチェックサムにのみ使用し、パスワードには以下の方法を使用してください。

PHPでパスワードを安全にハッシュ化する方法

パスワードの保存には、PHPにはpassword_hashとpassword_verifyという関数が用意されています。これらは、処理速度の遅いソルト付きアルゴリズム(デフォルトではbcrypt)を使用するため、たとえデータベースが盗まれたとしても、各ハッシュは一意であり、解読には多大なコストがかかります。

<?php
// Hash a password before storing it in the database
$hash = password_hash("mypassword", PASSWORD_DEFAULT);
 
// Verify the password when the user logs in
if (password_verify("mypassword", $hash)) {
    echo "Password is valid";
} else {
    echo "Invalid password";
}
?>
  • パスワードハッシュ() データベースに保存するためのソルト付きハッシュを生成します。PASSWORD_DEFAULT は、現在推奨されているアルゴリズムを維持します。
  • パスワード検証() ログイン試行を、保存されているハッシュ値と照合しますが、ハッシュ値を復号化することはありません。

ソルトとアルゴリズムはハッシュの中に保存されるため、それらを自分で管理する必要はなく、これがPHPでパスワードを扱うための正しく将来性のある方法となります。

よくあるご質問

mysqli または PDO でバインドされたパラメータを持つプリペアド ステートメントを使用します。クエリとデータを別々に送信するため、ユーザー入力によってクエリ構造が変更されることはありません。これは手動でエスカレーションするよりも強力です。ping 入力。

strip_tags は HTML および PHP タグを完全に削除し、htmlspecialchars はそれらを安全なエンティティに変換してテキストとして表示します。出力には esca を使用します。ping XSS攻撃対策としては、htmlspecialcharsの方が一般的に安全な選択肢です。

セッションごとに固有のCSRFトークンを生成し、すべてのフォームに非表示フィールドとして埋め込み、送信時に検証します。トークンが欠落している、または保存されている値と一致しないリクエストはすべて拒否します。

はい。AIはSQLインジェクション、XSS、安全でないパスワードハッシュ、安全でないファイル処理などをスキャンし、それぞれのリスクを説明して修正案を提案できます。ただし、これはセキュリティレビューの代替ではなく、あくまでも役立つ最初のチェックとしてご利用ください。

はい。脆弱なコードを貼り付けると、AI がそれを準備済みステートメントで書き換え、出力エスカレーションを実行できます。ping入力検証も行います。修正したコードをテストし、元の攻撃入力に対して修正が正しく機能していることを確認してください。