PHP を使用して XML 外部エンティティ攻撃 (XXE) を防御する方法
近年、インターネットの普及と情報交換の増加に伴い、ネットワーク セキュリティの問題にも注目が集まっています。その中でも、XML 外部エンティティ攻撃 (XXE) は一般的なセキュリティ脆弱性です。攻撃者はこの脆弱性を悪用して、サーバー上の機密情報を読み取ったり、さらなる攻撃を実行したりする可能性があります。この記事では、PHP を使用して XML 外部エンティティ攻撃を防御する方法について説明します。
XML 外部エンティティ攻撃は、通常、悪意を持って構築された XML ファイルを通じて実行されます。攻撃者は、XML のエンティティ参照とエンティティ宣言を使用して、ファイル システム上の任意のファイルを読み取り、リモート URL を介して外部リソースを読み取ることもできます。この攻撃は安全でない XML パーサーでは非常に有効であるため、この攻撃を防ぐための対策を講じる必要があります。
PHP を使用して XML 外部エンティティ攻撃を防御する方法をいくつか紹介します:
次は、無効なエンティティ解決オプションの使用例です:
$dom = new DomDocument(); $dom->loadXML($xmlString, LIBXML_NOENT | LIBXML_NOERROR | LIBXML_NOWARNING);
たとえば、PHP の preg_replace()
関数を使用して、XML の <!ENTITY>
ステートメントを除外できます。
$xmlString = preg_replace('/<!ENTITYs+S+s+SYSTEMs+"[^"]*">/', '', $xmlString);
これにより、XML を解析する前に、XXE 攻撃につながる可能性のある <!ENTITY>
ステートメントが確実に除外されます。
たとえば、<!ENTITY>
宣言で参照されている外部ファイル パスがホワイトリスト リストに含まれているかどうかを確認できます。
$allowedEntities = [ 'http://example.com/file.xml', 'file:///path/to/file.xml' ]; $xmlString = preg_replace_callback('/<!ENTITYs+(S+)s+SYSTEMs+"([^"]*)">/', function($matches) use ($allowedEntities) { if (!in_array($matches[2], $allowedEntities)) { // 非法的外部实体 return ''; } return $matches[0]; }, $xmlString);
上記は、コード 外部ファイル パスがホワイトリストに含まれているかどうかを確認して、XXE 攻撃を防止します。
概要:
PHP 開発では、XML 外部エンティティ攻撃 (XXE) に対する防御が重要なタスクです。エンティティ解決オプションを無効にし、入力をフィルタリングし、ホワイトリスト検証を使用することで、システムのセキュリティを向上させることができます。 XML ファイルの作成と解析には注意し、セキュリティの脆弱性に常に注意を払うことが重要です。
以上がPHP を使用して XML 外部エンティティ攻撃 (XXE) から保護する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。