专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Ruby教程 » rails:Rails安全导读【 5】 »正文

rails:Rails安全导读【 5】

来源: 发布时间:星期四, 2009年1月8日 浏览:2次 评论:0
  7. 用户管理

  — 几乎每个web应用都必须去处理授权和认证避免你自己重复造轮子建议你去使用通用插件但是请保持它们是最新些额外预防措施可以让你应用更加安全

  有些Rails可用授权和认证插件密码加密以后保存好于直接保存纯文本密码最流行插件是可以避免session定制restful_authentication 然而早期版本在某些情况下你即使没有用户名和密码也可以登陆

  每个新用户可以通过个带激活码链接电子邮件来激活他帐户帐户激活的后数据库里激活码那值会被设为NULL, 如果某人发送个这样请求他将被以第次激活用户身份记录到数据库里 (有机会成为管理员):

http://localhost:3006/user/activate
http://localhost:3006/user/activate?id=


  这是可能在某些服务器上 以id为参数这种方式如params[:id], 将会是nil然而这里有以个activation action里finder思路方法:

User.find_by_activation_code(params[:id])

  如果参数是nil那么SQL查询结果会是:

SELECT * FROM users WHERE (users.`activation_code` IS NULL) LIMIT 1

  这样在数据库记录里个激活用户就被查到返回这个结果攻击者就登陆了. 你能找到更多信息在我blog帖子里 不时更新你插件是明智. 此外你可以查看你应用找到更多这样漏洞

  7.1.暴力猜解帐户

  — 暴力猜解帐户攻击是使用登陆证书去尝试用更通用信息来阻断这种攻击可能需要输入个验证码.

  你web应用用户名列表可能会被拿去用组密码来做暴力猜解, 大多数人不使用复杂密码大多数密码是字典里单词和数字组合因此配备组用户名名单和个黑客字典个自动可能在几分钟的内就能找到正确密码

  这个大多数web应用会在它们不正确时候显示个通用信息 “用户名或密码不正确”如果显示信息是“用户名没有被找到”那么攻击者就会自动编制份用户名名单

  然而大多数web应用设计者都忽视了忘记密码页 当输入用户名或email地址时候这些网页往往很诚实就显示找到(没有找到)消息这使攻击者能够编制份可以暴力猜解帐号用户名名单

  在忘记密码这个网页上也显示个通用消息可以减轻这种攻击此外在某个ip地址多次登陆失败的后你可以要求输入个验证码但是请注意这不是个完全防弹做法 这些自动也可以频繁改变自己ip地址只是给攻击增加障碍

  7.2.帐户劫持

  — 很多web应用很容易劫持帐户为什么不能使它变得更困难呢 ?

  7.2.1. 密码

  想想这种情况个攻击者窃取了个用户session cookie因此他们可以共用同个应用如果这个应用可以很容易就修改了密码那么攻击者只需要几个鼠标点击就劫持了这个用户帐号或者如果修改密码表单容易受到CSRF攻击那么攻击者就会通过引诱受害者到个藏有制作好CSRF IMG -TAG网页来修改他密码对策是让修改密码表单不能被CRSF攻击当然在改变密码时候也需要用户去输入旧密码

  7.2.2. E-Mail

  然而攻击者也可以通过修改email地址来接管帐户当他修改email地址的后他会去个忘记密码网页可能个新密码就会被发送到攻击者电子邮箱里了对策是当修改email地址时候也需要输入个密码

  7.2.3. 其他

  依靠区别web应用可能有更多劫持用户帐户思路方法在许多情况下CSRF和XSS都有助于这样做例如Google Mail个CSRF漏洞在这个概念验证攻击中受害者会被引诱到个被攻击者控制站点在这个站点有个制作好IMG-tag, 该tag结果是发送个http get请求去改变Google Mail邮件过滤器设置如果这个受害者登陆到Google Mail攻击者会改变过滤器设置将他所有邮件转发到攻击者邮箱里这几乎和劫持整个帐户样邪恶对策是, 审核你web应用逻辑来堵上所有XSS和CSRF漏洞

  7.3. 验证码(CAPTCHA )

  — 个验证码是质问-响应测试以便于确定这个响应是不是被个计算机产生它往往通过让用户输入副字母被扭曲图片上来保护评论不被自动垃圾发布机器人侵害这个消极CAPTCHA主意不是去让用户证明他是个人而是让个机器人证明他是个机器人

  不仅仅是垃圾信息发布机器人是个问题 不要忘了还有自动登陆机器人个流行CAPTCHA API是reCAPTCHA , 它是显示来自于旧书两个单词扭曲图片它还增加了个直角线而不是种扭曲背景和早期CAPTCHAS做那样对文字高水平包装后者被破解了作为奖励使用reCAPTCHA有助于数字化旧书ReCAPTCHA 也有个同名Rails插件实现这个API

  通过这个API你可以得到两个key个公有key个私有key你必须把他们放到你Rails环境的后你可以在view层使用 recapcha_tags思路方法在controller层使用very_recaptcha思路方法如果校验失败very_recaptcha会返回false使用CAPTCHAs问题是它们很麻烦些视障用户对某些扭曲CAPTCHAs难以阅读这个消极CAPTCHA主意不是去让用户证明他是个人而是让个机器人证明他是个机器人

  大多数机器人是愚蠢它们检索网络并且把垃圾信息放到它们能找到个表单域里Negative CAPTCHAs趁机利用它们愚蠢在表单里包含个“蜜罐”人类用户可以通过JavaScript 和CSS来隐藏它

  这里有些如何通过JavaScript/CSS来隐藏‘蜜罐’域ideas:

  *

  放置这些fields到页面不可见区域

  *

  使这些元素非常小或者颜色和页面背景色

  *

  就让它们显示在页面上但是要告诉人类用户让它们为空

  大多数简单negative CAPTCHA就是个隐藏‘蜜罐’域在服务端你可以检测这个域值:如果它包含任意文本它肯定是个机器人然后你可以忽略或者是返回个有意义结果但是不把其保存到数据库里这种思路方法会让机器人感到满意并离开你这样做也会使用户更麻烦

  在Ned Batchelder's blog post你能找到更先进negative CAPTCHAs文章 :

  *

  包含个存储当前UTC时间戳字段并在服务端检查它如果它是太遥远过去或者是将来那么这个form是无效

  *

  随机字段名

  *

  包含个以上所有类型‘蜜罐’字段包括提交按钮

  请注意这仅仅是使你免于自动机器人骚扰而对于那些有针对性完全定制机器人则不能阻止因此在Negative CAPTCHAs可能不是很好保护措施

  7.4. 日志

  — 告诉Rails不要把密码放在日志文件里

  默认情况下Rails会记录到web应用所有请求但是日志文件会是个巨大安全问题它们可能包含登陆证书或是信用卡号码等等设计个web 应用安全理念应该是考虑如果攻击者获得(全部)访问web服务器权限会发生什么事情如果日志文件以明文列出secret和密码那么把它们加密保存到数据库里是完全无用通过在controller里filter_parameter_logging思路方法你可以在log文件里过滤某些请求参数这些参数会在log文件里会以 [FILTERED]标记

filter_parameter_logging :password

  7.5. 良好密码

  — 你发现去记住你所有密码是很难了吗 ?不要把它们都写下来可以用句容易去记住句子里每个单词首字母组合

  个叫Bruce Schneier安全技术员他分析了34,000个真实世界来自于MySpace钓鱼攻击用户名和密码这证明了大多数密码是很容易被破解20个最常用密码是:

password1, abc123, myspace1, password, blink182, qwerty1, **you, 123abc, baseball1, football1, 123456, soccer, monkey1, liverpool1, princess1, jordan23, slipknot1, superman1, iloveyou1 and monkey.

  有趣这些密码里仅有4%是字典里单词并且绝大多数实际上是字母然而黑客字典包含了大量今天密码并且它们尝试了各种(字母数字混合)组合如果你个攻击者知道你用户名并且你使用了弱密码那么你帐户会很容易就被破解

  个好密码是个长字母混合体由于这种密码很难去记忆所以最好是只输入个你很容易记住句子里每个单词个字母例如"The quick brown fox jumps over the lazy dog" will be "Tqbfjotld".注意这只是个例子你不应该使用众所周知短语组成这样密码它也有可能出现在黑客字典里

  7.6. 正则表达式

  — 在Ruby正则表达式里有个共同缺陷是匹配开始和结束^和$而不是A和z.

  Ruby用种和其他语言略有区别做法去匹配开始和结束这就是为什么很多Ruby和Rails书都犯这样那么这个安全威胁是如何样呢? 假设你有个文件model并且你像这样来验证这个文件名 :

File < ActiveRecord::Base
 validates_format_of :name, :with => /^[w.-+]+$/
end


  这个意思是说在保存的前这个model会验证仅由字母数字+和-组合文件名里增加里^和$以便文件名这个串从开始到结束都包含这些然而在Ruby里^和$匹配是行开始和行结束因此这样个文件名可以毫无问题通过这个过滤器 :

file.txt%0A<script>alert('hello')</script>

  由于%0A在URL编码里是个换行符所以Rails会自动将其转为"file.txtn<script>alert(hello)</script>". 这个文件名能通过这个过滤器这个正则表达式能直匹配到行尾其余都不重要正确表达式应该这样:

/A[w.-+]+z/
[source, ruby]


  7.7. 权限提升

  — 改变个单参数可能给用户未授权访问请记住每个参数都可能被改变不管你对它做了多少隐藏和混淆

  最常见使用者可能篡改是id参数比如在http://www.do.com/project/1, 1是id.它会给controller里params[:id]个可用值. 在这里你可能做这样事情:

@project = Project.find(params[:id])

  这对于某些web应用是没有关系但是如果用户没有权限去看所有projects就不行了如果用户把id修改成了43并且他不被允许看到那个信息他会想尽办法来访问它相反查询用户访问权限:

@project = @current_user.projects.find(params[:id])

  根据你web应用可能会有更多参数用户可以篡改经验告诉我们在未证明的前没有条用户输入数据是安全并且来自于用户每个参数都有可能被操纵

  不要被安全困惑和javascript安全愚弄了Mozilla Firefoxweb开发工具栏让你可以审查和修改每个form表单隐藏字段JavaScript能被用来验证用户输入数据但是也肯定不能防止攻击者发送带有意想不到数据恶意请求Mozilla FirefoxLive HTTP Headers插件记录每个请求并可以重复和改变它们这是个避开任何JavaScript验证简单思路方法而且即使是客户端代理也可以让你拦截来自互联网任意请求和响应



  本文出自 51CTO.COM技术博客



相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: