网站安全性探讨(纯静态页的动态化尝试)

2013-08-25 21:04:01 +08:00
 leonwong
先来说说我的项目:

项目基于jsp开发,采用struts2+mybatis+spring三大框架。

由于事先做好了前端页面,是纯html,出于懒惰,暂且不想转化成jsp页面,所以用js来对其动态化尝试。

尝试包括:

1)表单提交:利用JQuery.ajax()提交表单到后台action,这里取代了form提交表单;
2)读取用户个人数据:同样也是用JQuery.ajax()方法:提交空值>>通过cookie中sessionid保持session>>session中存在用户的ID>>服务器根据用户ID返回特定用户的数据


困惑:

现在业务功能可以基本实现,能够保证让服务器识别到是哪个用户,但是还没设置token,所以暂时没办法确保用户是在特定页面提交的参数,这样也就给CSRF攻击提供了机会,这点经网友指正我已经认识到。

此外的问题就是:
1)js配合纯静态html于长远看,是否有前途?html纯静态页配合js动态化只是我的一个尝试,如果不好我并不会坚持;
2)为了防止CSRF攻击我还应该采取什么措施?
3)除了CSRF我还应该注意什么?
先谢谢各位!
6893 次点击
所在节点    程序员
33 条回复
leonwong
2013-08-25 21:11:56 +08:00
zzNucker
2013-08-25 21:28:10 +08:00
坚持纯静态HTML是没有意义的
既给程序员添加了复杂度 又不能给用户带来更好的体验

纯静态的页面我不知道如何使用CSRF token,因为你根本没办法从server带出任何信息,也就是说你这个页面的任何元素都可以不用通过server的信息直接构造出来,因此你从页面提交的任何信息都无法进行甄别来源。。。
kfll
2013-08-25 23:45:30 +08:00
leonwong
2013-08-26 00:02:46 +08:00
@kfll express框架我从来没接触过,不过这确实是一个新的解决思路,我可以看看学习一下express
aaronzheng
2013-08-26 00:03:15 +08:00
纯静态的HTML,你怎么获取ID~ 你总不能够直接在页面那里放个ID吧。。。
如果你的项目是纯粹的文章发布,评论部分交给另外的ifram做的话,还是可以行得通的。
leonwong
2013-08-26 00:10:06 +08:00
@zzNucker 3楼貌似用了express框架来实现前端请求验证,最根本还是ajax,我猜想如果运用成熟的js框架,纯静态其实也不是不行,但是这个观点有待考证.

的确坚持纯静态有点困难,也不适合我这个初学者.

我开始有点理解你说的CSRF token难以实现的问题了,因为貌似js文件是不是可以轻易被构造然后也可以轻易更改其提交参数?问题就在于此,token如果能轻易被构造那么验证就无从谈起,你的意思是这样吧?
leonwong
2013-08-26 00:11:55 +08:00
@aaronzheng 获取参数,比如用户id,可以通过ajax的回调方法给页面某个元素赋值,但是有点多此一举的感觉,因为动态页就轻易实现了,但是静态就是这么大费周章.
aaronzheng
2013-08-26 00:13:58 +08:00
@leonwong 我不知道你做的网站涉不涉及安全问题,如果按照你这样说的话,我直接做一个伪post,你就信息返回给我了,放只爬虫就可以直接把你数据库拖走了。
darcy
2013-08-26 00:34:06 +08:00
token可以从ajax api的后台接口中吐 写到cookie里每次请求时带上;敏感数据不要要jsonp获取,仍使用POST方法获取
undeadking
2013-08-26 00:39:42 +08:00
楼主还在坑里继续挖啊……防跨站不是在静态层面上能实现的东西,折腾js纯粹是自己和自己玩,别人看一下你的代码,分析出你post的动态页面地址就能进行攻击了
Frannk
2013-08-26 01:02:22 +08:00
我的看法是:
1. 我觉得纯HTML是很好的开发实践,让前端和后端完全分离,也便于API部署到不同的服务器,前后端的开发解耦,大家都很过瘾;
2. 不知道你的app是什么类型的,如果用户之间数据完全隔离(比如支付宝,dropbox吧),几乎没有什么CSRF的危险
3. 我在一个应用中直接禁止浏览器中url携带参数,每次进入app的时候,url直接变成app.xxx.com/,防止注入代码,但牺牲了app状态可以通过的url存储的能力,用户不能保存特别的状态到书签和分享(我觉得基本没有必要的特性)
4. GET 请求一律做成没有副作用的,只能读数据,不能改变数据
5. 做好参数携带javascript代码的防范,即便用户之间有共享的数据,也不会有风险
6. 十分敏感的操作引入二次验证,比如我要执行post的ajax(转账),需要用户提供token(类似支付密码),让后端允许这个操作的,加大csrf的难度。

