我遇到了一个问题,试图解析预定义的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
答案 0 :(得分:2)
你有一个巨大的SQL injection hole,因为你没有在这里逃跑。直接使用MySQL驱动程序是一个非常糟糕的主意。至少使用像Sequel或ActiveRecord这样的数据库层。 MySQL被“扒”的唯一原因是因为你没有正确使用它,你必须逃脱。
对于这种混乱的最简单的解决方法是使用escape_string
方法,但是你需要为每一个值执行此操作,这很快就会变得乏味。一个合适的数据库层允许您使用参数化查询来处理转义,这就是我强烈鼓励的原因。
答案 1 :(得分:0)
myvariable.gsub!(/[\\]+/, '')