XML インジェクション攻撃は SQL インジェクションと同じ原理を持ち、攻撃者は悪意のあるコードを入力して自分の権限を超えた機能を実行します。 XML はデータを保存する方法の 1 つであり、変更またはクエリの際にデータをエスケープせずに直接入力または出力すると、XML インジェクションの脆弱性が発生します。攻撃者は XML データ形式を変更し、新しい XML ノードを追加して、データ処理プロセスに影響を与える可能性があります。
攻撃
以下は、登録されたユーザー情報を XML 形式で保存する例です:
final String GUESTROLE = "guest_role"; ... //userdata是准备保存的xml数据,接收了name和email两个用户提交来的数据。 String userdata = "<USER role="+ GUESTROLE+ "><name>"+ request.getParameter("name")+ "</name><email>"+ request.getParameter("email")+ "</email></USER>"; //保存xml userDao.save(userdata);
ご覧のとおり、このコードはフィルタリング操作を実行しません。一般ユーザーが登録すると、次のようなデータ レコードが生成されます:
<?xml version="1.0" encoding="UTF-8"?> <USER role="guest_role"> <name>user1 </name> <email>user1@a.com </email> </USER>
攻撃者が電子メールを入力すると、次のコードを入力できます:
user1@a.com</email></USER><USER role="admin_role"><name>lf</name><email>user2@a.com
エンド ユーザーが登録すると、データは次のようになります:
<?xml version="1.0" encoding="UTF-8"?> <USER role="guest_role"> <name>user1 </name> <email>user1@a.com</email> </USER> <USER role="admin_role"> <name>lf</name> <email>user2@a.com </email> </USER>
, 詳細 role="admin_role" を持つ管理者 lf が作成されます。攻撃目的を達成する。
防御
古いことわざにあるように、攻撃のあるところには防御もあります。防御の原則は実際には非常に単純で、キー文字列をエスケープすることです:
& --> & < --> < > --> > " --> " ' --> '
XML を保存して表示する前に、データ部分を個別にエスケープするだけです:
String userdata = "<USER role="+ GUESTROLE+ "><name>"+ StringUtil.xmlencode(request.getParameter("name"))+ "</name><email>"+ StringUtil.xmlencode(rrequest.getParameter("email"))+ "</email></USER>";
それだけです。
以上がWebセキュリティにおけるXMLインジェクションのサンプルコードの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。