私は、Ruby に習熟しようとしている PHP 開発者です。私が現在取り組んでいるプロジェクトの 1 つは、いくつかの Web プログラミング言語で Web アプリケーション ファイルをスキャンして潜在的に危険な機能を探すソース コード監査ツールです。一致が見つかると、スクリプトはpoi
後で表示するために関連情報を (関心のあるポイント) クラスに保存します。
そのクラスのインスタンスの例は、次のようになります (YAML でモデル化されています)。
poi:
file_type: "php"
file: "the-scanned-file.php"
line_number: 100
match: "eval()"
snippet: "echo eval()"
展示では、これらの興味深い点を次のように整理したいと思います。
- file_type
-- file
--- match (the searched payload)
poi
したがって、プレゼンテーションの前に、オブジェクトのフラット配列を上記の構造を反映したハッシュに構造化しようとしています。これにより、ハッシュ内のアイテムを単純に反復処理して、目的の画面上の編成を生成できます。(または、少なくとも、それが計画です。)
さて、私の質問ですが、Ruby でそれを行うにはどうすればよいでしょうか?
PHP では、次のようなことを非常に簡単に行うことができます。
<?php
$sorted_pois = array();
foreach($points_of_interest as $point){
$sorted_pois[$point->file_type][$point->file][$point->match][] = $point;
}
?>
私はこの考えをPHPからRubyに次のように翻訳しようとしましたが、役に立ちませんでした:
sorted_pois = {}
@points_of_interest.each_with_index do |point, index|
sorted_pois[point.file_type.to_sym][point.file.to_sym][point.match.to_sym].push point
end
私はこれに数時間を費やしましたが、この時点で頭を壁にぶつけているようなものなので、おそらく私はベースから外れています. Rubyでこれを処理する適切な方法は何ですか?
アップデート:
参考までに、これは私が定義した正確な方法です。
# sort the points of interest into a structured hash
def sort
sorted_pois = {}
@points_of_interest.each_with_index do |point, index|
sorted_pois[point.file_type.to_sym][point.file.to_sym][point.match.to_sym].push point
end
end
これは、コードを実行したときに受け取るエラーです。
./lib/models/vulnscanner.rb:63:in `sort': undefined method `[]' for nil:NilClass (NoMethodError)
from /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `each_with_index'
from ./lib/models/vulnscanner.rb:62:in `each'
from ./lib/models/vulnscanner.rb:62:in `each_with_index'
from ./lib/models/vulnscanner.rb:62:in `sort'
from ./webapp-vulnscan:69
62 行目 (ご想像のとおり) は、特に次の行です。
@points_of_interest.each_with_index do |point, index|
追加の参考として、@points_of_interest
YAML に変換したときの (一部の抜粋) を次に示します。
- !ruby/object:PoI
file: models/couponkimoffer.php
file_type: php
group: :dangerous_functions
line_number: "472"
match: `
snippet: ORDER BY `created_at` DESC
- !ruby/object:PoI
file: models/couponkimoffer.php
file_type: php
group: :dangerous_functions
line_number: "818"
match: `
snippet: WHERE `company_slug` = '$company_slug'
- !ruby/object:PoI
file: models/couponkimoffer.php
file_type: php
group: :dangerous_functions
line_number: "819"
match: `
snippet: ORDER BY `created_at` DESC