ruby:从字符串中剥去反斜杠

时间:2015-06-30 16:48:49

标签: mysql ruby regex string

我遇到了一个问题,试图解析预定义的nessus xml报告并将数据转储到mysql数据库中。我正在转储到数据库中的一些数据有以下字符,这显然使得mysql barf:'“\

我可以删除单引号和双引号,但是有一种方法可以逃脱逃生吗?请记住,一旦迭代,我就无法控制存储的内容。这是一个例子:

myvariable = "this is some bloated nessus output that has a bunch of crappy data and this domain\username" 

myvariable.gsub!(/\\/, '')

以下gsub不会删除反斜杠,因为它已经认为\ u已被转义。

这是解析nessus xml文件的实际代码:

#!/usr/bin/ruby
#
# Database Schema:                                                                                                                                                                                                                            
# VALUES(Id (leave null), start time, hostname, host_ip, operating_system, scan_name, plugin_id, cve, cvss, risk, port, description, synopsis, solution, see_also, plugin_output, vuln_crit, vuln_high, vuln_med)                             
#                                                                                                                                                                                                                                             
require 'mysql'                                                                                                                                                                                                                               
require 'nessus'                                                                                                                                                                                                                              

begin                                                                                                                                                                                                                                         



con = Mysql.new 'yourdbhost', 'yourdbuser', 'yourpass', 'nessusdb'                                                                                                                                                                                 
scanTime = Time.now.to_i                                                                                                                                                                                                                      

Nessus::Parse.new("bloated.xml", :version => 2) do |scan|                                                                                                                                       


    scan.each_host do |host| # enumerate each host                                                                                                                                                                                            
        start_time = host.start_time                                                                                                                                                                                                          
        next if host.event_count.zero? # skip host if there are no events to dump in the db                                                                                                                                                   

        host.each_event do |event|                                                                                                                                                                                                            
#            '#{event.see_also.join('\s').gsub(/\"|\'|\\/, '')}'                                                                                                                                                                              
#            '#{event.solution.gsub!(/\"|\'|\\/, '')}'                                                                                                                                                                                        
#            '#{event.synopsis.gsub!(/\"|\'|\\/, '')}'                                                                                                                                                                                        
            con.query( \                                                                                                                                                                                                                      
                "INSERT INTO nessus_scans VALUES \                                                                                                                                                                                            
                (NULL, \                                                                                                                                                                                                                      
                '#{scanTime}', \                                                                                                                                                                                                              
                '#{host.hostname}', \                                                                                                                                                                                                         
                '#{host.ip}', \                                                                                                                                                                                                               
                '#{host.operating_system}',\                                                                                                                                                                                                  
                '#{scan.title}', \                                                                                                                                                                                                            
                '#{event.plugin_id}', \                                                                                                                                                                                                       
                '#{event.cve}', \                                                                                                                                                                                                             
                '#{event.cvss_base_score}',\                                                                                                                                                                                                  
                '#{event.risk}', \                                                                                                                                                                                                            
                '#{event.port}', \                                                                                                                                                                                                            
                '#{event.description.gsub!(/\"|\'|\\/, '')}', \                                                                                                                                                                               
                NULL, \                                                                                                                                                                                                                       
                NULL, \                                                                                                                                                                                                                       
                NULL, \                                                                                                                                                                                                                       
                NULL, \                                                                                                                                                                                                                       
                NULL, \                                                                                                                                                                                                                       
                NULL, \                                                                                                                                                                                                                       
                NULL \)                                                                                                                                                                                                                       
                ")                                                                                                                                                                                                                            

        end # end xml file iteration                                                                                                                                                                                                          
    end # end scan.each_host iteration                                                                                                                                                                                                        
end # end host.each_event iteration                                                                                                                                                                                                           

rescue Mysql::Error => e                                                                                                                                                                                                                      
    puts e.errno                                                                                                                                                                                                                              
    puts e.error                                                                                                                                                                                                                              
ensure                                                                                                                                                                                                                                        
    con.close if con                                                                                                                                                                                                                          
end

2 个答案:

答案 0 :(得分:2)

你有一个巨大的SQL injection hole,因为你没有在这里逃跑。直接使用MySQL驱动程序是一个非常糟糕的主意。至少使用像SequelActiveRecord这样的数据库层。 MySQL被“扒”的唯一原因是因为你没有正确使用它,你必须逃脱。

对于这种混乱的最简单的解决方法是使用escape_string方法,但是你需要为每一个值执行此操作,这很快就会变得乏味。一个合适的数据库层允许您使用参数化查询来处理转义,这就是我强烈鼓励的原因。

答案 1 :(得分:0)

例如,您可以使用括号:

myvariable.gsub!(/[\\]+/, '')