总之我觉得不应该因为安全隐患放弃这么好的开发模式。请有经验的同学多给点这方面的经验吧。
msg7086
2013-08-26 02:02:25 +08:00
全程ajax最大的问题就是SEO吧。如果不在意SEO的话全程ajax我看不出什么问题。

防止跨站不是很大的问题吧,以前怎么做现在还是怎么做啊。

token可以存在url里 (用路由来导出到静态文件),或者存在js的变量表里。

在一定要验证页面访问次序的时候可以这么做。
PrideChung
2013-08-26 02:08:56 +08:00
不建议你这么搞,平白增加了HTTP连接次数,增加代码复杂度,对用户体验一点帮助都没有,还留下了安全隐患。
msg7086
2013-08-26 02:13:54 +08:00
看到了你之前发的帖子,那我就照着实际问题和情况说一下。

token是用来防止跨域一键请求的,也就是说要验证提交来源。
我就以v2ex现在的跨域作为例子。
<input type="hidden" value="abcde" name="once" />
表单里有这么个东西。这东西是怎么生成的呢?
1. 用户请求了本页面
2. 生成一个唯一字符串$once,写入用户session变量里
3. 生成本页面,把$once写入表单区域
4. 用户提交了回复
5. 将session里的$once与提交的once做对比,相同就pass,不同就重来

那么在ajax的情况下要怎么做呢?
1. 用户请求了静态页面
2. 静态页面向服务器索要唯一字符串
3. 服务器生成唯一字符串$once,写入用户session变量里,并返回给客户端
4. 客户端用jquery把$once写入表单区域
5. goto #1.4
leonwong
2013-08-26 10:16:07 +08:00
@aaronzheng 这也是我应该考虑的一点,网站安全至少要保证不被爬虫爬到,因为里边是用户的个人信息,有隐私安全的存在,如果不希望被爬虫拖走,您有什么好建议?
leonwong
2013-08-26 10:17:57 +08:00
@darcy 通常token应该都是存在session里,存入cookie会不会有不妥?
leonwong
2013-08-26 10:25:29 +08:00
@undeadking 我没有说一定要坚持啦,只是动态页面如果实现的话也是会暴露action提交的url信息,这样其实和纯静态页面配合js来说没什么太大区别,其实最关键的是我还想知道除了token还有没有别的防止因为暴露url而遭受攻击的办法?静态页动态化只是我的尝试,如果论证各方面都不足的话,我是不会坚持的
blahnice
2013-08-26 10:36:24 +08:00
struts2,安全性,呵呵
leonwong
2013-08-26 10:43:37 +08:00
@Frannk
谢谢你对这种模式的支持,我的安全需求是:
1、要求用户资料相互隔离,不能被爬虫爬到关键隐私信息;
2、能防止CSRF攻击。
如果用https的话,可能成本有点高。大概和微信公众平台管理页面,或者孔明社交管理平台差不多,我也参考过他们的源码,说实话才疏学浅看不明白,也可能是我仅学了jsp,其他平台语言尚未接触,所以看不懂。
另外,您说的第3点和第4点如何实现?(平台是jsp+tomcat服务器)
leonwong
2013-08-26 10:47:48 +08:00
@PrideChung 的确,我同意你这个看法,但是性能上暂时还在我的可接受范围内,但是可能后来复杂度一增加可能就不如意了,安全隐患其实连我自己都觉得这样很不靠谱,但是我之所以提出此类问题就是想知道不靠谱的地方在哪,一一例举出来,这样才可以找到靠谱的方式去解决,就好像玩网络攻防实验课一样,我觉得这样是一个不错的学习过程,谢谢你能参与进来讨论

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/80183

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX