1

古いサイトの翻訳を取得するための次のコードがあります (より重要な情報を持つ他の機能でも同様です)。

Dim myDoc As New XmlDocument
myDoc.Load(Server.MapPath("\GlobalContent\TranslationXML\TranslationXML.xml"))
Dim translationText As XmlNodeList = myDoc.SelectNodes("Transaltions/language[@code='" + hLang.Value + "']")

Hlang はユーザー入力から取得されます。ご覧のとおり、これは Xpath インジェクション攻撃に対して脆弱です。

パラメータの使用であるSQLインジェクションと同じことを適用しようとしていますが、2.0でそれを行う方法が見つかりませんでした

このチュートリアルを試しました: http://weblogs.asp.net/cazzu/archive/2003/10/07/30888.aspx

しかし、DynamicContextはライブラリの一部にすぎず、使用できません。

これを修正するにはどうすればよいですか?

4

2 に答える 2

1

XPath インジェクションを防ぐための主なアイデアは、使用する XPath 式を事前にコンパイルし、変数 (パラメーター) を使用できるようにすることです。変数 (パラメーター) は、評価プロセス中にユーザーが入力した値に置き換えられます

.NET の場合:

  1. XPathExpression.Compile()で XPath 式を事前にコンパイルします。

  2. XPathExpression.SetContext()メソッドを使用して、特定の変数をユーザーが入力した値に解決するXsltContextオブジェクトをコンテキストとして指定します。

変数を含む XPath 式を評価する方法について詳しくは、こちらをご覧ください。

このテキストには、適切で完全な例が含まれています。

于 2013-03-02T00:47:15.010 に答える
1

残念ながら、XmlDocument も XPathDocument も (コンパイルされた SQL クエリと同様に) 置換を使用して XPath をコンパイルする適切な手段を提供しません。したがって、少し冗長ですが安全な方法をお勧めします。プライマリ XPath を使用して XmlNodeList を取得し、各ノードを反復処理して、1 つ以上の一致が見つかるまで属性をチェックします。

サンプル C# コード (私は VB を書きますが、私はかなりさびています):

XmlNodeList nodes = myDoc.SelectNodes("Transaltions/language");
foreach (XmlNode node in nodes) {
   XmlElement elem = (XmlElement)node;
   if (elem.GetAttribute("code") == hLang.Value) {
      //elem is your match
   }
}
于 2013-03-01T04:31:27.830 に答える