0

ファイルにSQLコマンドを書き込むプログラムを使用しています。

プログラムはルビです。特殊文字を適切にエスケープしていないことがわかりました。

エスケープを行う関数を見つけましたが、完全には正しくありません。

def escape_for_sql(s)
    s=s.to_s
    if s.nil?
    "''"
    else
        "'"+ s.gsub("'","\'")+"'"
    end
end

これまでルビーを使用したことがないので、誰かが私に正しい機能を提供したり、組み込みのメソッドがあるかどうかを教えてくれたりできますか?

ps外部モジュールをインストールできません

4

1 に答える 1

1

'このメソッドで文字列内の の出現を に変換したいだけだと仮定するとs\'これは機能するはずです。

def escape_for_sql(s)
  s=s.to_s
  if s.nil?
    "''"
  else
    "'" + s.gsub("'") { %q{\'} } + "'"
  end
end

puts escape_for_sql "hello, this 'is' a string"
# => 'hello, this \'is\' a string'

元の方法では、置換は二重引用符で囲まれていたため、バックスラッシュは挿入されませんでした。

編集

注: すべての MySQL 特殊文字を置き換えるには、以下のようにします。MySQL の特殊文字の一部のみを含めました。完全なリストについては、http://dev.mysql.com/doc/refman/5.0/en/string-literals.htmlを確認してください。また、カスタム エスケープ メソッドの使用にはセキュリティ上の懸念があることにも注意してください。

def escape_for_sql(s)
  s=s.to_s
  if s.nil?
    "''"
  else
    literals = %w{ % ' " \r \n }
    literals.each do |x|
      s.gsub!(/#{x}/) { '\\' + x }
    end
    "'" + s + "'"
  end
end
于 2013-08-15T14:42:24.237 に答える