この記事では主に、一般的な PHP セキュリティ攻撃とその解決策について説明します。一般的な PHP アプリケーション セキュリティの脅威を理解することで、PHP アプリケーションが攻撃されないようにすることができます。したがって、この記事では 6 つの一般的な PHP セキュリティ攻撃をリストします。誰でも読んで学ぶことができます。
1. SQL インジェクション
SQL インジェクションは、ユーザーがフォーム フィールドに SQL ステートメントを入力して、通常の SQL 実行に影響を与える悪意のある攻撃です。 system() または exec() コマンドを通じて注入されるものもあり、これは同じ SQL インジェクション メカニズムを持ちますが、シェル コマンドのみを対象とします。
01 $username = $_POST['username'];02 $query = "select * from auth where username = '".$username."'";03 echo $query;04 $db = new mysqli('localhost', 'demo', ‘demo', ‘demodemo');05 $result = $db->query($query);06 if ($result && $result->num_rows) {07 echo "<br />Logged in successfully";08 } else {09 echo "<br />Login failed";10 }
上記のコードは、最初の行でユーザーが入力した値 ($_POST['username']) をフィルターしたりエスケープしたりしません。そのため、$username に SQL ステートメントを別のものに変換するかどうかによって、クエリが失敗したり、データベースが破損したりする可能性があります。
SQL インジェクションを防ぐ
オプション:
使用mysql_real_escape_string()过滤数据 手动检查每一数据是否为正确的数据类型 使用预处理语句并绑定变量
プリペアドプリペアドステートメントを使用する
分离数据和SQL逻辑 预处理语句将自动过滤(如:转义) 把它作为一个编码规范,可以帮助团队里的新人避免遇到以上问题
01 $query = 'select name, district from city where countrycode=?';02 if ($stmt = $db->prepare($query) )03 {04 $countrycode = 'hk';05 $stmt->bind_param("s", $countrycode); 06 $stmt->execute();07 $stmt->bind_result($name, $district);08 while ( $stmt ($stmt->fetch() ){09 echo $name.', '.$district;10 echo '<br />';11 }12 $stmt->close();13 }
2. XSS 攻撃
XSS (クロスサイトスクリプティング攻撃) は、ユーザーが Web サイトに何らかのデータを入力する攻撃です。これには、クライアントが含まれます。サイドスクリプト (通常は JavaScript)。フィルタリングせずに別の Web ページにデータを出力すると、このスクリプトが実行されます。
ユーザーが送信したテキストコンテンツを受信します
01 <?php02 if (file_exists('comments')) {03 $comments = get_saved_contents_from_file('comments');04 } else {05 $comments = '';06 }07 08 if (isset($_POST['comment'])) {09 $comments .= '<br />' . $_POST['comment'];10 save_contents_to_file('comments', $comments);11 }12 > 输出内容给(另一个)用户1 <form action='xss.php' method='POST'>2 Enter your comments here: <br />3 <textarea name='comment'></textarea> <br />4 <input type='submit' value='Post comment' />5 </form><hr /><br />6 7 <?php echo $comments; ?>
どうなりますか?
烦人的弹窗 刷新或重定向 损坏网页或表单 窃取cookie AJAX(XMLHttpRequest)
XSS 攻撃を防ぐ: XSS 攻撃を防ぐには、PHP の htmlentities() 関数を使用してフィルタリングし、ブラウザに出力します。 htmlentities() の基本的な使用法は簡単ですが、利用可能な高度なコントロールが多数あります。XSS チートシートを参照してください。
3. セッションの固定
PHPSESSID が推測しにくいことを前提としたセッションのセキュリティ。ただし、PHP は Cookie または URL を介してセッション ID を受け入れることができます。したがって、被害者のなりすましには、特定の (またはその他の) セッション ID やフィッシング攻撃が使用される可能性があります。
4. セッションのキャプチャとハイジャック
これはセッションの固定と同じ考え方ですが、セッション ID を盗む必要があります。セッション ID が Cookie に保存されている場合、XSS および JavaScript を介して攻撃者によって盗まれる可能性があります。 URL にセッション ID が含まれている場合は、スニッフィングまたはプロキシ サーバーからセッション ID を取得することもできます。
セッション キャプチャとハイジャックを防ぐ
更新ID 如果使用会话,请确保用户使用SSL
5. クロスサイト リクエスト フォージェリ (CSRF)
CSRF 攻撃とは、Web サイトの信頼できるユーザーのように見えるが、意図的ではないページによって行われるリクエストを指します。次の例のように、さまざまなバリエーションがあります:
1 ![](http://example.com/single_click_to_buy.php?user_id=123&item=12345)
クロスサイト リクエスト フォージェリの防止
一般に、ユーザーがフォームから来たことを確認し、送信するすべてのフォームと一致するようにします。覚えておく必要がある点は 2 つあります:
对用户会话采用适当的安全措施,例如:给每一个会话更新id和用户使用SSL。 生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。
6. コード インジェクション
コード インジェクションは、無効なデータを処理することによってコンピューターの脆弱性を悪用することによって引き起こされます。問題は、通常はファイルのインクルードを介して、誤って任意のコードを実行したときに発生します。コードの書き方が不十分だと、リモート ファイルが組み込まれて実行される可能性があります。多くの PHP 関数と同様に、require などの関数には URL またはファイル名を含めることができます。例:
01 <form>Choose theme:02 <select name = theme>03 <option value = blue>Blue</option>04 <option value = green>Green</option>05 <option value = red>Red</option>06 </select>07 <input type = submit>08 </form>09 <?php10 if($theme) {11 require($theme.'.txt');12 }13 ?>
上の例では、ユーザーが入力したファイル名またはファイル名の一部を渡すことで、「http」で始まる URL が含まれます。 ://" 書類。
コードインジェクションの防止
过滤用户输入 在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件。
その他の一般原則
特にWebサーバー/PHPがISPによって管理されている場合、またはWebサイトが移行/展開される可能性がある場合は、アプリケーションを保護するためにサーバー構成に依存しないでください。他の場所に移動し、将来的には他の場所から他の場所に移行/展開します。ウェブサイトのコード (HTML、JavaScript、PHP など) にセキュリティを意識したチェック/ロジックを埋め込んでください。
サーバー側のセキュリティ スクリプトを設計します。
— たとえば、単一行の実行、つまり認証とデータ サニタイズの単一ポイントを使用します。
— たとえば、セキュリティが重要なすべてのページに PHP 関数/ファイルを埋め込んで、すべてのセキュリティを処理します。ログイン/セキュリティ ロジック チェック
コードが更新され、最新のパッチが適用されていることを確認してください。
関連する推奨事項:
以上が一般的な PHP セキュリティ攻撃とその解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。