2009-07-06 15 views
0

私はユーザーからフォームを送信しています。もし私のスパムフィルターがキャッチしたら、ユーザーをキャプチャページにリダイレクトして、ボットではないことを確認します(reCaptchaはまだ壊れていないようです)。POST->セッション - >ページはどのように扱いますか? ASP.NET

私の質問は、元のページに戻るのをどうやって処理するのですか?

私は乱数を生成することができました(その番号の現在のセッションタグがあるかどうかを確認してください)、すべてのPOSTデータをオブジェクトにプッシュし、オブジェクトをses [randomId] = obj; GETデータ(?sesTag = randId)にIDを追加し、ユーザーがcaptchaを正しく渡したときにsesから取得データを取得します。これは良い解決策ですか?オブジェクトをセッションに入れることに問題がありますか?

投稿データを辞書にプッシュするにはどうすればよいですか?すべてのデータをdictにプッシュするforeachループを書くことができますか?または私はメモリを食べるのに十分なオブジェクトを取得しますか? (私は多くのキーを持っているHttpContext.Current.Request.Paramsを押しています)

答えて

0

これは良い解決策ではありませんが、使用する必要がある場合Request.Paramsをセッションに格納します。

Request.Params(またはRequest.Form)はNameValueCollectionです。これはシリアル化可能であるため、out-of-procセッション状態を使用していても問題なくセッションに格納する必要があります。 IOW、あなたは別の辞書にデータを引き出す必要はありません。

+0

あなたは* *する必要はありませんが、それは遠く好適サーバー側でのみ検証され、期待されるデータを保存することです。悪意のあるユーザーがポストにメガバイト(またはそれ以上)のデータを送信する可能性があります。また、数百(またはそれ以上)の異なるパラメータを送信することもできます。そのデータには、ログファイルビューアやセッションキャッシュエンジンなどの脆弱性を悪用するように設計された悪質な文字列が含まれる可能性があります。絶対にユーザー提供のデータを信頼し、それを未テストに保管してください。 – Cheekysoft

0

元のページにキャプチャを配置して悲しみを救うのはなぜでしょうか?

+0

キャプチャはスパムボットであることが疑われる場合にのみユーザーに表示されるためです。プログラマの悲しみをここに保存すると、その悲しみをすべてのユーザーに反映させるだけです。 – Cheekysoft

+1

スパムロボットの疑いがある場合は、元のページに追加してください。非表示にするか、必要なときに動的に追加することができます。 – chris

+0

クリスは正しい - 私は彼が描写する方法を意味した。可能なスパム候補がある場合のみ表示します。 – RichardOD

1

任意のパラメータを保存したり、処理したりしないでください。ユーザの投稿データを受け取るページは、どのパラメータを期待するか、どのフォーマットにするかを正確に把握しておく必要があります。

まず、それぞれの期待されるパラメータを検証し、検証がパスした場合 - スパムロボット基準を除いて - 検証されたパラメータを使用して、そのオブジェクトをセッションに保存します。キャプチャが成功すれば、それを取り戻すことができます。

あなたのコメントに応答して、編集

:セキュリティPOVから、あなたが高すぎるレベルで、建築家にあなたの関数をしようとしています。 「地元の知識」を持たないことで、選択肢はありませんが、セキュリティ上の問題を解決することができます。メソッド呼び出しをより低いレベルで導入する方法について考えてみましょう。

はここで緩く例を働いています:

は、各ページ/コントローラ/アクション/何でも、各アクションは、あなたのスパムボットフィルタを呼びましょう、(唯一のローカルコードは、それが自分のデータだ検証する方法を知っている)最初に自分のデータを検証してみましょう/リダイレクトコンポーネント/メソッドを使用して、スパムチェックする必要があるフィールド名と一緒に保持する有効なフォームデータを渡します。

あなたの方法では、潜在的な問題フィールドをスパムチェックし、データを保持して、re-captchaにリダイレクトすることができます。

擬似コードでは、スパムチェックが必要な各Webアクションでは、以下のようなことができます。 1つのメソッドコール などが必要です。

void someAction(untrustedData) { 
    trustedData = object; 
    trustedData.id  = makeInt(badData.id); 
    trustedData.name = safeCharsOnly(untrustedData.name); 
    trustedData.message = safeCharsOnly(untrustedData.message); # <-- spam-check this 

    fieldsToSpamCheck = ['message']; 
    successUrlBase = '/myapp/sandwiches/postMessage'; 

    if (!spamChecker.check(trustedData, fieldsToSpamCheck, successUrlBase)) { 
    // spamChecker will check specified params 
    // if not spam, it returns true 
    // if spam it sets a http redirect and returns false 
    return; 
    } 

    processData(trustedData); 

}

+0

私はあなたのコメントを読むhttp://stackoverflow.com/questions/1085764/how-do-i-handle-post-session-page-asp-net/1085806#1085806それは本当に問題ですか?私は、任意のページ/状況で使用する準備ができたジェネリック関数としてこのソリューションを使用したいと思います。 –

+0

それは問題ですか?何百ギガバイトものデータをセッションストアに入れてディスクをいっぱいにしたい場合は、それは問題ではありません。あなたのコードが進化し、6か月後に別々にリクエストを処理し始めたときに、悪意のあるデータがシステムにぶつかって欲しい場合は、それは問題ではありません。ああ、このコードをたくさんの場所で使用できるようにしたい - そのn倍の "not-a-problem" – Cheekysoft

関連する問題