7

ASP.net で URL 書き換えを実装していますが、URL が原因でさまざまな問題が発生しています。

URL は、部門とカテゴリのデータベースから生成されます。従業員が、サイトを壊すことなく、適切な特殊文字を使用してアイテムをデータベースに追加できるようにしたいと考えています。

URL を作成する前にデータをエンコードしています。

いくつかの問題があります...

  1. IIS は、.net に到達する前に URL をデコードするため、「/」が含まれているものを適切に解析できません。
  2. ASP.net は、特定のページ内で "~" を役に立たなくする URL によって混乱します。
  3. ビルトイン テスト サーバーからローカル IIS サーバー (XP マシン) に移行しましたが、エンコードされた & (%26) を含む URL で「Bad Request」エラーが発生します。
  4. UrlEncode では、「.」などの一部の区切り文字がそのまま残ります。

この件に関して他に 2 つの関連する投稿がありましたが、その時点ではアップストリームの大きな問題ではなく、小さな問題しか見ていませんでした。「Bad Request」の問題を解決するためのいくつかのレジストリのトリックを見つけましたが、共有ホスティング環境にデプロイすることでそれが役に立たなくなります。また、これが何らかのセキュリティ問題の修正であることも知っているので、開いているワームの種類を知らずに、必ずしも回避したくありません。

.net に生の URL を強制的に渡させたり、IIS の設定を上書きさせたりするのではなく、そもそも本当に安全な URL を作成したいと考えています。

私はAntiXss.URLEncode、HttpUtility.URLEncode、URI.EscapeDataStringを試したことに注意してください。double URLEncodng のような愚かなことも試しました。私が必要とすることを行うユーティリティはありますか、それとも本当に自分でロールバックする必要がありますか? % を通常とは異なる文字列に置き換えるようなハッキーなことをすることさえ考えています。最終結果は、少なくとも読み取り可能である必要があります。これが、最初に URL 書き換えを使用するポイントでした。

長い投稿で申し訳ありません。必要な詳細がすべて含まれていることを確認したかっただけです。これに関する関連情報が見つからないようです。これはよくある問題のようです。そのため、何か大きなものを見逃している可能性があります。ご協力ありがとうございます。長い説明をお待ちください。


わかりやすくするために編集します。

URL がデータベースから構築されていると言うとき、私が言いたいのは、ディレクトリ構造がデータベース内の部門とカテゴリから構築されているということです。

URL の例 -

Mystore/Refrigeration/Bar+Fridge.aspx
Mystore/Cooking+Equipment.aspx
Mystore/Kitchen/Cutting+Boards.aspx

「Beverage & Bar」や「Pastry/Decorating」などの部門を使用して URL を作成すると、問題が発生します。最初にエンコードされているにもかかわらず、これらは前述の問題を引き起こします。

私のハンドラーは既に実装されており、特殊文字エンコーディングの問題を除いて正常に動作しています。

4

4 に答える 4

5

カテゴリごとに一意の URL を持つカテゴリ/部門テーブルから離れたテーブルを持つことを検討する必要があります。次に、特別なルーチンを使用して URL を生成できます。これは SQL スカラー関数または CLR 関数の場合がありますが、実行することの 1 つは Web の URL を正規化することです。「Beverage & Bar」を「Beverage-And-Bar」に、「Pastry / Decorating」を「Pastry-Decorating」に変換できます。主に、ルーチンはすべての無効な HTTP URL 文字を別のものに置き換える必要があります。例はこれです:

public static class URL
{
    static readonly Regex feet = new Regex(@"([0-9]\s?)'([^'])", RegexOptions.Compiled);
    static readonly Regex inch1 = new Regex(@"([0-9]\s?)''", RegexOptions.Compiled);
    static readonly Regex inch2 = new Regex(@"([0-9]\s?)""", RegexOptions.Compiled);
    static readonly Regex num = new Regex(@"#([0-9]+)", RegexOptions.Compiled);
    static readonly Regex dollar = new Regex(@"[$]([0-9]+)", RegexOptions.Compiled);
    static readonly Regex percent = new Regex(@"([0-9]+)%", RegexOptions.Compiled);
    static readonly Regex sep = new Regex(@"[\s_/\\+:.]", RegexOptions.Compiled);
    static readonly Regex empty = new Regex(@"[^-A-Za-z0-9]", RegexOptions.Compiled);
    static readonly Regex extra = new Regex(@"[-]+", RegexOptions.Compiled);

    public static string PrepareURL(string str)
    {
        str = str.Trim().ToLower();
        str = str.Replace("&", "and");

        str = feet.Replace(str, "$1-ft-");
        str = inch1.Replace(str, "$1-in-");
        str = inch2.Replace(str, "$1-in-");
        str = num.Replace(str, "num-$1");

        str = dollar.Replace(str, "$1-dollar-");
        str = percent.Replace(str, "$1-percent-");

        str = sep.Replace(str, "-");

        str = empty.Replace(str, string.Empty);
        str = extra.Replace(str, "-");

        str = str.Trim('-');
        return str;
    }
}

