HashDoS脆弱性との戦い! Rubyコミッター・卜部昌平が明かすプログラム堅牢化のノウハウ 過去、HashDosの影響を受けたRuby。言語開発者はいかにしてこうした問題に対応してきたのでしょうか。コミッターである卜部氏の貴重な記録を公開します。 2011年の末頃、HashDoSという脆弱性が公表され、Rubyもこの影響を受けた。本稿の筆者である卜部昌平(うらべ・しょうへい/@shyouhei/以下、卜部)は、報告当初からRuby側のチームメンバーとしてプログラム本体の修正を担当した。以下はその記録である。言語開発者たちが普段どのようなことを考え、どういった技術を用いて開発やバグフィックスを行っているのか。その概要を知ってもらえれば幸いだ。 オブジェクト指向スクリプト言語 Ruby HashDoSの概要 なぜ約6年後の今、修正内容を公開するに至ったか? 前史:すでに内包されていたリスク
Posted by nagachika on 27 Oct 2014 REXML において XML のパラメータエンティティの展開によりサービス不能攻撃が可能となる脆弱性が報告されました。 この脆弱性は CVE-2014-8080 として CVE に登録されています。 ユーザーの皆さんには Ruby を更新することを強くお勧めします。 詳細 XMLドキュメントからテキストのノードを読み込む際にREXMLパーサーに極めて大きな String オブジェクトを生成させることで、マシン上のメモリを使い果たさせてサービス不能攻撃(DoS)を成立させることができます。 影響を受けるのは以下のようなコードです: require 'rexml/document' xml = <<XML <!DOCTYPE root [ # ENTITY expansion vector ]> <cd></cd> XML
Rubyで始める、すこし本気のプログラミング入門。「プログラミングってそもそもどういうこと?」からスタートして、最後には自分だけのRubyインタプリタをRubyで作ってみよう。Rubyを使ってゼロからプログラミングを学びながら、プログラムとは何か、プログラミング言語とは何かを味わうRuby入門の連載企画。 2017年01月18日 09時00分 プログラミング+ 第9回 インタプリタの完成、そしてブートストラップへ はじめてのプログラミングでRubyを学びながらRubyインタプリタを作っていく連載の最終回。 自分だけのRubyインタプリタを完成させていきましょう! 2016年12月21日 18時00分 プログラミング+ 第8回 関数を実装する(後編) 機能限定版のRubyインタプリタ(MinRubyインタプリタ)を作りながらRubyとプログラミングを学ぶ連載、今回は前回に引き続き「関数」の実
Elasticsearch の Ruby クライアントである elasticsearch-ruby を使って、例えばウェブページの検索フォームでユーザーの外部入力から検索を行う場合、外部入力された文字列を適切にエスケープすることが必要なはずです。適当にぐぐって調べてみましたけど、NoSQL なデータベースに対するインジェクション攻撃のようなトピックは意外と情報が少ない。 以下これまでに作業を行った Elasticsearch 関連のトピックです。新しいのが上。 Elasticsearch を Ruby から使う | EasyRamble ElasticsearchにMySQLからデータ挿入、JDBC River Pluginのインストールと使い方 | EasyRamble Elasticsearchのクエリとフィルターで簡単な検索を試す例 | EasyRamble Elasticsearc
rubyを書き始めて間もない頃、 「なんで NoMethodError なんだ...。あ、メソッド定義にself 付けたら通った。」 みたいなことがありました。 rubyの本を読んでいると、そのあたりがハッキリとイメージできるようになったのでまとめておきます。 参考にした本 年明けからひたすらRuby本を読んでいます。読了したのは以下。 現在は Effective Ruby を読んでいます。 これらを読んでいくと、中途半端に理解していた部分がカチッとハマるのでオススメです。 ※ 今回のコードは ruby 2.2.0 で試したものです。 オブジェクトとクラスの関係 サンプルコードを見てみましょう。 class C def c_instance_method @my_var = 1 end end obj = C.new 当初、自分はオブジェクトとクラスの関係を以下のように考えていました。 (
本書はRubyを使ったメタプログラミングについて解説する書籍です。メタプログラミングとは、プログラミングコードを記述するコードを記述することを意味します。前半では、メタプログラミングの背景にある基本的な考えを紹介しながら、動的ディスパッチ、ゴーストメソッド、フラットスコープといったさまざまな「魔術」を紹介します。後半では、ケーススタディとしてRailsを使ったメタプログラミングの実例を紹介します。今回の改訂では、Ruby 2とRails 4に対応し、ほぼすべての内容を刷新。Rubyを使ったメタプログラミングの魔術をマスターし、自由自在にプログラミングをしたい開発者必携の一冊です。 『メタプログラミングRuby 第2版』目次 読者の声 序文 はじめに Ⅰ部 メタプログラミングRuby 1章 頭文字M 1.1 ゴーストタウンと市場 1.2 メタプログラマのボブの物語 1.2.1 ボブの最初の試
たとえば、GCによる停止時間を減らす(Ruby) Feb 23 Ruby 速ければ速いだけ素晴らしい Rubyで実行速度に神経質になるのはナンセンスな気がするけど、それでもやっぱり遅いよりは速い方がいい。 そこで今回は、明日から実践できる最適化テクニックを紹介する。 ここで触れるのはGCのチューニングではなく、明日から実践できるコーディングのテクニックである。 GCによる停止時間を減らすということ Rubyプログラムの実行速度が遅くなる理由の一つとして、GCの実行による停止時間が挙げられる。 というのもGCの実行時は、GCが正常に処理を終了するため、実行中のプログラムが一時停止してしまうためである。 これはmalloc/freeから解放された代償として許容しなければならないことであるが、できることならばこのGCによる停止時間を減らしたい。 GCは、メモリを確保している不要になったオブジェク
Help us understand the problem. What is going on with this article? Rails3.2からRails4.2に上げたらActiveRecordが遅くなったので、どうやって調査して、どのように対処したかを語ってみたい。 とても長いので、ダルい人は最初と最後だけ読めばよいです。 TL;DR 環境: Ruby 2.1.5 ARオブジェクトを大量に(ざっくり750kくらい)loadするバッチ処理 3.2系での実行時間は約480sec、 4.2系では約2900sec 約6倍の性能劣化 原因: preloadで性能劣化してた CollectionProxyの生成周りで遅くなってた Rails4からARオブジェクトの1attribute毎にObject生成するので遅い GCの時間も増えた 調査方法: Githubのcommit、Issueを
はじめに これは ドリコムAdventCalendar の1日目です はじめに 1日目:ドリコムを支える中間ポイントシステム 一応自己紹介 プリキュアおじさん 嫁はキュアピース 開発の背景 ソーシャルゲームの歴史 中間ポイントについて 前受金と資金決済法について 有償ポイントと無償ポイント 複雑な売上計算 ドリコムの中間ポイントシステム(dpoint)について 自分の役割 重要なこと dpointが導入されているアプリ 課金フロー iTunesでの中間ポイント購入 GooglePlayでの中間ポイント購入 ポイント消費 dpointのリリースノート gemのボリューム date_discreterというgemを作りました どういうgem? 月の歯抜けを調べる 日の歯抜けを調べる 時間の歯抜けを調べる dpoint改修時のつらみ DBのスキーマ変更する場合は導入してるアプリ全部での影響を調べ
bashの脆弱性(CVE-2014-6271など)によって、PerlやRubyのCGIからsystem関数などOSコマンドを実行するプログラム言語の機能を使うと、 UserAgent などブラウザから送信されたデータが環境変数に格納された状態でbashが起動し、ShellShockが発生するという話が話題になっているが、本当にそうなのか。 実験 次の処理系で実験した。 Perl(5.20.0) Ruby(2.1.3) PHP(5.6.0) Python3(3.4.1) コード OSコマンドのenvを呼び出して表示するだけのCGI。 Perl #!/usr/bin/env perl print "Content-Type: text/html;\n\n"; print system('env');
先日ISUCONが行われていた。 ボクは出場してなくて、Twitterから観戦しているだけだったんだけどisuconタグを眺めていると以下のスライドが流れてきた。 今回2位だったpixivチームのkatatsuyさんがisucon前に作っていた神資料らしい。 読んでみたが、なるほど、広告サーバーの構築時の苦労や知見が素晴らしくまとまっている。 で、スライドの最後のほうにおすすめの書籍が記されててそこに『なるほどUnixプロセス - Rubyで学ぶUnixの基礎』があったので購入して読んでみた。 親プロセス、子プロセス、fork、ファイルディスクリプタ、ゾンビプロセス、デーモンプロセス、プロセスグループ、セッショングループ、シグナル、ストリーム、パイプ、IPC、ソケット、コピーオンライト これらの用語の中で説明できない言葉があるRubyエンジニアはこの本を読むと良い。 どれもUnixプログラ
先日、ラクガキサービスLeenoのAPIをラップしたgemを公開しました。 http://rubygems.org/gems/leeno ソースはこちらから。 https://github.com/soplana/leeno ということで、今回gemを作成する手順をサンプルgemを作成しながら備忘録として残しておきます。 今回サンプルで作成するgemはto_gunmaというgemで、最近流行りの「◯◯県は群馬県になりました。」というメッセージで有名な「ぐんまのやぼう」というアプリに肖って、[].to_gunmaみたいに呼び出すと、"Arrayは群馬県になりました。"ってメッセージが帰ってくるだけのショボイgemを作ろうと思います。 グンマーがRubyのオブジェクトを制圧するgemという事です。 グンマー凄い。 gemを作成する方法としてはいくつかあるようですが、今回はbundlerを使用し
Ripperの出力とかParseletの解析結果などを扱うのに、ArrayやHashでパターンマッチして中身を取り出す処理を多用する必要があったのでパターンマッチライブラリを作りました。 GitHub: todesking/patm 同様のライブラリとしてはpattern-matchがあります。 機能面ではpattern-matchのほうが豊富ですが、PATMは高速なのが売りです(DSLによるメソッド定義を使用した場合、ネイティブRubyコードにコンパイルされるため50倍くらい速い。case式内で使用した場合でも7倍程度)。ベンチマークについてはこの記事の下のほう参照。 主な機能 DSLによるメソッド定義 extend Patm::DSL することで define_matcherを使ったメソッド定義が可能です。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
こちらの記事でターミナルで雪を降らせるRubyスクリプトを知る。 Let it Snow in the Terminal of Mac OS X with This Command そのスクリプト。 ruby -e 'C=`stty size`.scan(/\d+/)[1].to_i;S=["2743".to_i(16)].pack("U*");a={};puts "\033[2J";loop{a[rand(C)]=0;a.each{|x,o|;a[x]+=1;print "\033[#{o};#{x}H \033[#{a[x]};#{x}H#{S} \033[0;0H"};$stdout.flush;sleep 0.1}' 感動した。 カラー化した。 ruby -e 'C=`stty size`.scan(/\d+/)[1].to_i;S=["2743".to_i(16)].pack("
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く