Python编程用户发贴cookie id等问题求解
初学web编程,有些问题不是很理解:
假设用户已登录,然后发帖。在发帖表单中,我有一个隐藏的表单,value是当前登录用户的id,用户提交后该id将作为作者的字段写入数据库。
但是,当用户将这段id改成其他用户的id,一样可以成功写入,这样帖子就变成别人发布的了。于是,我就想把当前用户的id保存在cookie里,不知道这种方法是否可行?
如果按照上面的方法,假设用户修改了cookie的id,那岂不是也可以伪造他人发帖了?
做登录就别用cookie了,用session吧,cookie存在客户端,可以被任意修改,session存在服务器端,相对安全。
web登录通常在用户登录后将userid写到session里面,在用户发帖提交后,直接从session取出userid存入数据库。
永远不要相信用户输入的数据。
简单分析一下你说的问题:
用户在发帖的时候,伪造一个其他合法用户的身份标识,来与服务器端进行交互。这在密码学中叫仿冒攻击(仿冒者可以是非法用户或者其他的合法用户)。其中发帖这个动作可以抽象成与服务器端的所有涉及到身份验证的交互。这个问题不仅仅只存在于Web编程。通常来说,你的登录问题解决了,这个问题也就不是问题(因为在合法用户的每一次交互中,服务器端必定有可以标识该次请求来源身份的信息)。
下面说一下解决方法:
在Web编程中,服务器端会维持一个session,用于标识每个用户的身份信息,这个session在同一用户的每次请求中都可以获取到。对于一些关键的操作,往往会根据当前的时间戳和服务器端session中保存的用户身份信息生成一个token,用以唯一标识当前操作,当用户发帖时,这个token会提交到服务器,服务器端再从session中取出用户的身份信息按照同样的算法生成token,二者进行比较,一致则允许提交,否则拒绝。
对于客户端编程,原理是一致的。只是用户身份信息在服务器端存储的地方不同而已。
思路完全错了。
表单提交时用户信息绝对不能用客户端提交过来的信息
通常的做法是:使用request.cookie
保存用户已登陆后的信息。比如说用户登录部分的代码
def login(username, password): do_login_here(username, password) request.cookie['is_login'] = True request.cookie['login_username'] = 'some_username'
然后在接收POST的函数里
def take_post(request): validate_user(request) validate_post(request) save_post(request)
另外,关于用户注册、邮箱验证、用户登录、用户注销等一系列动作,强烈推荐Flask-Security这个神器。真是谁用谁知道啊…
我没怎么写过web 程序,我觉得这个问题可能可以这样解决:
- 用户登录时随机生成个什么什么值,存到cookie里
- 发帖时传这个cookie 跟你服务端存的值做比对,来判断是哪个用户
一般会使用session
登录成功后多存一个$token1到cookie中,这个$token1是根据用户信息(比如帐号、密码、useragent等)生成的加密字符串
之后
根据cookie中的uid在数据库中查出用户生成$token2
用cookie中存的登陆时生成$token1与$token2对比,如果对比相等就证明可信了。
我一般都放到memcached层,速度还快 木有多余文件 到时间一样过期,然后获得的隐藏表单可以做对比,当然也可以直接用memcached获取的数据,要是做对比的话 你用正则过滤下除了数字之外的字符(用户id一般都是数字),避免sql.
永远不要相信用户输入的数据
设计的时候应该做一个加密字符串用于验证
发帖信息在服务端加进去,值是session id获得的,别人无论怎么改都无法更改你服务端信息吧。
玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd20378.html
相关文章 Recommend
- • 2019年3月最新消息: Python 3.4.10 现已推出
- • [上海]招Python量化系统开发工程师
- • 优集品网络科技有限公司招Python中/高级工程师
- • 爱因互动科技发展有限公司招募Python开发攻城狮
- • mozio招聘Python/Django工程师
- • Kavout金融科技公司招Python研发工程师
- • Python数组逆向输出,编程练习题实例四十
- • Python数组插入排序,编程练习题实例三十九
- • Python矩阵for循环应用,编程练习题实例三十八
- • Python操作Redis数据库方面的问题
- • 请python高手帮我看看这段python代码中函数setter的
- • Python什么方法可以快速将两个队列变成字典
必知PYTHON教程 Must Know PYTHON Tutorials
- • python 解释器
- • python idle
- • python dir函数
- • python 数据类型
- • python type函数
- • python 字符串
- • python 整型数字
- • python 列表
- • python 元组
- • python 字典
- • python 集合
- • python 变量
- • python print
- • python 函数
- • python 类定义
- • python import
- • python help
- • python open
- • python 异常处理
- • python 注释
- • python continue
- • python pass
- • python return
- • python global
- • python assert
- • python if语句
- • python break
- • python for循环
- • python while循环
- • python else/elif
- • lambda匿名函数
必知PYTHON模块 Must Know PYTHON Modules
- • os 模块
- • sys 模块
- • re 正则表达式
- • time 日期时间
- • pickle 持久化
- • random 随机
- • csv 模块
- • logging 日志
- • socket网络通信
- • json模块
- • urlparse 解析URL
- • urllib 模块
- • urllib2 模块
- • robotparser 解析
- • Cookie 模块
- • smtplib 邮件
- • Base64 编码
- • xmlrpclib客户端
- • string 文本
- • Queue 线程安全
- • math数学计算
- • linecache缓存
- • threading多线程
- • sqlite3数据库
- • gzip压缩解压
最新内容 NEWS
- • django app提供pv信息的方法是什么
- • Django项目版本升级如何操作?
- • django较多数据传递如何优雅的呈现
- • django1.7获取参数问题求助
- • Django1.7使用内置comment遇到问题
- • python mysql数据库做insert操作时报_mysql_ex
- • 关于python mysql的duplicate insert机制的疑问
- • pymongo使用insert函数批量插入被中断要怎么
- • Python程序员解决棘手问题的常用库
- • 求助关于restfull api接口几个问题
图文精华 RECOMMEND
-
django1.7获取参数问题求助
-
Python程序员解决棘手问题的常用库
-
求问str()同__str__原理上有什么不同
-
scrapy框架里面用link extractor怎么能
-
python {}.fromkeys创建字典append添加操
-
python3 类型Type str doesn't support th
热点文章 HOT
- 学习Python有什么好的书籍推荐?
- Python匿名函数 Lambda表达式作用
- Python与Java、C、Ruby、PHP等编程语言有什么
- Python 正则中文网页字符串提取问题
- 如何为实时性应用存取经纬度?django my
- 想用python做个客户端,在二维码登录这个地
- 有让IDE可识别Python函数参数类型的方法吗
- Python字符串转换成列表正则疑问