cookies 登录的安全问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
dxcqcv
V2EX    Javascript

cookies 登录的安全问题

  •  
  •   dxcqcv 2015-08-07 05:56:00 +08:00 9221 次点击
    这是一个创建于 3793 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网站希望改成后端只输出json,前端全部ajax请求的模式,也包括登录,那么问题来了

    前端这块,用户登录后,登录信息只能保存在cookies里,到期清空,安全性实在是低,有什么好办法吗?

    37 条回复    2015-08-10 08:59:31 +08:00
    582033
        1
    582033  
       2015-08-07 06:44:11 +08:00 via Android
    oauth2.0

    ssl也有必要.

    应该没什么太大问题了吧。
    OpooPages
        2
    OpooPages  
       2015-08-07 07:08:03 +08:00 via Android
    大多session也是基于cookie。

    如果是非浏览器客户端,或者oauth,每个访问都需要access_toke,其实原理跟cookie差不多。
    cnhongwei
        3
    cnhongwei  
       2015-08-07 07:17:05 +08:00 via iPhone
    现在所有的认证手段除硬件认证外,都是基于cookie的,怎么会不安全。但在cookie的设计上要防cookie盗用,并兼顾用户跟踪。
    ihciah
        4
    ihciah  
       2015-08-07 08:20:46 +08:00 via iPhone
    没有ssl的话可以考虑淘宝以前的做法,一段时间无用户活动可以提示用户重新登录
    jugelizi
        5
    jugelizi  
       2015-08-07 08:35:36 +08:00
    有效期 httponly 加密 就可以了
    ltttx
        6
    ltttx  
       2015-08-07 09:00:47 +08:00
    前后端分离,一般就不用cookie来保证用户认证登录了(比如 native app情况下),一般是基于 token或者 oauth,前者实现更简单点。token (hash)的话,一般是用户通过某种方式认证登录(比如基于https的 http basic 登录),然后返回一个token给用户,以后每次请求都必须带上token进行授权。
    imn1
        7
    imn1  
       2015-08-07 09:57:02 +08:00
    后端对重要操作二次询问密码,例如查看身份信息,改密码,加密保之类
    如果什么操作都重要,那就不该cookies登录
    jiaozi
        8
    jiaozi  
       2015-08-07 10:17:02 +08:00
    我们是前端ajax提交到后台,保存到session中的。从来木有用过cookie,都是用session的
    zhicheng
        9
    zhicheng  
       2015-08-07 10:20:08 +08:00 via Android
    @jiaozi session 是哪来的?
    sujin190
        10
    sujin190  
       2015-08-07 10:20:58 +08:00
    @aiden0xz 有区别么。。。
    sujin190
        11
    sujin190  
       2015-08-07 10:21:36 +08:00
    @jiaozi session的id就是保存在cookie中的。。。。
    jiaozi
        12
    jiaozi  
       2015-08-07 10:28:53 +08:00
    @sujin190 cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案
    jiaozi
        13
    jiaozi  
       2015-08-07 10:29:21 +08:00
    cookie 和session 的区别:

    1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

    2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    考虑到安全应当使用session。

    3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    考虑到减轻服务器性能方面,应当使用COOKIE。

    4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

    将登陆信息等重要信息存放为SESSION
    其他信息如果需要保留,可以放在COOKIE中
    breeswish
        14
    breeswish  
       2015-08-07 10:31:29 +08:00
    @jiaozi 然而 session 要通过 cookie 传递的亲……session id 是在 cookie 里的,id 所对应的 data 才是在服务器上..用着 session (基本)就得用 cookie..
    irainy
        15
    irainy  
       2015-08-07 10:33:37 +08:00 via iPhone   1
    jiaozi
        16
    jiaozi  
       2015-08-07 10:34:00 +08:00
    @breeswish cookie是不用写的,用了session,自动在客户端生成的吧。就是觉得登陆信息就应该用session。
    jiaozi
        17
    jiaozi  
       2015-08-07 10:35:03 +08:00
    @irainy 木有专业前端,前后都做的伤不起呀。。。
    breeswish
        18
    breeswish  
       2015-08-07 10:39:10 +08:00   1
    @jiaozi 确实有不用 cookie 传递 session 的办法,可以用 HTTPS Session 传递 Session,可以用 ETags 借助浏览器缓存传递 session,可以用 URL 传递 session,然而 OAuth 以外 99% 以上的 session 都是通过 cookie 传递的…

    TCP 自身是无状态的,总要有个地方「持久化记录」一个唯一标示符,浏览器提供的「可以让服务器在客户端保存一段信息以供后续使用」的这个功能叫做 Cookie。

    不信你清空 v2ex 上的 cookie 试试..看看 session 是不是丢失了
    breeswish
        19
    breeswish  
       2015-08-07 10:42:36 +08:00
    @jiaozi typo:<del>TCP</del> HTTP 自身是无状态的
    sujin190
        20
    sujin190  
       2015-08-07 11:04:13 +08:00   1
    @jiaozi 安全上没什么区别,我既然能伪造cookie保存的登录信息伪造登录,当然也能伪造sessionid伪造登录,反正你要有个信息来源于客户端不是
    irainy
        21
    irainy  
       2015-08-07 11:06:37 +08:00 via iPhone
    @jiaozi 现在不是流行全栈吗:D
    Sight4
        22
    Sight4  
       2015-08-07 11:48:39 +08:00   1
    首先,cookie 与 session 是息息相关的,session的标识是通过 cookie 的固定 key获取,比如 session_id 或者 jsession_id 等等,现在很多框架都会帮你实现隐藏的 session 功能。但实际上,在标准的HTTP协议上,根本没有我们所谈论的 session,session 是基于 cookie 的一种HTTP状态维持实现(RFC2109)

    其次,在很多精简的后端框架,压根是没有session这个东西,需要实现session,需要自己去写cookie,并且需要自己去序列化session信息保存,比如使用数据库,使用文件,使用缓存等等。而且写入cookie的key可以是你自己定义的任何值,比如 access_token、auth_token、abc或者任何你喜欢的

    然后,最近我们做了一个项目,是完整的前后端分离,使用的方法是使用token验证,而且涉及到不同后端应用的反向代理,实现一个分布式的 session 不太现实,我们要求各后端应用的设计各自实现自己的类session状态维持,但实际上,这种设计是不合理的,http的优势反而是无状态。

    最后,关于安全问题,除了增加无操作超时机制、多重验证的手段外,最能够防止 cookie 劫持的方法是使用 https。

    希望以上信息对你有用。
    CosWind
        23
    CosWind  
       2015-08-07 13:36:27 +08:00
    建议session用redis来做,后面做负载也不用考虑session共享的问题
    CosWind
        24
    CosWind  
       2015-08-07 13:38:01 +08:00
    抱歉,没看清楚是网站,惯性以为是app的
    br00k
        25
    br00k  
       2015-08-07 14:02:52 +08:00
    session的数据是存放在服务端的,但是session ID是写在cookies的。
    最简单提升安全度的方式自然是SSL,这样你的session ID就不会被人抓到了。
    Amit
        26
    Amit  
       2015-08-07 15:19:57 +08:00
    @Sight4
    https可以防止cookie劫持,但是考虑极端一点,如果别人可以使用你的浏览器,把cookies记录下来,这样是可以伪造cookies进行登录的吧。如果session设置超时自动销毁还好,但是许多地方都有记住密码功能,用户状态是长期保存的,这样的网站如果伪造了cookies是可以一直保持登录的吧
    freemind
        27
    freemind  
       2015-08-07 15:28:52 +08:00
    大多数网站登录信息保存都和cookie相关,只是说看你登录信息如何保存了,自己想一套token验证机制用cookie实现还是比较安全的,遇到cookie劫持另说。 没有绝对安全的系统。
    iyaozhen
        28
    iyaozhen  
       2015-08-07 15:40:41 +08:00
    首先 session 没有比 cookie 安全。

    下面都是一般的情况,安全要一步步来嘛:

    现在基本都是 ajax 做基本的前后端分离,用 session 的话和以前没什么区别(所有的接口验证 session)。session_id 通过 cookie 传递(httponly),你网页上的恶意脚本无法获取到 session_id,但抓包的话还是可以看见 session_id,这是时候 https 就登场了,在证书安全的情况下别人是无法获取你的 cookie 的(至于能获取到什么这个不清楚,求大神赐教)。

    楼主你是要在 cookie 里面存什么登录信息呀?一般的做法是存一个加密后的 “token”,这个 token 是有时效性的,可以在服务端反解出用户id/用户名。其实和 session 机制类似,这样做的好处就是统一认证接口,各个端、各个产品线、各个开发语言都可以用。当然还是不能防止别人复制你的 token 干坏事,请搜索关键词:CSRF 攻击。

    cookie、session 的问题至少还可以说 10 年,并不是一句“cookie 保存在客户端,session 保存在服务端”能解释清楚的。
    allce231
        29
    allce231  
       2015-08-07 15:57:00 +08:00
    登录注册都交给后台 cookie也是后台设置 httponly 退出登录都是交给后台清cookie
    hupeng
        30
    hupeng  
       2015-08-07 16:15:54 +08:00
    @jiaozi 有个问题,你的session怎么和用户对应起来,不还是客户端的cookie中的某个值来找到对应的session?
    outfocontrol
        31
    outfocontrol  
       2015-08-07 17:01:04 +08:00
    看有些回复似乎对 cookie 和 session 概念不是很清楚,我的理解是 session 和 cookie 根本是两个不同层次的概念,可很多文章非要把这两放在一起对比来说混淆读者。

    cookie 是与 http 协议和浏览器实现标准相关的一部分,cookie 和 http 头部的其它http头字段差不多,而 session 是服务器维持用户状态的一种机制,它对于 http 协议和浏览器来说是透明的,它们并不知道 session 的存在。

    由于http是无状态的,必须采取一种机制来追踪用户状态,session 的概念是这个,session 可以用不同的方式来实现,对 web 来说绝大部分情况都是用 cookie 来实现的,也有一些小众做法是在 url 上加 session id,或者在页面里加上个隐藏表单,session 实现的本质都是一样的,请求必须带上一个标识用户的信息,只不过在大部分情况下,这个信息都放在 cookie 中。
    zonghua
        32
    zonghua  
       2015-08-07 19:23:56 +08:00 via iPhone
    一般情况下都是session要依靠cookie保持的,比如jsessionid的那个cookie,马德好多教材都不说明这个
    janxin
        33
    janxin  
       2015-08-07 20:30:25 +08:00
    可以看一下JSON Web Token这个解决方案
    Sight4
        34
    Sight4  
       2015-08-07 21:05:15 +08:00 via Android
    @Amit 能使用你的浏览器已经属于社会工程的安全入侵问题,也不是服务端的设计能控制得来;无论session还是cookie还是token,在实际生产中都会控制超时,https只是提升安全系数,不是杜绝安全隐患。安全不是一方做得万无一失就高枕无忧,就好像,银行安全系数再高,被别人偷看了密码还是能把钱取出来是一个道理
    OpooPages
        35
    OpooPages  
       2015-08-07 22:00:27 +08:00
    jiaozi 是来赚@的,大家绕道! :)

    如同 @breeswish 所说,大部分session是需要cookie支持的,这也是最方便的一种。
    mornlight
        36
    mornlight  
       2015-08-08 02:03:19 +08:00
    你要这么想,淘宝、FaceBook、Google也还是用 Cookie 来保存用户状态...
    ltttx
        37
    ltttx  
       2015-08-10 08:59:31 +08:00
    @sujin190 为什么没有区别?你是指都是通过客户端传递某一种信息(cookie或者token)来是识别用户吗? 你伪造的途径是什么?(通过破解用户密码?)不管怎么样用户都得通过用户密码登录,如果这些信息泄露了,不管用什么方式都在根本上解决不了这样的安全问题的。当然我们只能预防这种情况,比如提供密码复杂度,限制api访问频次 etc。采用 session(cookie)一般是基于浏览器的做法,采用token一般app用的比较多。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1037 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 18:46 PVG 02:46 LAX 10:46 JFK 13:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86