2009-04-02 6 views
1

問題が発生しました。次のコードスニペットを書きました:HTML ASCIIコードで置き換えます

teksti = teksti.Trim() 
teksti = Replace(teksti, "<", "& lt;") 
teksti = Replace(teksti, ">", "& gt;") 
teksti = Replace(teksti, """", "& quot;") 
teksti = Replace(teksti, "'", "& #8217;") 
teksti = Replace(teksti, "%", "& #37;") 
teksti = Replace(teksti, "&", "& amp;") 
teksti = Replace(teksti, "#", "& #35;") 
teksti = Replace(teksti, "@", "& #64;") 

これを書いた後、私はそれが自分自身の問題になることを認識しました。この関数は、HTMLやSQLインジェクションの情報を安全にすることになっています(他にもメソッドやパラメータ化されたクエリなどがありますが、それはその要点です)。しかし、何が起こるのかは、最初に&lt;& lt;に置き換えて、次に置換文字列がすべて&、#と#となるように書き換えられます。それにサインをする。

ヒント私はこれの正規表現を使用することを考えたが、私は十分なシンプルなまともなVisual Basicの例を見つけることができませんでした。

編集:ヒントありがとうございます。私はこれを行う "スマート"簡単な方法があるだろうと確信していましたが、後で利用可能な一般的な方法はないと思います。最初に問題のケースを並べ替えることは、明らかな解決策です。仕事の日は私が気づくには長すぎると思う。 :D

パラメトリッククエリについては、私の英語が意図したとおりに出てこないことを確認しています。私はすでに、それらを使用していると言います。この問題は、html-injectionの可能性を排除し、後で同じ文字列を使用する可能性のあるSQLインジェクションを防ぐことに特有の問題です。助けてくれてありがとう。

答えて

6

これが.NETの場合は、System.Web.HttpServerUtility.HtmlEncodeをご覧ください。

VBScript/VB6を使用している場合は、アンパサンドとポンドの署名をこのリストの一番上に移動するだけで、この機能に頼らずにSQLインジェクションから身を守ることができます。それでもパラメータ化されたクエリが必要です。

3

VB.NETを使用している場合は、System.Web.HttpUtility.HtmlEncode(string)を探しています。

それ以外の場合は、一度に1文字ずつループし、新しいエンコードされた文字列を作成します。そうすれば、各文字の文字列とcase文を1回だけ渡す必要があり、エンコードされた文字を再エンコードすることはありません。

+0

System.Webの任意の.Net言語で利用できます。 –

+1

もちろんです。 OPは具体的にはVBだと言っていたので、VBのどの種類のものを修飾していました。 –

2

問題のケースを先に並べ替えることができます。 または、文字列を繰り返し処理し、各文字を順番に分析して追加するか、または置換することによって新しい文字列を作成することができます。 そうでなければ、私はこの言語に精通していないので、名前を付けることはできませんでしたが、これはオフシェルフライブラリ/関数を使用することができます。

1

他の人と同様にリオーダーしてください。あなたはこのような追加の置換を追加し、相互に競合し、並べ替えを通じて解決することができない、2例見つけた場合:

teksti = teksti.Trim() 
teksti = Replace(teksti, "&", "THISISANAMP") 
teksti = Replace(teksti, ";", "& #59;") 
teksti = Replace(teksti, "#", "& #35;") 
teksti = Replace(teksti, "THISISANAMP", "&amp;") ''newly added 
teksti = Replace(teksti, "<", "& lt;") 
teksti = Replace(teksti, ">", "& gt;") 
teksti = Replace(teksti, """", "& quot;") 
teksti = Replace(teksti, "'", "& #8217;") 
teksti = Replace(teksti, "%", "& #37;") 
teksti = Replace(teksti, "@", "& #64;") 

をこれはあなたのコードを変更する最も簡単な方法です。

2

&文字を最初に、次に#文字を置き換えます。その後、他の人は安全に交換することができます。

しかし、これはではありません。 SQLインジェクションから保護するための良い方法です。パラメータ化されたクエリを使用して実行することをお勧めします。あなたのコードにHTMLのエンコーディングを必要としない文字があります。もしあなたがSQLインジェクションから守るためにエンコーディングしているのであれば、あなたは危険な道筋にいます。 SQLインジェクションは難しくなりますが、安全な方法ではありません。

また、データベースに格納する前にテキストをエンコードする場合、後で問題が発生する可能性があります。テキストを変更しないでデータベースに保存し、テキストを表示するときにHTMLエンコーディングを処理する方がよいでしょう。

1

「置換」を並べ替えることで、特定の問題をすばやく解決できるはずです。また、パラメータ化されたクエリも参照することをお勧めします。あなたは組み込みのエンコーディングのための.NETライブラリ、私はそれが理由System.Web.HttpUtility.HtmlEncodeよりも良いことがわかり、具体的Microsoft.Security.Application.AntiXssライブラリに見えるようにするために

別の提案があります「ブラックリスト」アプローチではなく「ホワイトリスト」アプローチを採用しています。このことができます

希望:

あなたはそれhereについての詳細情報を見つけることができます。

関連する問題