Cross-site scripting attack (XSS) is a common and dangerous security threat in web development.悪意のあるスクリプトコードを注入することにより、攻撃者はブラウザに予期しない動作を実行し、ユーザー情報を盗み、セッションをハイジャックし、ユーザーのブラウザを制御します。 XSSを防ぐために、開発者は通常、ユーザー入力を厳密にフィルタリングおよびエンコードします。 PHPでは、 htmlspecialchars()は、最も一般的に使用される保護方法の1つです。ただし、ユーザーが送信したコンテンツに無効または違法な文字シーケンスが含まれている場合、 htmlspecialChars()のみを使用して脆弱性を完全に妨げない場合があります。現時点では、より堅牢な処理のために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<script>alert('XSS');</script>"</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>タグを実行する場合があります。
この問題を解決するために、最初に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>
这种组合的优势在于:
MB_SCRUB()文字シーケンスの合法性を保証します。無効な文字が固定または削除され、違法なエンコーディングを処理する際のブラウザエラーを防ぎます。
htmlspecialchars()は、HTML注射を防ぐために、タグエスケープ: converts < 、 > 、 "およびその他の文字をHTMLエンティティに提供します。
クロスプラットフォームの一貫性を確保するには、常にUTF-8に設定された文字セットを指定してください。
特にHTMLへの出力の場合、すべてのユーザー入力をクリーニングおよびエスケープします。
コンテンツセキュリティポリティ(CSP)で使用して、 XSSリスクをさらに減らします。
升级到PHP 8.2 或更高版本,以使用mb_scrub()函数。
htmlspecialchars()はXSSを防ぐための基本的なツールですが、全能ではありません。ユーザー入力に違法な文字エンコードが含まれている場合、セキュリティの脆弱性を引き起こす可能性があります。 mb_scrub()を追加することにより、違法な文字を効果的にクリアでき、保護強度が強化されます。より高いセキュリティ基準を追求するPHP開発者にとって、この組み合わせは促進する価値があります。