現在の位置: ホーム> 最新記事一覧> XSS攻撃を防ぐためにMB_SCRUBとHTMLSPECIALCHARSを組み合わせる方法は?

XSS攻撃を防ぐためにMB_SCRUBとHTMLSPECIALCHARSを組み合わせる方法は?

gitbox 2025-07-17

Cross-site scripting attack (XSS) is a common and dangerous security threat in web development.悪意のあるスクリプトコードを注入することにより、攻撃者はブラウザに予期しない動作を実行し、ユーザー情報を盗み、セッションをハイジャックし、ユーザーのブラウザを制御します。 XSSを防ぐために、開発者は通常、ユーザー入力を厳密にフィルタリングおよびエンコードします。 PHPでは、 htmlspecialchars()は、最も一般的に使用される保護方法の1つです。ただし、ユーザーが送信したコンテンツに無効または違法な文字シーケンスが含まれている場合、 htmlspecialChars()のみを使用して脆弱性を完全に妨げない場合があります。現時点では、より堅牢な処理のためにMB_SCRUB()を組み合わせる必要があります。

MB_SCRUBとは何ですか?

MB_SCRUB()は、PHP 8.2で導入された関数であり、違法文字を含むマルチバイト文字列を「クリーニング」して合法的な文字列にするために使用されます。 If multi-byte characters are truncated during transmission or processing, an invalid character sequence may be formed.この違法なシーケンスがhtmlspecialchars()に直接渡される場合、特定の条件下で予想されるエスケープメカニズムをバイパスする可能性があります。

たとえば、違法なUTF-8バイトシーケンスは、誤ってブラウザに解析され、スクリプト注入をもたらす場合があります。

 <span><span><span class="hljs-comment">// 例:違法バイトを含む入力</span></span><span>
</span><span><span class="hljs-variable">$input</span></span><span> = </span><span><span class="hljs-string">"\xC0&lt;script&gt;alert('XSS');&lt;/script&gt;"</span></span><span>;

</span><span><span class="hljs-comment">// 直接使用します htmlspecialchars(不安)</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, ENT_QUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span></span>

上記の例では、 $入力に違法なUTF-8バイトが含まれている場合、ブラウザはこれらのバイトを無視し、後続の<script>タグを実行する場合があります。

htmlspecialcharsでmb_scrubを使用する方法は?

この問題を解決するために、最初にmb_scrub()を使用して文字列をきれいにしてから、htmlエンティティエスケープのためにhtmlspecialchars()に渡すことができます。

 <span><span><span class="hljs-comment">// 安全慣行:最初にきれいにします,再び逃げる</span></span><span>
</span><span><span class="hljs-variable">$clean</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-variable">$safe</span></span><span> = </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$clean</span></span><span>, ENT_QUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$safe</span></span><span>;
</span></span>

这种组合的优势在于:

  1. MB_SCRUB()文字シーケンスの合法性を保証します。無効な文字が固定または削除され、違法なエンコーディングを処理する際のブラウザエラーを防ぎます。

  2. htmlspecialchars()は、HTML注射を防ぐために、タグエスケープ converts <>"およびその他の文字をHTMLエンティティに提供します。

実用的なアドバイス

  1. クロスプラットフォームの一貫性を確保するには、常にUTF-8に設定された文字セットを指定してください

  2. 特にHTMLへの出力の場合、すべてのユーザー入力をクリーニングおよびエスケープします

  3. コンテンツセキュリティポリティ(CSP)で使用して、 XSSリスクをさらに減らします。

  4. 升级到PHP 8.2 或更高版本,以使用mb_scrub()函数。

要約

htmlspecialchars()はXSSを防ぐための基本的なツールですが、全能ではありません。ユーザー入力に違法な文字エンコードが含まれている場合、セキュリティの脆弱性を引き起こす可能性があります。 mb_scrub()を追加することにより、違法な文字を効果的にクリアでき、保護強度が強化されます。より高いセキュリティ基準を追求するPHP開発者にとって、この組み合わせは促進する価値があります。