これを SQL 拡張機能にするか、別のプロセスとして URL 生成を実行することができます。次に、マッピングを実装するには、URL 全体をカテゴリ ID に直接マップします。このアプローチは、いくつかの理由で長期的には優れています。まず、常に URL を生成しているわけではありません。これを 1 回実行すると、静的なままになります。手順の変更について心配する必要がなく、GoogleBot が古い URL を見つけることができなくなります。また、衝突が発生した場合、衝突は特殊文字によってのみ異なるため、カテゴリ名が重複している可能性があることに気付く場合があります。最後に、マッピング機能を実行しなくても、いつでもデータベースから URL を表示できます。

于 2009-08-17T16:45:04.287 に答える
2

ある程度のセキュリティがあるため、認証開始要求の global.asax ファイルに実装する URL の書き換えがあります。ここで生の URL を取得し、データベースを検索します。これにより、パスが aspx ページに書き換えられ、すべてのパラメーターがクエリ文字列を介して渡されます。エンコードは必要ありません。

ただし、URL を使用して実際にデータを変更している場合は、http GET を効果的に使用してデータベースを変更しているため、大きな問題が発生することがわかります。それは通常、悪い考えであると考えられており、私がしていることではありません.

データベース操作を行うには、投稿リクエストのみを使用します。これにより、すべてのデータがページ フォームにあるため、URL がきれいに保たれます。

私が抱えていた唯一の問題は、ほとんどの場合、生の URL である page.form.action に正しい URL を設定することでした。

問題の原因がカテゴリ名である場合は、名前を英数字のみに制限し、スペースを「-」に置き換える必要があります。IIS は、ピリオド "." を含むグラグラをスローします。ファイル名を探すとき。

PS IIS はチルダ "~" を認識しません。これはコンパイラが認識するものです。そのため、アンカー タグで使用すると期待どおりに動作しないため、チルダの代わりにアプリケーション ルートを使用する必要があります。

編集:

OK、IIS の問題のように見えますが、. / と &。urlencode を実行しても、これらの IIS は独自の意味を実装しようとします。そのため、それらを削除することを検討してください:

ビバレッジ&バーがビバレッジバーに

ペストリー/デコレーションはPastryDecoratingになります。

これにより、URL がきれいに保たれますが、データベースに追加の列が作成されるため、この短縮されたカテゴリ名に対して URL を確認できます。

于 2009-08-17T15:57:04.227 に答える
1

私はまったく同じ問題を抱えています。素敵に書いていただきありがとうございます。実際、問題をよりよく理解するのに役立ちました。

ただし、他の考慮事項がいくつかありました。私が持っている目標の 1 つは、記事のタイトルに基づく URL に任意の文字が含まれる可能性をサポートすることです。さらに、エンコーディングと双方向のエンコード/デコード プロセスの一意性を確保したいと考えています。

そこで、問題を解決するために手動でエンコードを行いました。これでパーセント エンコーディングが完全になくなるわけではありませんが、エンコーディングが大幅に減少し、ユーザーがアクセスできない URL を生成するのを防ぐことができます。私のプロセスは、Server.URLEncode関数を使用することから始まります。しかし、これで URL の問題が解消されるわけではありません。IIS は URL をデコードしてからアプリケーションに渡すため、特定の文字は危険な要求例外で URL を壊します。これらの文字には+, &, /, !, *, ., (). したがって、これらの文字と他の文字を読みやすくしたい場合は、より使いやすい URL にするために二重エンコードを行います。URL で使用できる文字数が限られているため、エンコードも困難です。そのため、エンコードする前に、すべての文字を大文字にしてから、小文字でエンコードしました。これにより、完全にデコードできなくなりますが、一致させたい値を大文字にすることで、データベースまたはコードで簡単に一致させることができます。

さて、これが私のコードです。フィードバックをいただければ幸いです。ああ、これは VB ですが、C# に簡単に移行できるはずです。

Dim strReturn As String = Trim(strStringToEncode)
strReturn = Server.UrlEncode(strReturn)

strReturn = strReturn.Replace("-", "dash").Replace("+", "-")

strReturn = strReturn.Replace("%26", "and").
                    Replace("%2f", "or").
                    Replace("!", "excl").
                    Replace("*", "star").
                    Replace("%27", "apos").
                    Replace("(", "lprn").
                    Replace(")", "rprn").
                    Replace("%3b", "semi").
                    Replace("%3a", "coln").
                    Replace("%40", "at").
                    Replace("%3d", "eq").
                    Replace("%2b", "plus").
                    Replace("%24", "dols").
                    Replace("%25", "pct").
                    Replace("%2c", "coma").
                    Replace("%3f", "query").
                    Replace("%23", "hash").
                    Replace("%5b", "lbrk").
                    Replace("%5d", "rbrk").
                    Replace(".", "dot").
                    Replace("%3e", "gt").
                    Replace("%3c", "lt")

Return strReturn
于 2010-11-02T19:42:57.783 に答える
0

私はあなたが探していると思いHttpUtility.UrlEncodeますHttpUtility.HtmlDecode

string url = "http://www.google.com/search?q=" + HttpUtility.UrlEncode("Example");
于 2011-12-16T08:39:34.610 に答える