<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>firebroo (firebroo)</title>
    <link>https://ruby-china.org/firebroo</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>差不多每周组织户外活动 (露营，徒步等) 有人感兴趣吗？</title>
      <description>&lt;p&gt;我在 v2 发过贴了，&lt;a href="https://www.v2ex.com/t/381665#reply15" rel="nofollow" target="_blank"&gt;https://www.v2ex.com/t/381665#reply15&lt;/a&gt; ，有一些朋友表示有兴趣加我微信了，但是不多，感觉做 it 的对这个好像不是很感兴趣阿。。其实真的说实话户外真的很好玩。。我本身是做安全的。群里的朋友基本都是 it。
&lt;img src="https://l.ruby-china.com/photo/2017/e8f02aac-50c9-45c5-bb86-da294459eb7d.jpg!large" title="" alt=""&gt;
有兴趣的扫二维码进群，可以先观察，我们会把每周出去玩的照片分享出来～～&lt;/p&gt;

&lt;p&gt;ps: 集合地都是在北京，所以仅限北京地区的朋友，玩的地方肯定不止北京，北京周边的山我们基本都走遍了～～&lt;/p&gt;</description>
      <author>firebroo</author>
      <pubDate>Thu, 10 Aug 2017 16:25:50 +0800</pubDate>
      <link>https://ruby-china.org/topics/33796</link>
      <guid>https://ruby-china.org/topics/33796</guid>
    </item>
    <item>
      <title>跳槽?</title>
      <description>&lt;p&gt;233&lt;/p&gt;</description>
      <author>firebroo</author>
      <pubDate>Wed, 08 Mar 2017 20:37:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/32485</link>
      <guid>https://ruby-china.org/topics/32485</guid>
    </item>
    <item>
      <title>写 Rails 可能产生的 SQL 注入</title>
      <description>&lt;p&gt;帖子&lt;a href="https://rails-sqli.org/" rel="nofollow" target="_blank" title=""&gt;地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AR 非常强大，我觉得 99% 的人不会有这种怪癖 SQL 需求和不会用字符串拼接去写 SQL，但是了解一下 SQL 注入也是好的：）&lt;/p&gt;</description>
      <author>firebroo</author>
      <pubDate>Tue, 27 Dec 2016 09:40:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/32008</link>
      <guid>https://ruby-china.org/topics/32008</guid>
    </item>
    <item>
      <title>用 Phoenix 实现了个简易的 Blog 应用</title>
      <description>&lt;p&gt;一周多前开始活跃于 ruby-china 社区，然后看到很多人讨论 elixir，还和 rails 做对比，当时一脸懵逼，没听说过这个语言。后来看了下官网的文档，发现确实有点牛逼，函数式语言，语法类 ruby，感觉很喜欢，然后看到有个杀手锏框架 phoenix, 所以磕磕碰碰开始学了起来，这几天学习的结果来看非常的小众，可参考的资料不多，差不多只有官网。所以我分享一下给刚学 phoenix 的人一些参考，&lt;a href="https://github.com/firebroo/phoenix_blog" rel="nofollow" target="_blank" title=""&gt;应用地址&lt;/a&gt;, 顺便求个 Star, 感谢&lt;a href="/phoenix" class="user-mention" title="@phoenix"&gt;&lt;i&gt;@&lt;/i&gt;phoenix&lt;/a&gt;，在他的 phoenix_china 里面我借鉴了很多，还有我也是才接触，希望老司机带带我。（最后我不会写前端，主要还是功能实现为主。。逃）&lt;/p&gt;</description>
      <author>firebroo</author>
      <pubDate>Thu, 20 Oct 2016 13:44:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/31391</link>
      <guid>https://ruby-china.org/topics/31391</guid>
    </item>
    <item>
      <title>RuCaptcha 的验证码可以被攻击重放？</title>
      <description>&lt;p&gt;初学 rails, 写了个 blog，然后上社区搜到了这个 &lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt;   写的 gem 做为验证码，因为我是做安全的，所有习惯性测试了验证码是否可以被复用，首先 chrome 开 f12，然后评论一条，copy 出数据包如下&lt;/p&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//www.firebroo.com/categorys/20/articles/11/comments' -H 'Cookie: _blog_session=eTBGSkNhYTlUWmYrSDlEN2k2TEV5NEwvRjhmTUdIQTQ3WUdFQ08vaXFhbnhEdGp6RTJHNjVqVmVFL3haVEtnZ2xBaE51ZUR3cTFIcGY3SWIzd2p0WXIxdG1QQWhBemNIUkJYV3B5SGIySmhERmhqNWpoc2lqdEJTSDJTclBaRG51VXpGaWgwenFDcWIrY2JqWWUrZHpKcG1NcExWbVNxNzBYRUV2M01VL0Jibk15TjVqZXBYRktsbWlnM2M5eDNCbWZrOE5XQzhqaUxDUmttWHNETHovSWg5MmZ4V25reDErUVVuaC9MTkVxZ3YrQlk0aFJUcFZwM0dmcFRkajZFUkRDeVllNVhyN1BtQkxQNXYydCtuQURMQ3Bhc0plMXMwYUNRRVp2eUMwWUZxRW9vcFRDUTNhalMxVFAyZVQ3YjdXM3FQTXoxbU1HWGVBajNEc0NDd2VZdHJlUU96Q0N4QlY0YS9VN0RLL0JodEpJMjF1SnpibjBUMURFK2FXL1V6UTI3bkM3ZFFrOVFnR0ZkY0E4cUpiL2s1SHB2WmpvRHRzUWpFK1gxeUh0eXJ4WStQMUZUYVRpdXlWZ2diMjVOZkZyNUxzdGJjOFJrUmdUZnhlM3grV3BsTjN3M3h5SGNlVzRmMEp6bHl3M0E9LS1WQlpNbzgvNjNNb201OGRYTVdPTHhBPT0%3D--d72e796e819742de283b32395b295ee6503be124' -H 'Origin: http://www.firebroo.com' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H 'Referer: http://www.firebroo.com/categorys/20/articles/11.html' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&amp;amp;authenticity_token=SLFcb%2FjeKgBJ2IyZ%2FgG5Itbcbv%2F9dftg8os6r1MZF9Msgk7imr7IcOev8b5Kdz0bOugb8NiQBhhVfH5vX%2F1MuA%3D%3D&amp;amp;comment%5Bcommenter%5D=firebroo&amp;amp;comment%5Bbody%5D=111&amp;amp;_rucaptcha=2d72&amp;amp;commit=%E6%8F%90%E4%BA%A4' --compressed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只要我多次不断执行这条命令，评论就会不断添加。达到绕过验证码实现重放攻击。
然后去 github 看了 verify_rucaptcha？函数，发现验证码设计流程应该是没问题的，无论验证码正确与否，都会被 session.delete 注销。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;verify_rucaptcha?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;rucaptcha_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:_rucaptcha_at&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;
  &lt;span class="n"&gt;captcha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:_rucaptcha&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;downcase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;

  &lt;span class="c1"&gt;# Captcha chars in Session expire in 2 minutes&lt;/span&gt;
  &lt;span class="n"&gt;valid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;rucaptcha_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="no"&gt;RuCaptcha&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expires_in&lt;/span&gt;
    &lt;span class="n"&gt;valid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;captcha&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;captcha&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:_rucaptcha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond_to?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:errors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'rucaptcha.invalid'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我打印过出重放请求时候的 session 的_rucaptcha, 发现和首次评论的验证码值一样，所以 session.delete 没有删除成功还是有啥缓存？&lt;/p&gt;</description>
      <author>firebroo</author>
      <pubDate>Fri, 14 Oct 2016 14:47:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/31324</link>
      <guid>https://ruby-china.org/topics/31324</guid>
    </item>
  </channel>
</rss>
