将参数发送到 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})")
我看到两个问题(如果你看到更多 - 说):
- 如果
name
包含 '
它会中断调用
- 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 方法
我会让你更简单地得到我需要的答案,而不需要让你阅读大量代码。
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})")
我看到两个问题(如果你看到更多 - 说):
- 如果
name
包含'
它会中断调用 - 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 方法