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

Safe way to send parameters to stored procedure in ROR

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

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)

你尝试过这样的事情吗?

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

在下面的 SO link

中建议了另一种方法

using sanitize_sql_array to escape strings

唯一的问题是 sanitize_sql_array 不是 public 方法