2015-03-31 48 views
0
host = Host.find(i) 
    a = host.open_ports 

    openPorts = [] 

    a.split(",").each do |x| 
     openPorts << x 
    end 

这是建立在讨论Ruby on Rails, ","并添加到数组中。Ruby-On-Rails通过可访问端口创建报告

Finding.all.each do |p| 
     openPorts.each do |y| 
      if p.port == y 
       Report.create(:port => p.port, 
           :risk_rating => p.risk_rating, 
           :finding => p.finding, 
           :implication => p.implication, 
           :recommendation => p.recommendation) 
      end 
     end 
    end 

遍历数据库中的查找表并检查端口是否与我们上面创建的开放端口数组相匹配。如果有匹配,我们根据查找表中给定的值创建一个新报告。

即使存在匹配,问题是不会创建新报告。

任何帮助表示赞赏。

回答

0

不知道这是否有帮助,但我想告诉你如何清理实施一点。

host = Host.find(i) 
# I am assuming Finding#port is an Integer 
# if Finding#port is a String then just remove the .map(&:to_i) portion 
open_ports = host.open_ports.split(",").map(&:to_i) 
Finding.where(port: open_ports).each do |p| 
    Report.create(:port => p.port, 
       :risk_rating => p.risk_rating, 
       :finding => p.finding, 
       :implication => p.implication, 
       :recommendation => p.recommendation) 
end 

让我们从顶部开始

String#split返回一个数组,所以没必要把它推到一个新的。它确实创建了一个字符串数组,所以如果你需要整数#map(&:to_i)会为你做到这一点。我假定这是当前的问题,它是通过所有的Finding就是为什么不直接拔下整数例如"80" == 80 #=> false

下一页,而不是循环字符串比较一个与匹配端口? Finding.where(port: open_ports)这将通过open_ports产生像SELECT findings.* FROM findings where findings.port IN (YOUR_OPEN_PORTS_ARRAY)

查询然后我们刚刚经历的所有Finding S创建从这个有限的列表,而不是循环的报告,然后循环为好。

+0

对不起,迟到的回复,重新分类后得到排序,但你的答案接近于改变(一些其他小的愚蠢的错误),所以谢谢。 – MrYoshine 2015-07-21 10:44:46