XSSおよびSQLインジェクション攻撃を防止しながら、フォーム入力でコードスニペットを許可する

StackOverflow https://stackoverflow.com/questions/407771

質問

XSS、SQLインジェクション、および関連する攻撃を防ぎながら、FCKeditorや他のエディターなどのコードスニペットをエディターに入力できるようにする方法(stackoverflowのように)

役に立ちましたか?

解決

ここでの問題の一部は、特定の種類のHTMLを許可することです。例えばリンク。ただし、スクリプトタグのようなXSS攻撃を含む可能性のあるHTMLタグだけをサニタイズする必要があります。さらに、イベントハンドラー属性や、<!> quot; javascript:<!> quot;で始まるその他の属性もサニタイズする必要があります。したがって、あなたの質問に対する完全な答えは、<!> quot;特殊文字の置き換え<!> quot;よりも洗練されたものである必要があります。それはリンクを許可しないからです。

SQLインジェクションの防止は、プラットフォームの選択に多少依存する場合があります。私の好みのWebプラットフォームには、クエリをパラメーター化するための組み込み構文があり、SQL注入(cfqueryparamと呼ばれる)をほとんど防止します。 PHPとMySQLを使用している場合、同様のネイティブmysql_escape()関数があります。 (PHP関数が技術的にパラメーター化されたクエリを作成するかどうかはわかりませんが、dbに安全に保存されたものをいくつか見たので、これまでのところsql-injectionの試行を防ぐのにうまく機能しました。)

XSS保護では、この種の理由で入力をサニタイズするために正規表現を使用していましたが、リンクのようなものを許可すると同時に危険なコードを削除することの両方に関わる難しさから、その方法から遠ざかりました。私が代わりに移動したのはXSLTです。繰り返しますが、XSL変換の実行方法は、プラットフォームによって異なる場合があります。これを行う方法について、 ColdFusion Developer's Journalの記事を少し前に書きました。使用できる定型XSLシートの両方と、その作成方法を示していますネイティブのXmlTransform()関数を使用してCFを操作します。

このためにXSLTに移行することにした理由は2つあります。

入力が整形式のXMLであることを最初に検証することで、特定の文字列連結のトリックを使用したXSS攻撃の可能性が排除されます。

次に、生の文字列操作用に設計された正規表現と比較して、構造化されたXMLドキュメントで動作するように特別に設計されているため、XSLおよびXPathセレクターを使用してXHTMLパケットを操作する方が正規表現よりも簡単です。だから、それはずっときれいで簡単です、私は間違いを犯す可能性が低く、私が間違いを犯したことがわかった場合、それは修正するのが簡単です。

また、私がそれらをテストしたとき、CKEditorのようなWYSIWYGエディター(彼はFを削除しました)が整形式XMLを保持しているので、潜在的な問題として心配する必要はありません。

他のヒント

保護にも同じルールが適用されます:入力をフィルタリングし、出力をエスケープします。

コードを含む入力の場合、フィルタリングとは、文字列に印刷可能な文字が含まれている必要があることを意味し、長さの制限がある場合があります。

データベースにテキストを保存するときは、クエリパラメータを使用するか、文字列をエスケープして、SQLインジェクションの脆弱性を引き起こす文字がないようにします。コードにはより多くの記号と非アルファ文字を含めることができますが、SQLインジェクションに関して注意しなければならないものは通常のテキストと同じです。

正しいエスケープ関数を複製しようとしないでください。ほとんどのデータベースライブラリには、エスケープが必要なすべての文字に対して正しいエスケープを行う関数が既に含まれています(たとえば、これはデータベース固有の場合があります)。また、文字セットに関する特別な問題も処理する必要があります。ライブラリが提供する関数を使用するだけです。

なぜ人々が<!> quot; use stored procedure!<!> quot;と言うのかわかりません。ストアドプロシージャは、SQLインジェクションに対する特別な保護を提供しません。エスケープされていない値をSQL文字列に補間して結果を実行する場合、これはSQLインジェクションに対して脆弱です。アプリケーションコードとストアドプロシージャのどちらで実行するかは関係ありません。

Webプレゼンテーションに出力するときは、テキストの場合と同様に、HTML特殊文字をエスケープします。

SQLインジェクション攻撃を防ぐためにできる最善のことは、データベース呼び出しを行うときに、パラメーター化されたクエリまたはストアドプロシージャを使用することを確認することです。通常、基本的な入力サニタイズも実行することをお勧めしますが、ユーザーからコードを受け入れる必要があるため、これはオプションではない可能性があります。

反対側(ユーザーの入力をブラウザにレンダリングする場合)では、データをHTMLエンコードすると、悪意のあるJavaScriptなどが実行された<ではなくリテラルテキストとしてレンダリングされますをクライアントのブラウザで。適切なWebアプリケーションサーバーフレームワークには、この機能が必要です。

すべての<!> ltを置き換えることができると思います。 <!> amp; lt;など(PHPでhtmlentitiesを使用するなど)を使用して、ある種のホワイトリストで安全なタグを選択します。問題は、ホワイトリストが少し厳しすぎる可能性があることです。

これはPHPの例です

$code = getTheCodeSnippet();
$code = htmlentities($code);
$code = str_ireplace("&lt;br&gt;", "<br>", $code); //example to whitelist <br> tags
//One could also use Regular expressions for these tags

SQLインジェクションを防ぐために、すべての 'および\文字を<!> quot; innofensive <!> quot;に置き換えることができます。同等の、\ 'や\など、次のC行

#include <stdio.h>//'); Some SQL command--

データベースに否定的な結果はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top