出典: MSDN
翻訳: Yunzhongcheng BLOG
適用範囲:
ASP.NET バージョン 1.1
ASP.NET バージョン 2.0
概要:
このテキストでは、主に、インジェクション攻撃を防ぐためにユーザー入力を検証する方法を紹介します。ほとんどすべてのプログラム レベルの攻撃には、
フィールド、クエリ文字列パラメータ、Cookie などのユーザー入力を検証する必要があります
。入力項目は、プログラムをインジェクション攻撃から保護するために使用されます。すべてのユーザー入力が悪意のあるものであると想定し、クライアントベースの検証を使用すると、ページの滞在数を減らすことができます。パフォーマンスが向上し、ユーザー エクスペリエンスが向上しますが、クライアント側の検証はハッカーに簡単に騙される可能性があるため、これだけに依存しないでください。
入力内容を検証するには、入力フィールドごとに許容可能な入力ルールを定義する必要があります。入力フィールドの長さ、範囲、形式、およびタイプに基づいて制約を作成することです。不正な文字リスト制約を使用して入力を制限することは、ほとんど不可能であるため、適切ではありません。有害な入力をすべてフィルタリングするため、
HTML
文字入力を
受け入れる必要がある場合は、表示する前に HtmlEncode などのメソッドを使用して安全にエンコードすることをお勧めします。
ステップ
1.
ASP を使用する。 NET 要求の検証
ステップ 2. 権限制約入力を使用する ステップ
4.
SQL ステートメントのコマンド パラメーターを使用する ステップ
5.
ASP.NET エラーがクライアントに返されないことを確認する。
-------------------------------------------------- - - - - - - - - - -
- - - - - 目的:
入力文字列の長さ、範囲、形式、タイプを制限します。
ASP.NET プログラムの開発時に、要求の検証を使用してインジェクション攻撃を防止します。
入力検証には ASP.NET 検証コントロールを使用します。
安全でない出力をエンコードします。
コマンドパラメータセットパターンを使用してインジェクション攻撃を防止します。
エラーの詳細がクライアントに返されないようにします。
概要:
アプリケーション内のすべての信頼できない入力を検証する必要があります。ユーザーは、フォーム フィールド、クエリ文字列、クライアント Cookie、およびユーザー プロキシ文字列などのブラウザ環境値をアプリケーションに提供できると想定する必要があります。 IP アドレスなど。
通常、弱い入力検証はインジェクション攻撃の機会を与えます。以下は、弱い入力検証または入力検証なしを使用する一般的な攻撃方法です。
SQL インジェクション。ユーザー入力値を使用して SQL ステートメントを動的に構築すると、データベースが攻撃的で有害な SQL ステートメントを実行する可能性があります。
クロスサイト スクリプティング クロスサイト スクリプティング攻撃は、Web ページ検証の脆弱性を悪用してクライアント側のスクリプトを挿入し、これらのコードは信頼できるサイトから送信されるため、ブラウザによって解釈され実行されます。ブラウザはコードが有害であることを知る方法がありません。
不正なファイル アクセス コードが呼び出し元からの入力を受け入れると、悪意のあるユーザーがファイル操作を見て保護されたファイルにアクセスしたり、コードを使用して違法なデータを挿入したりする可能性があります。
注: インジェクション攻撃は、HTTP または HTTPS Secure Socket Layer (SSL) 接続を使用して行われる可能性があります。攻撃を防ぐためにトランスポート暗号化技術を使用することはできません。
ネットワーク上で入力が必要な場合は、すべての場所で検証を実行する必要があります。テキスト ボックスやその他のフォーム入力フィールド、クエリ文字列パラメータ、Cookie、サーバー側変数、ネットワーク メソッド パラメータなど、フィルタリング戦略は正しい入力のみを許可し、不正な入力を拒否する必要があることに注意してください。すべてをフィルタリングするよりも優れています 不正な入力を検出するのは簡単ですが、すべての不正な入力を含めることは通常困難です。
次の観点から入力内容を検証します。
制約: 入力が正しいタイプ、文字長、形式、および範囲であることを確認します。正規表現を適用してサーバー コントロールの入力を制限でき、カスタム検証ルールを使用して他のソースからの入力を制限できます。
拒否: 既知の有害なデータ入力を検出し、拒否します。
フィルタリング: たとえば、アプリケーションでメモ フィールドなどの自由形式の入力が許可されている場合、<b>、<i などの安全な HTML タグを許可する必要がある場合があります。 > およびその他の HTML タグ。
手順の概要
次の手順に従って、ASP.NET アプリケーションをインジェクション攻撃から保護します。
ステップ 1. ASP.NET 要求検証を使用します。
ステップ 2. 入力を制限します。
ステップ 3. 安全でない出力をエンコードします。
ステップ 4. SQL クエリ ステートメントにコマンド パラメータを使用します。
ステップ 5. ASP.NET エラー情報がクライアントに漏洩していないことを確認します。
次の章では、これらの手順について詳しく説明します。
ステップ 1. ASP.NET 要求検証を使用する
デフォルトでは、ASP.NET 1.1 および 2.0 要求検証では、サーバーに送信されるデータに HTML マークアップ要素と予約文字が含まれているかどうかがチェックされます。リクエストの検証は、潜在的に脅威となる文字列のリストと照合され、例外が見つかった場合は HttpRequestValidationException タイプの例外がスローされます。
これは、web.config ファイル内で < Add validateRequest= によって実行できます。この機能を無効にするには、pages> 要素に "false" を設定するか、別のページの @Pages 要素で ValidateRequest = "false" を設定します。
リクエストの検証を無効にする場合は、必要なページでのみ無効にできます。たとえば、プログラム ページに HTML 形式での入力を受け入れるフィールドを含める場合は、
Machine.config ファイルで要求検証機能がオンになっていることを確認してください
。要求検証機能は、ASP.NET でデフォルトで有効になっています。これは Machine.config.comments ファイルで行うことができます。次のデフォルト設定が表示されます。
<pages validateRequest = "true" ... />
サーバーの Machine.config およびアプリケーションの Web でデフォルト設定を変更していないことを確認してください。
ASP.NET 要求検証のテスト
次
のように、ASP.NET ページを作成し、要求検証を無効にすることができます。
<%@ Language="C#" ValidateRequest="false" %>
<html>
<script runat="サーバー">
void btnSubmit_Click(オブジェクト送信者、EventArgs e)
{
// ValidateRequest が false の場合、「hello」が表示されます
// ValidateRequest が true の場合、ASP.NET は例外を返します。
Response.Write(txtString.Text);
}
</script>
<本文>
<form id="form1" runat="server">
<asp:TextBox id="txtString" runat="サーバー"
Text="<script>alert('hello');</script>" />
<asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"
Text="送信" />
</form>
</body>
</html>
ValidateRequest = "true" に設定するか、ValidateRequest ページ属性を削除すると、ASP .NET は検証を要求します。
ページを実行すると、メッセージ ボックスに「Hello」が表示されます。
はスクリプト入力を拒否し、以下のようなエラー メッセージをスローします。
潜在的に危険な Request.Form 値がクライアントから検出されました (txtString="<script>alert('hello")。
リクエスト検証機能のみに依存せず、カスタム検証のガイダンス方法としてのみ使用するように注意してください。
入力を
制約するには、次の方法を使用します。
サーバー側の入力検証を使用します。クライアント側の検証は簡単にバイパスされる可能性があるため、依存しないでください。ページ バウンスの数を減らし、パフォーマンスを向上させ、ユーザー エクスペリエンスを向上させます。
入力の長さ、範囲、形式、タイプを検証し、入力内容が正しく、要件を満たしていることを確認します。
数値入力には Integer または Double などの強力なデータ型を使用します。文字入力には String データ型を指定します。日付と時刻の入力には DateTime 型を指定します。
フォーム内の HTML コントロール入力フィールドを検証するには、サーバー側コードで検証を実行します。次のセクションでは、一般的な入力タイプの変数を制約する方法について説明します
。
名前、住所、FAX番号、出生証明書番号などの文字列フィールドを検証するには、正規表現を使用します。
許容される文字の範囲を制限します。
たとえば、納税者 ID、郵便番号、郵便番号などのパターンベースのフィールドには、指定された文字パターンが必要です。
長さを確認します。
正規表現検証コントロールを使用する (REGULEXPRESSIONValidator)
正規表現検証コントロールを使用するには、検証するコントロール名 (ControlToValidate)、検証式 (ValidationExpression)、およびエラー メッセージ (ErrorMessage) を設定する必要があります。関連するプロパティの設定については、コードを参照してください。以下の例。
<form id="WebForm" method="post" runat="server">
<asp:TextBox id="txtName" runat="server"></asp:TextBox>
<asp: RegularExpressionValidator id="nameRegex" runat="server"
ControlToValidate="txtName"
ValidationExpression="^[a-zA-Z'.s]{1,40}$"
ErrorMessage="無効な名前">
</asp:正規表現検証者>
</form>
上記のコードでは、正規表現を使用して、入力名を文字 (大文字と小文字が許可されます)、スペース、O'Dell などの単一名の省略記号、およびピリオドに制限しています。また、入力文字の長さは 40 文字に制限されています。文字。
正規表現検証コントロール ( RegularExpressionValidator ) は、開始区切り文字と終了区切り文字としてキャレット (^) とドル記号 ($) を自動的に追加することに注意してください。カスタム式に追加していない場合は、それらを追加することをお勧めします。区切り文字を追加することは、
サーバー側のコントロールを使用していない場合 (つまり、検証コントロールを使用できない場合)
に正規表現クラス (Regex クラス) を使用することです
。フォーム フィールド以外の入力フィールド ソース (クエリ文字列パラメーターや Cookie など) の場合は、正規表現クラス (Regex クラス) を使用して、
using ステートメントを追加することで System.Text. RegularExpressions 名前空間をインポート
できます
。接頭語。
正規表現に「^」と「$」が含まれていることを確認してください (文字列の先頭と末尾に)。
Regex クラスの IsMatch メソッドを呼び出します。コード例を次に示します。
//インスタンスメソッド:
Regex reg = new Regex(@"^[a-zA-Z'.s]{1,40}$");
Response.Write(reg.IsMatch(txtName.Text));
// 静的メソッド:
if (!Regex.IsMatch(txtName.Text,@"^[a-zA-Z'.s]{1,40}$"))
{
// 名前が式と一致しません
}
頻繁に使用される正規表現をキャッシュできない場合は、IsMatch 静的メソッドを使用してパフォーマンスを向上させ、不要なオブジェクトの作成を防ぐ必要があります。
数値フィールドの検証
ほとんどの場合、数値の入力と範囲を検証するには、サーバー コントロールを使用する必要があります。数値フィールドの場合は、RangeValidator コントロールを使用します。RangeValidator は、通貨、日付、整数、倍精度、および文字列型のデータをサポートします。RangeValidator
コントロールを使用するには、コントロール名 (ControlToValidate)、タイプ (Type)、および最小値 (MinimumValue) を設定する必要があります。 )、最大値 (MinimumValue)、およびエラー メッセージ (ErrorMessage) のプロパティ。コード例は次のとおりです。
<asp:RangeValidator
ID="レンジバリデータ1"
Runat="サーバー"
ErrorMessage="無効な範囲です。数値は 0 ~ 255 の間である必要があります。"
ControlToValidate="範囲入力"
最大値 = "255"
MinimumValue="0" Type="整数" />
サーバー コントロールを使用していない場合は、入力値を整数に変換して検証することで、数値の範囲検証を完了できます。たとえば、整数が正当かどうかを確認するには、ASP.NET 2.0 が提供する新しいメソッド Int32.TryParse を使用して、入力値を System.Int32 の変数型に変換します。変換が失敗した場合、このメソッドは false を返します。
Int32 i;
if (Int32.TryParse(txtInput.Text, out i) == false)
{
//変換に失敗しました
}
以前のバージョンの ASP.NET を使用している場合は、try/catch ブロックで Int32.Parse メソッドまたは Convert.ToInt32 メソッドを使用し、変換が失敗したときにスローされる FormatException を処理できます。
次のサンプル コードは、検証方法を示しています。 from HTML テキストボックスの整数型の型と範囲。
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(オブジェクト送信者, EventArgs e)
{
if (Request.RequestType == "POST")
{
int i;
if (Int32.TryParse(Request.Form["integerTxt"], out i) == true)
{
// 変換が成功すると TryParse は true を返します
if ((0 <= i && i <= 255) == true)
{
Response.Write("入力データは有効です。");
}
それ以外
Response.Write("入力データが範囲外です");
}
それ以外
Response.Write("入力データは整数ではありません");
}
}
</script>
<html>
<本文>
<form id="form1" action="NumericInput.aspx" method="post">
<div>
0 ~ 255 の整数を入力します。
<input name="integerTxt" type="text" />
<input name="送信" type="送信" value="送信" />
</div>
</form>
</body>
</html>
日付フィールドの検証
ほとんどの場合、日付フィールドが正しいタイプであることを検証する必要があります。たとえば、サーバー コントロールを使用している場合は、日付フィールドが未来であるか過去であるかを検証する必要があります。日付入力値を取得し、値を特定の範囲内に収めたい場合は、範囲検証コントロール (RangeValidator) を使用して、その許可されるタイプを Date タイプに設定できます。このコントロールを使用すると、特別な期間を指定できます。開始時刻を設定することで、時刻が将来であるか過去であるかを検証するなど、検証の基準として今日の時刻を使用する必要がある場合は、CustomValidator 検証コントロールを使用できます。
CustomValidator コントロールを使用して日付を検証するには、ControlToValidate プロパティと ErrorMessage プロパティを設定し、OnServerValidate イベントでカスタム検証ロジック メソッドを指定する必要があります。次のサンプル コードです。
<%@ Page Language="C#" %>
<script runat="server">
void ValidateDateInFuture(オブジェクト ソース、ServerValidateEventArgs args)
{
DateTime dt;
// 有効な日付か、その日付が未来であるかを確認します。
if ((DateTime.TryParse(args.Value, out dt) == false) ||
(dt <= DateTime.Today))
{
args.IsValid = false;
}
</script>
<html>
<本文>
<form id="form1" runat="server">
<div>
<asp:Label ID="ラベル1" Runat="サーバー"
Text="将来の日付:"></asp:Label>
<asp:TextBox ID="futureDatetxt" Runat="server"></asp:TextBox>
<asp:CustomValidator
ID="CustomValidator1" Runat="サーバー"
ErrorMessage="日付が無効です。将来の日付を入力してください。"
ControlToValidate="futureDatetxt"
OnServerValidate="ValidateDateInFuture">
</asp:CustomValidator>
<br />
<asp:Button ID="submitBtn" Runat="server" Text="Submit" />
</div>
</form>
</body>
</html>
上記のコードは、ASP.NET 2.0 によって提供される新しいメソッドである DateTime.TryParse を使用していることに注意してください。
入力をフィルターするためにフリー テキスト フィールドをフィルターするには
、安全でない入力がコードとして扱われないようにする必要があります。共有データベース内のデータを読み取ることができません。まず、出力時にデータが危険にならないように、HttpUtility.HtmlEncode メソッドを使用して入力値をエンコードする必要
があります
。
@Page ページ要素 ValidateRequest = "false" に次のフィールドを追加して、ASP.NET 要求の検証を無効にします。 HtmlEncode メソッドを使用して入力文字列をエンコードし、その Replace メソッドを呼び出して文字内の HTML を置き換えます。次のコードは、このアプローチの例です。このページでは、ValidateRequest = "fasle" を設定することで ASP.NET 要求の検証を無効にし、単純なテキストの書式設定を表示するために <b> タグと <i> タグを使用できます。 。
<%@ Page Language="C#" ValidateRequest="false"%>
<script runat="server">
void submitBtn_Click(object sender, EventArgs e)
{
// 入力された文字列をエンコードします
StringBuilder sb = 新しい StringBuilder(
HttpUtility.HtmlEncode(htmlInputTxt.Text));
// 選択的に許可し <i>
sb.Replace("<b>", "<b>");
sb.Replace("</b>", "");
sb.Replace("<i>", "<i>");
sb.Replace("</i>", "");
Response.Write(sb.ToString());
}
</script>
<html>
<本文>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="htmlInputTxt" Runat="サーバー"
TextMode="MultiLine" 幅="318px"
Height="168px"></asp:TextBox>
<asp:Button ID="submitBtn" Runat="サーバー"
Text="送信" OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
クエリ文字列値を検証する
クエリ文字列の長さ、範囲、形式、および型を検証する通常は、組み合わせた正規表現を使用して次のタスクを実行します。
入力値を制限する 明示的な範囲チェックを設定する 入力型を指定して ASP.NET に変換するplatform 次の型は、型変換によって発生する例外を処理します。次のコード例は、Regex クラスを使用してクエリ文字列に渡された名前文字列を検証する方法を示しています。
void Page_Load(オブジェクト送信者、EventArgs e)
{
if (!System.Text. RegularExpressions.Regex.IsMatch(
Request.QueryString["Name"], @"^[a-zA-Z'.s]{1,40}$"))
Response.Write("無効な名前パラメータ");
それ以外
Response.Write("名前は " + Request.QueryString["名前"]);
}
Cookie 値の検証
プログラム
でファイルの入力が許可されている場合、
クエリ文字列などの Cookie に保存されている値は、ユーザーが簡単に変更できます。
名前、ファイル アドレス、またはファイル ストレージ パスが正しい形式であること、およびプログラムの実際の状況に応じて有効な場所を指していることを確認する必要があります。この確認が失敗すると、プログラムが誤ってアクセスを要求される可能性があります。
ユーザーがファイル
にアクセスするためにプログラムが悪用されるのを防ぐには、ユーザーが作成したコードによって入力されたファイルまたはファイル パスを受け入れないようにします。たとえば、
入力
ファイル名を受け入れる場合は、システムを使用します。 .IO.Path.GetFileName メソッドを使用してファイルの完全な名前を取得する必要がある場合は、入力ファイル パスを受け入れ、System.IO.Path.GetFullPath を使用して完全なファイル パスを取得します。アプリケーション間のマッピングを防止するには、MapPath メソッドを使用します。 。
MapPath メソッドを使用して、提供された仮想ディレクトリをサーバー上の物理ディレクトリにマップする場合は、アプリケーション間のマッピングを防ぐために、ブール パラメーターを指定した Request.MapPath メソッドのオーバーロード バージョンを使用します。
試す
{
string mappedPath = Request.MapPath( inputPath.Text,
Request.ApplicationPath、false);
}
catch(HttpException)
{
// アプリケーション間のマッピングが試行されました
}
最後の false パラメーターは、アプリケーション間のマッピングを防止します。これは、ユーザーが「...」構文を使用して、指定した仮想ディレクトリ内にない不正なパスを指定することを許可されないことを意味します。
サーバー コントロールを使用する場合は、Control.MapPathSecure メソッドを使用して、仮想ディレクトリに対応する実際のディレクトリ アドレスを取得できます。
Control.MapPathSecure メソッドは、未承認のファイルにアクセスすると HttpException をスローします。詳細については、.NET Framework ドキュメントの Control.MapPathSecure メソッドの概要を参照してください。
コード アクセス セキュリティを使用してファイルの入出力を制限する
管理者は、プログラムの信頼性を「中」に設定することで、プログラムが常駐する仮想ディレクトリへのファイルの読み取りおよび書き込み機能を制限できます。 .NET コードのセキュリティ メカニズムにより、プログラムが配置されている仮想ディレクトリ以外ではファイル アクセス権を持たないことが保証されます。
アプリケーションの信頼レベルを「中」に設定するには、次を追加します。
< trust level = "Medium" />
URL の検証
次のような正規表現を使用して URL を照合できます。
^(?:http|https|ftp)://[a-zA-Z0-9 .-]+(?::d {1,5})?(?:[A-Za-z0-9.;:@&=+$,? /]|%u[0-9A-Fa- f]{4}|%[0-9A-Fa-f]{2})*$
これは入力形式を制限するだけであり、アプリケーションの範囲内でそれが受け入れられるかどうかは検証されません。たとえば、アプリケーションは指定したサーバーと通信しますか?
ステップ 3. 安全でないコードをエンコードする
Web ページにテキストを入力する場合は、HttpUtility.HtmlEncode メソッドを使用してエンコードします。テキストがユーザー入力、データベース、またはローカル ファイルから取得されたものである場合は、必ずこれを実行してください。
同様に、ユーザー入力コンテンツ、データベースなどから取得された安全でない文字を含む URL を記述する場合は、 HttpUtility.UrlEncode メソッドをエンコードします。
データを保存する前にエンコードすると保存されたデータが破損する可能性があるため、表示する際はできるだけ後の手順でエンコードするようにしてください。
安全でない出力エンコードの場合は、
HtmlEncode が HTML タグを置き換えます。これらの記号を表す特別なテキスト文字列を使用すると、ブラウザがそれらを HTML タグとして解釈するのを防ぎます。たとえば、「<」は < " (コロン) に置き換えられ、これらのタグは無害なテキストとして表示されます。
<%@ ページ言語="C#" ValidateRequest="false" %>
<script runat="server">
void submitBtn_Click(オブジェクト送信者、EventArgs e)
{
Response.Write(HttpUtility.HtmlEncode(inputTxt.Text));
}
</script>
<html xmlns=" http://www.w3.org/1999/xhtml " >
<本文>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="inputTxt" Runat="サーバー"
TextMode="MultiLine" 幅="382px" 高さ="152px">
</asp:TextBox>
<asp:Button ID="submitBtn" Runat="server" Text="送信"
OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
HTML エンコードの効果を確認するには、仮想ディレクトリを作成し、その中に前述のファイルを置き、このページを実行し、テキスト ボックスに HTML コードを入力して、送信ボタンをクリックしてください。たとえば、次の入力は通常どおり表示されます。 text
スクリプトを実行し、こんにちはと言う <script>alert('hello');</script>
HtmlEncode メソッドの呼び出しを削除し、テキストの内容を入力するだけの場合、ブラウザはコードを実行し、プロンプト ボックスをポップアップ表示します。
UrlEncode メソッドの使用は安全ではありません URL アドレスのエンコード
ユーザー入力部分を使用して URL パラメーターを取得する必要があり、これにより特定のセキュリティ リスクが生じる可能性がある場合は、HttpUtility.UrlEncode メソッドを使用してアドレス文字列をエンコードします
。 ;
ステップ 4. SQL ステートメントはコマンド パラメーター メソッドを使用します。
インジェクション攻撃を回避するには、パラメーター コレクションを使用して、型検出と長さ検出を行います。パラメータ設定メソッドを使用する追加の利点は、入力タイプが範囲外の場合、入力のタイプと長さを厳密に制限できることです。
ストアド プロシージャを呼び出す
ときは、以下のパラメータ セットを使用します。
コード スニペットは、ストアド プロシージャを呼び出すときにパラメータ セットを使用する例を示しています。
SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin",
myConnection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parm = myCommand.SelectCommand.Parameters.Add(
"@LoginId"、SqlDbType.VarChar、11);
parm.Value = ログイン.テキスト;
独自の SQL ステートメントを作成するときにパラメーター セットを使用します。
ストアド プロシージャを使用できない場合でも、パラメーター セットを使用できます。以下のコードを参照してください。
SqlDataAdapter myCommand = new SqlDataAdapter(
"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", myConnection);
SQLParameter parm = myCommand.SelectCommand.Parameters.Add(
"@au_id" ,SqlDbType.VarChar, 11);
Parm.Value = ログイン.テキスト;
SQL インジェクション攻撃を防ぐ方法の詳細については、「方法: ASP.NET で SQL インジェクションから保護する」を参照してください。ASP.NET
エラー メッセージがクライアントに返されないことを確認するには、
<customErrors> 要素を使用できます。クライアントを構成するには、プログラム エラー検出メカニズムによって一般的なエラー メッセージがクライアントに返される必要があります。
次の例は、web.config の mode 属性を
「remoteOnly」に変更したことを確認してください。
"remoteOnly">
ASP.NET プログラムのインストール後、次のようにクライアントのエラー メッセージ ページを指定できます。
<customErrors mode = "on"defaultRedirect = "YourErrorPage.htm">
その他のリソースについては、関連トピック「
ASP.NET で正規表現を使用して入力を制限する方法」を参照してください。SQL
インジェクション攻撃を防止し
、クロスサイト スクリプティング攻撃を防止します。
PS: ようやく読み終えました。3 日近くかかりました。実際、これらの文章は非常に単純です。初めて翻訳するので下手なところはご容赦ください、よろしくお願いします。