Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 如何防止用户设置pyramid_烧杯使用的会话id cookie的值?_Security_Pyramid_Beaker - Fatal编程技术网

Security 如何防止用户设置pyramid_烧杯使用的会话id cookie的值?

Security 如何防止用户设置pyramid_烧杯使用的会话id cookie的值?,security,pyramid,beaker,Security,Pyramid,Beaker,我有一个使用金字塔烧杯的金字塔应用程序。以下是我的配置: # Options For Sessions and Caching: session.type = file session.data_dir = %(here)s/../../data/sessions/data session.lock_dir = %(here)s/../../data/sessions/lock # Session Options: session.key = session_id session.secure

我有一个使用金字塔烧杯的金字塔应用程序。以下是我的配置:

# Options For Sessions and Caching:
session.type = file
session.data_dir = %(here)s/../../data/sessions/data
session.lock_dir = %(here)s/../../data/sessions/lock
# Session Options:
session.key = session_id
session.secure = false
session.timeout = 3600
session.cookie_expires = true
session.cookie_domain = .mydomain.local
session.httponly = true
# Encryption Options:
session.encrypt_key = c]?wvL",ni3J.)d8(e~z8b-9Le=Anh'.QMytBj^Kukfi<79C$Cg22)cX;__xs6?S
session.validate_key = \2R('?pL]\Z_8?(o`.?.?^.RF6t*5pCh6PH`~aon%H`PX$;E}"((mu-@(?G<=!:+
# pyramid_beaker specific option
session.cookie_on_exception = true
现在,当用户想要登录时,视图呈现一个表单,并生成一个cookie
session\u id
。当用户提交有效表单时,将接受cookie的值来验证用户

没有任何内容阻止用户在提交表单之前更改cookie的值。根据,此行为显然是一个安全缺陷


那么,如何使用金字塔烧杯,以便服务器在登录成功时生成新的会话id值,而不是从cookie中获取该值呢?

金字塔的会话API提供了一种在提升权限时使会话无效的方法。您可以通过登录视图中的
request.session.invalidate()
执行此操作。金字塔烧杯本身支持
request.session.regenerate\u id()
来维护会话数据,但这不是金字塔会话API的一部分,只有在使用金字塔烧杯时才起作用。如果您担心用户猜测其他人的会话id,则此处会对您进行保护,因为如果您指定beaker的
session.secret
选项,则会对存储在cookie中的id进行签名。

Pyramid的会话API提供了一种在提升权限时使会话无效的方法。您可以通过登录视图中的
request.session.invalidate()
执行此操作。金字塔烧杯本身支持
request.session.regenerate\u id()
来维护会话数据,但这不是金字塔会话API的一部分,只有在使用金字塔烧杯时才起作用。如果您担心用户猜测其他人的会话id,则此处会对您进行保护,因为如果您指定beaker的
会话.secret
选项,存储在cookie中的id将被签名。

如何检查已签名的cookie是否已被客户端更改?如果客户端更改cookie,它将不是一个有效的会话,不会显示。在
headers=memory(self.request,login)
之前添加
self.request.session.invalidate()
解决了我的问题。但是,cookie似乎没有签名,因为我可以很容易地伪造一个值为123的cookie。我的第一次日志尝试被拒绝,因为CSRF测试失败,但第二次尝试成功,并且“123”成为有效值。如果cookie值未签名,则表示您没有在ini设置中设置
session.secret
。好的,这是真的。这就是为什么我没有使用这个秘密。为了确保我做了一个测试,我使用了我的原始登录视图(没有
self.request.session.invalidate()
),并设置了
secret
,我再也无法伪造一个以123为值的cookie,因此我的问题在不添加
self.request.session.invalidate()
的情况下得到了解决。我要找出烧杯文档的奇怪之处,然后回来。如何检查客户端是否更改了签名的cookie?如果客户端更改cookie,它将不是有效会话,也不会显示。在
头=记住(self.request,login)之前添加
self.request.session.invalidate()
解决了我的问题。但是,cookie似乎没有签名,因为我可以很容易地伪造一个值为123的cookie。我的第一次日志尝试被拒绝,因为CSRF测试失败,但第二次尝试成功,并且“123”成为有效值。如果cookie值未签名,则表示您没有在ini设置中设置
session.secret
。好的,这是真的。这就是为什么我没有使用这个秘密。为了确保我做了一个测试,我使用了我的原始登录视图(没有
self.request.session.invalidate()
),并设置了
secret
,我再也无法伪造一个以123为值的cookie,因此我的问题在不添加
self.request.session.invalidate()
的情况下得到了解决。我要找出烧杯文档的奇怪之处,然后回来。
def login(self):

    message_html = _('view.login.welcome-message', default='Please log in.')
    login_url = self.request.route_url('login')
    login = ''
    password = ''
    referrer = self.request.url
    if referrer == login_url:
        referrer = self.request.route_url('home')
    came_from = self.request.POST.get('came_from', referrer)
    csrf_token = self.request.session.get_csrf_token()

    if 'form.submitted' in self.request.POST:
        login = self.request.POST.get('login')
        password = self.request.POST.get('password')
        if csrf_token == self.request.POST.get('csrf_token'):
            if login in USERS:
                manager = BCRYPTPasswordManager()
                if manager.check(USERS[login], password):
                    headers = remember(self.request, login)
                    return HTTPFound(location=came_from, headers=headers)

        message_html = _('view.login.failed-login-message', default='Login failed!')

    return {
        'message_html': message_html,
        'url': login_url,
        'login': login,
        'password': password,
        'came_from': came_from,
        'csrf_token': csrf_token,
    }