在ROR中将参数发送到存储过程的安全方法

时间:2015-08-29 15:37:30

标签: mysql ruby-on-rails ruby-on-rails-4 activerecord sql-injection

我会更简单地得到我需要的答案而不会让你阅读很多代码。

MySQL存储过程:

CREATE PROCEDURE add_player
(IN name varchar(100),
 IN isTrue boolean)
BEGIN
  START TRANSACTION;

  insert into tags (name,is_player) values (name,isTrue);

  COMMIT;
END //

player_controller.rb

ActiveRecord::Base.connection.execute("call add_player('#{name}', #{is_player})")

我看到的两个问题(如果你看到更多 - 比如说):

  1. 如果name包含',则会中断通话
  2. sql注入 - 当我调用存储过程时,我不会使用?作为参数。原因是当我尝试使用?时,它无法正常工作。我还尝试将其更改为Player.where("add_player(?,?)",name,is_player)

1 个答案:

答案 0 :(得分:0)

你试过这样的事吗?

ActiveRecord::Base.connection.execute("call add_player(#{ActiveRecord::Base.sanitize(name)}, #{is_player})")

以下SO链接建议了另一种方法

using sanitize_sql_array to escape strings

唯一的问题是sanitize_sql_array不是公共方法