CA3008:XPath インジェクションの脆弱性のコード レビュー
プロパティ | 値 |
---|---|
ルール ID | CA3008 |
Title | XPath インジェクションの脆弱性のコード レビュー |
[カテゴリ] | Security |
修正が中断か中断なしであるか | なし |
.NET 9 では既定で有効 | いいえ |
原因
信頼できない可能性のある HTTP 要求入力が XPath クエリに到達した場合。
既定で、このルールではコードベース全体を分析しますが、これは構成可能です。
規則の説明
信頼されていない入力を処理するときには、XPath インジェクション攻撃に注意してください。 信頼されていない入力を使用して XPath クエリを作成すると、攻撃者がクエリを操作して意図しない結果を返したり、クエリ対象の XML のコンテンツを開示したりする可能性があります。
このルールは、XPath 式に到達する HTTP 要求からの入力の検索を試みます。
注意
このルールでは、アセンブリ間のデータを追跡することはできません。 たとえば、あるアセンブリが HTTP 要求入力を読み取り、XPath クエリを実行する別のアセンブリにそれを渡す場合、このルールでは警告が生成されません。
注意
このルールでメソッド呼び出し間のデータ フローがどれほど深く分析されるかについては、構成可能な制限があります。 EditorConfig ファイルでこの制限を構成する方法については、「Analyzer Configuration」(Analyzer の構成) を参照してください。
違反の修正方法
XPath インジェクションの脆弱性を修正するための方法には、次のものがあります。
- ユーザーによる入力からは XPath クエリを構成しない。
- 入力に安全な文字のセットのみが含まれていることを検証する。
- 引用符をエスケープする。
どのようなときに警告を抑制するか
入力が安全であることが検証済みであることがわかっている場合は、この警告を抑制できます。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA3008
// The code that's violating the rule is on this line.
#pragma warning restore CA3008
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、none
でその重要度を に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA3008.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
分析するコードを構成する
次のオプションを使用して、コードベースのどの部分に対してこのルールを実行するかを構成します。
これらのオプションは、このルールのみに対して、適用されるすべてのルール、または適用先のこのカテゴリ (セキュリティ) のすべてのルールに対して構成できます。 詳細については、「コード品質規則の構成オプション」を参照してください。
特定のシンボルを除外する
excluded_symbol_names オプションを設定することで、種類やメソッドなどの特定のシンボルを分析から除外できます。 たとえば、MyType
という名前の型のコードで規則を実行しないように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
注意
XXXX
の CAXXXX
部分を該当する規則の ID に置き換えます。
オプションの値で使用できるシンボル名の形式 (|
で区切ります):
- シンボル名のみ (包含する型または名前空間に関係なく、その名前が指定されたすべてのシンボルが含まれます)。
- そのシンボルのドキュメント ID 形式の完全修飾名。 各シンボル名には、メソッドには
M:
、型にはT:
、名前空間にはN:
のように、シンボルの種類のプレフィックスが必要です。 - コンストラクターには
.ctor
、静的コンストラクターには.cctor
。
例 :
オプション値 | まとめ |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
MyType という名前のすべてのシンボルを検索します。 |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
MyType1 または MyType2 という名前のすべてのシンボルを検索します。 |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
指定された完全修飾シグネチャを持つ特定のメソッド MyMethod を検索します。 |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
それぞれの完全修飾シグネチャを持つ特定のメソッド MyMethod1 または MyMethod2 を検索します。 |
特定の型とその派生型を除外する
excluded_type_names_with_derived_types オプションを設定することで、特定の型とその派生型を分析から除外できます。 たとえば、MyType
という名前の型のメソッドとその派生型で規則を実行しないように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
注意
XXXX
の CAXXXX
部分を該当する規則の ID に置き換えます。
オプションの値で使用できるシンボル名の形式 (|
で区切ります):
- 型の名前のみ (包含する型または名前空間に関係なく、その名前が指定されたすべての型が含まれます)。
- そのシンボルのドキュメント ID 形式の完全修飾名 (オプションで
T:
プレフィックスも使用可)。
例 :
オプションの値 | まとめ |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
MyType という名前のすべての型と、そのすべての派生型を検索します。 |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
MyType1 または MyType2 という名前のすべての型と、そのすべての派生型を検索します。 |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
指定された完全修飾名を持つ特定の型 MyType と、そのすべての派生型を検索します。 |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
それぞれの完全修飾名を持つ特定の型 MyType1 または MyType2 と、そのすべての派生型を検索します。 |
疑似コードの例
違反
using System;
using System.Xml.XPath;
public partial class WebForm : System.Web.UI.Page
{
public XPathNavigator AuthorizedOperations { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
string operation = Request.Form["operation"];
// If an attacker uses this for input:
// ' or 'a' = 'a
// Then the XPath query will be:
// authorizedOperation[@username = 'anonymous' and @operationName = '' or 'a' = 'a']
// and it will return any authorizedOperation node.
XPathNavigator node = AuthorizedOperations.SelectSingleNode(
"//authorizedOperation[@username = 'anonymous' and @operationName = '" + operation + "']");
}
}
Imports System
Imports System.Xml.XPath
Partial Public Class WebForm
Inherits System.Web.UI.Page
Public Property AuthorizedOperations As XPathNavigator
Protected Sub Page_Load(sender As Object, e As EventArgs)
Dim operation As String = Me.Request.Form("operation")
' If an attacker uses this for input:
' ' or 'a' = 'a
' Then the XPath query will be:
' authorizedOperation[@username = 'anonymous' and @operationName = '' or 'a' = 'a']
' and it will return any authorizedOperation node.
Dim node As XPathNavigator = AuthorizedOperations.SelectSingleNode( _
"//authorizedOperation[@username = 'anonymous' and @operationName = '" + operation + "']")
End Sub
End Class
.NET