あらゆる種類のインジェクションは、一般的な攻撃ベクトルの1つです:html、javascript、sql。 したがって、多くの信頼できる情報源は、さまざまな呪文を通じてユーザー入力を保護することを推奨しています。 この投稿では、1つの簡単なルールを紹介します。これに従って、インジェクションの問題を確実に解決できます。

ルールは単純です: データ形式を混在させないでください!
- 異なる形式の文字列を割り当てないでください。
悪い:HTML←プレーンテキストlblName.Text = person.Name;
lblName.Text = HtmlEncode(person.Name);
- 異なる形式の回線を接続しないでください。
"<span>" + person.Name + "</span>"
"<span>" + HtmlEncode(person.Name) + "</span>"
- ネストされたフォーマットには注意してください:
label.Text = "<script>" + string.Format(script, string.Format(summary, string.Format(personUrl, id)) + "<script>";
label.Text = "<script>" + HtmlEncode(string.Format(script, JavaScriptEncode(string.Format(person.Summary, UrlEncode(string.Format(personUrl, id)))))) + "</script>";
書式
すべてのデータには形式があります。 最も単純な形式は、すべての文字が等しく、追加の意味を持たないプレーンテキストです。 テキストデータに基づくその他の形式(csv、html、javascriptなど)には、コンマ、タグ、スペシャルなどの制御文字があります。 文字。 上記の形式の混在により、ある形式が別の形式として扱われると危険な状況が発生します。
たとえば、ASP.NET for Labelコントロールでは、TextプロパティはHTMLとして扱われます。 したがって、このプロパティに異なる形式(プレーンテキストなど)の値を割り当てると、潜在的なHTML脆弱性が発生します。 そのため、スペシャルを選別するフォーマット間で特別なアダプターを使用する必要があります。 文字。 したがって、プレーンテキストからHTMLへのアダプターは、「<script>」を「&lt; script&gt;」に変換します。 また、プレーンテキストからURIへのアダプターは、「example.com?<script> alert( 'pwned'); </ script>」を「example.com%3F%3Cscript%3Ealert( 'pwned')%3B%3C%2Fscript」に変換します。 %3E。」
同様のアダプターは、ほぼすべての言語とプラットフォームに存在します-.NET:HtmlEncode、UrlEncode、PHP:htmlentities、urlencode 、サーバー側JavaScript: escape、encodeURIおよびencodeURIComponent 。 SQLクエリの場合、データベース自体で処理されるパラメーター化されたクエリを使用するだけで十分です。
生活を楽にするための3つの簡単なポイントを次に示します。
- 使用されるテキスト変数の形式、プロパティ、フィールドを把握します。 便宜上、名前にHeaderHtml、AvatarUrlのサフィックスを追加できます。
- アダプタライブラリを作成します:HtmlEncode、UrlEncode、JavaScriptEncode。
- 異なる形式のデータを扱うときは注意してください。
UPD:PHPインジェクションについて
この記事の議論の1つで、私のルールはphpインジェクションでは機能しないという議論がありました。 私はそれが機能することを示したいです。 だから、ありふれたコードを考えてみましょう:
include($_GET['path']);
GETリクエストで「evil.php」を渡すと、スクリプトは指定されたエクスプロイトを安全に起動します。 次に、この状況を私のルールのスタイルで検討します。 説明から、include関数が現在のファイルシステムまたはURIの形式のファイルパスを予期していることが明らかです。 また、コンテンツ形式$ _GET ['path']はプレーンテキストです。 注射を避ける方法は? このテキストを正しいパス形式に導くpathEncodeを書くか、空の文字列を返すことができない場合(たとえば、許可されたパスのホワイトリストをチェックする)。 その場合 include(pathEncode($_GET['path']));
実行可能ファイルでクラッシュするか、ファイルをアップロードします。 主なことは、どの形式が含まれることが期待され、どの形式がユーザーから来るかを明確に理解することです。