2

バックグラウンド:

私は非常に単純な投票ベースのサイト設定のコア機能を持っており、sqlite データベースを利用したピラミッドでうまく機能しています。このアプリケーションの最後の要件は、ユーザーごとに 1 日 1 票のみ許可することです。これは Cookie を介して行う必要があり、ユーザーは土曜日または日曜日に投票できないことが指定されています。

現在UnencryptedCookieSessionFactoryConfig、セッション管理とフラッシュ メッセージの処理に使用しています。

質問:

次の機能が必要であることを確認しましたが、ピラミッドのどのモジュールがそれを提供するかを判断できません (または他の場所を探す必要があるかどうか)。

  • ブラウザ セッション間で保持される各ユーザーの Cookie を作成します (複数の投票を防ぐ方法として、これが安全でないことは承知しています。それで問題ありません。)

  • ユーザーごとに 1 日 1 回の投票を許可します。

  • 24 時間が経過したら、ユーザーに新しい投票を行います。

  • 曜日 = 土曜日または日曜日の場合、すべての投票を防止します (これは、Cookie チェック ロジックの前に配置された datetime() チェックを使用することで簡単なはずです。

追加情報:

私の現在のデータベーススキーマは次のとおりであり、このままにしておく必要があります。

create table if not exists games (
    id integer primary key autoincrement,
    title char(100) not null,
    owned bool not null,
    created char(40) not null
);

create table if not exists votes (
    gameId integer,
    created char(40) not null,
    FOREIGN KEY(gameId) REFERENCES games(id)
);

現在の投票機能は次のとおりです。

@view_config(route_name='usevote')
def usevote_view(request):
    game_id = int(request.matchdict['id'])
    request.db.execute('insert into votes (gameId,created) values (?,?)',
                (game_id,now))
    request.db.commit()
    request.session.flash('Your vote has been counted. You can vote again in 24 hours.')
    return HTTPFound(location=request.route_url('list'))

ありがとう!

4

2 に答える 2

3

Cookie のみのセッション データ

ピラミッドに Cookie セッションを統合するには、pyramid_beakerを見てください。

Cookie のみを使用して整合性を保証する (およびユーザーが Cookie データを突っ込むのを避ける) には、暗号化された Cookie を使用する必要があります (セッション ベースの Cookie と暗号化オプションを参照してください)。

主な構成は次のようになります。

[app:main]
...
session.type = cookie
session.key = SESSION
session.encrypt_key = R9RD9qx7uzcybJt1iBzeMoohyDUbZAnFCyfkWfxOoX8s5ay3pM
session.validate_key = pKs3JDwWiJmt0N0wQjJIqdG5c1XsHSlauM6T2DfB8FqOifsWZN
...

session.key、Cookie の名前にすぎません。好きなように変更

上記session.encrypt_keyおよびsession.validate_key上記は、大きなランダム文字列の例にすぎません。それらを自分で生成し、非公開にする必要があります。

また、Cookie を適切に暗号化するには、AES 暗号の実装が必要です。インストールするpycrypto必要があります:

pip install pycryto

またmain、wsgi アプリケーションを作成する関数は、次のように変更する必要があります。

from pyramid_beaker import session_factory_from_settings
...

def main(global_config, **settings):
    ...
    config = Configurator(settings=settings)
    ...
    config.set_session_factory(session_factory_from_settings(settings))

これで、Cookie データをクライアント ブラウザに直接保存して、データの改ざんを回避できます。問題を解決する簡単な解決策は、この Cookie を期限切れにならないように設定し、最後に投票した日付を内部に保存し、今日が何日で、最後に投票した日に基づいて確認することです。

主な問題

現在の主な問題は、Cookie を削除したり、別のブラウザーを使用したり、単にブラウザーのシークレット ウィンドウ (chrome) やプライベート ナビゲーション (firefox) を使用したりするユーザーへの対応です。このユーザーはシステムにとって新しいユーザーのように見えるため、再度投票できます。

IMOを解決するには、サーバー側で制御するか、Cookieを削除するとユーザーの生活が実際に困難になり、投票を得るためにCookieを削除することが望ましくなくなるような方法でユーザーに罰を与える必要があります。

セキュリティとは、完全にハッキングできないシステムではありませんが、それを回避するためのコストが実際にはそれを行う利点よりも高いシステムを構築することです。

于 2013-06-07T17:33:30.030 に答える
1

その種の制御に Cookie を使用しても、最も単純な攻撃 (たとえば、別のブラウザーを使用する:)) を防ぐことはできません。しかし、あなたはそれを知っているようで、実際には気にしないので、大丈夫だと思います:

ユーザーが投票するたびに、現在の日付の値を含むフィールドを Cookie に追加します (また、有効期限を少なくとも 1 週間に設定する必要があります)。

次にユーザーが投票しようとするとき、土曜日か日曜日か (ユーザーの時刻設定に従って)、そのフィールドが存在するかどうか、および値が 1 日より古いかどうかを確認します。

Cookie の有効性を次の土曜日に設定すると、土曜日の場合はいずれにせよ Cookie が無効になるため、追加の検証メカニズムが得られます :)

于 2013-06-07T16:48:31.280 に答える