- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用一个 gunicorn 服务器,我试图找出一种方法来限制每个用户名只有一个 session ,即如果用户 A 从 Chrome 登录到应用程序,他不应该能够通过 Firefox 登录,除非他登录在 chrome 之外,或者不应该能够在 chrome 本身中打开另一个 TAB。
如何为浏览器生成一个唯一的 ID 并将其存储在数据库中,以便在用户注销或 session 过期之前,用户无法通过任何其他浏览器登录。
最佳答案
将 session 限制到单个选项卡的一种可能方法涉及在页面加载时创建一个随机 token 并将该 token 嵌入到页面中。这个最近生成的 token 也存储在用户的 session 中。这将类似于各种框架添加验证 token 以防止 CSFR 的方式。攻击。
简要示例:
Token1
生成,嵌入并存储在session中Token2
生成、嵌入并存储在 session 中。这会覆盖之前的值。Token3
生成、嵌入并存储在 session 中。这会覆盖以前的值。此时,用户在 3 个选项卡中打开了页面。但是,用户的 session 只存储了 Token3
。此方法可防止用户被锁定(不同的 IP 地址、不同的用户代理字符串、隐身模式等),因为每个新 session 只会生成一个新 token 。最新的加载成为事件窗口,立即使所有以前的 session 失效。
接下来,每当页面与服务器交互(点击链接、提交数据等)时,页面中嵌入的 token 也会被发送。服务器验证传递的 token 是否与 session 中的 token 匹配。如果它们匹配,则操作成功。如果它们不匹配,则服务器返回失败消息。
您可以通过多种方式生成随机数,但您可能需要一些安全的方法。我们将使用 example来自另一个问题:
import string
import random
...
N = 20 # Length of the string we want, adjust as appropriate
''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))
这使用 random.SystemRandom
,这比简单地使用 random.choice
更安全
在页面加载时,您需要检查现有 token 是否有效,生成随机 token 并将其存储在用户 session 中。因为我们到处都想要这个,所以让我们先做一个装饰器,以减少以后的重复代码。装饰器检查 session 是否有效,如果无效,您可以选择要做什么(插入您自己的逻辑)。它还设置一个 session token 。这是必需的(或者您需要排除主页的逻辑),否则您将进入无限循环,用户尝试加载主页时,没有 token ,失败并重复该过程。我通过 else
子句在每个页面加载时重新生成 token 。如果你没有实现 if
部分,这个装饰器就毫无意义,因为两条路径执行相同的操作并且只是在页面加载时重置 token 。 if
中的逻辑将阻止用户进行多个 session 。
from flask import session
from functools import wraps
def random_string(length):
return ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(length))
def validate_token(f):
@wraps(f)
def wrapper(existing_token, *args, **kwargs):
if session['token'] != existing_token:
# Logic on failure. Do you present a 404, do you bounce them back to your main page, do you do something else?
# It is IMPORTANT that you determine and implement this logic
# otherwise the decorator simply changes the token (and behaves the same way as the else block).
session['token'] = random_string(20)
else:
session['token'] = random_string(20)
return f(*args, **kwargs)
return wrapper
现在在我们的路由中,我们可以将这个装饰器应用于每个路由,以便在每次页面加载时更新用户 session :
from flask import render_template
@app.route('/path')
@validate_token
def path(token=None):
return render_template('path.html', token=session['token'])
在您的模板中,您想在任何需要阻止 session 继续的地方使用此 token
值。例如,将其放在链接上、表单中(尽管 Flask has a method of CSRF protection 已经存在)等。服务器本身可以检查传递的 token 是否有效。该模板可能看起来像这样简单:
<a href="{{ url_for('path', token=token) }}">Click here to continue</a>
关于python - 如何限制来自任何浏览器的一个 session 以获取 flask 中的用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31281470/
我有一个 ServiceBusQueue(SBQ),它获取大量消息负载。我有一个具有 accessRights(manage) 的 ServiceBusTrigger(SBT),它不断轮询来自 SBQ
在下面给出的结果集中,有 2 个唯一用户 (id),并且查询中可能会出现更多此类用户: 这是多连接查询: select id, name, col1Code, col2Code, col2Va
我正在用 Python 2.7.3 编写一个带有 GRequests 的小脚本和 lxml 可以让我从各种网站收集一些收藏卡价格并进行比较。问题是其中一个网站限制了请求的数量,如果我超过它,就会发回
我想知道何时实际使用删除级联或删除限制以及更新级联或更新限制。我对使用它们或在我的数据库中应用感到很困惑。 最佳答案 在外键约束上使用级联运算符是一个热门话题。 理论上,如果您知道删除父对象也将自动删
下面是我的输出,我只想显示那些重复的名字。每个名字都是飞行员,数字是飞行员驾驶的飞机类型。我想显示驾驶不止一架飞机的飞行员的姓名。我正在使用 sql*plus PIL_PILOTNAME
我正在评估不同的移动框架,我认为 nativescript 是一个不错的选择。但我不知道开发过程是否存在限制。例如,我对样式有限制(这并不重要),但我想知道将来我是否可以有限制并且不能使用某些 nat
我正在尝试使用 grails 数据绑定(bind)将一些表单参数映射到我的模型中,但我认为在映射嵌入式集合方面可能存在一些限制。 例如,如果我提交一些这样的参数,那么映射工作正常: //this wo
是否可以将 django 自过滤器起的时间限制为 7 天。如果日期超过 7 天,则不应用过滤器 最佳答案 timesince 的源代码位于 django/django/utils/timesince.
我想在我的网站上嵌入一个 PayPal 捐赠按钮。但问题是我住在伊朗——这个国家受到制裁,人们不使用国际银行账户或主要信用卡。 有什么想法吗?请帮忙! 问候 沮丧 最佳答案 您可以在伊朗境内使用为伊朗
这是我的查询 select PhoneNumber as _data,PhoneType as _type from contact_phonenumbers where ContactID = 3
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个答案) 关闭
我的一个项目的 AndroidManifest.xml 变得越来越大(> 1000 行),因为我必须对某些文件类型使用react并且涵盖所有情况变得越来越复杂。我想知道 list 大小是否有任何限制。
在使用 Sybase、Infomix、DB2 等其他数据库产品多年后使用 MySQL 5.1 Enterprise 时;我遇到了 MySQL 不会做的事情。例如,它只能为 SELECT 查询生成 EX
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个回答) 关闭5年
通常我们是在{$apache}/conf/httpd.conf中设置Apache的参数,然而我们并没有发现可以设置日志文件大小的配置指令,通过参考http://httpd.apache.org/do
我正在搜索最大的 Android SharedPreferences 键值对,但找不到任何好的答案。其次,我想问一下,如果我有一个键,它的字符串值限制是多少。多少字符可以放入其中。如果我需要频繁更改值
我目前正在试验 SoundCloud API,并注意到我对/tracks 资源的 GET 请求一次从不返回超过 200 个结果。关于这个的几个问题: 这个限制是故意的吗? 有没有办法增加这个限制? 如
我正在与一家名为 Dwolla 的金融技术公司合作,该公司提供了一个 API,用于将银行信息附加到用户并收取/发送 ACH 付款。 他们需要我将我的 TLS 最低版本升级到 1.2(禁用 TLS 1.
我在 PHP 中有一个多维数组,如下所示: $array = Array ( [0] => Array ( [bill] => 1 ) [1] => Array ( [
我在获取下一个查询的第一行时遇到了问题: Select mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar JOIN(
我是一名优秀的程序员,十分优秀!