http://blog.chloerei.com/articles/33-be-careful-on-system-call
之前开发导出功能的时候,不小心引入一些安全漏洞。好在这些漏洞在没有被利用之前,就被我发现了并且修复了。我记录一下这些漏洞的产生,也许能给人一些启发。
对于大部分带拼字符串的命令行调用
system "cc #{foo} -o tmp/#{bar}"
全部改成这样就不怕注入了:
system *%W"cc #{foo} -o tmp/#{bar}"
利用 ruby 语法优势,只需要加 *%W
超简单...
试了一下@Rei 说的
> system "curl", "-o a.png //l.ruby-china.com/photo/5982eaaa64f467d9dbda03ad4f40ea27.png"
curl: no URL specified!
curl: try 'curl --help' or 'curl --manual' for more information
=> false
用 system "curl", "-o", "a.png", "//l.ruby-china.com/photo/5982eaaa64f467d9dbda03ad4f40ea27.png"
正常
> system "curl", "-o", "a.png", "//l.ruby-china.com/photo/5982eaaa64f467d9dbda03ad4f40ea27.png"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 12458 100 12458 0 0 11821 0 0:00:01 0:00:01 --:--:-- 553k
=> true
今天看 mini_magick 的源码,是用的 shellescape
https://github.com/minimagick/minimagick/blob/master/lib/mini_magick.rb#L452