Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用RubyonRails清理用户输入_Ruby On Rails - Fatal编程技术网

Ruby on rails 使用RubyonRails清理用户输入

Ruby on rails 使用RubyonRails清理用户输入,ruby-on-rails,Ruby On Rails,我正在编写一个非常简单的CRUD应用程序,它将用户故事存储到数据库中,以便另一位同事可以为我们正在进行的项目组织它们。但是,在将用户输入保存到数据库之前,我遇到了一个问题,即对用户输入进行清理。我无法从故事模型中调用sanitize()函数来去除所有html/脚本。它要求我做以下工作: def sanitize_inputs self.name = ActionController::Base.helpers.sanitize(self.name) unless self.name.nil

我正在编写一个非常简单的CRUD应用程序,它将用户故事存储到数据库中,以便另一位同事可以为我们正在进行的项目组织它们。但是,在将用户输入保存到数据库之前,我遇到了一个问题,即对用户输入进行清理。我无法从故事模型中调用sanitize()函数来去除所有html/脚本。它要求我做以下工作:

def sanitize_inputs
  self.name =  ActionController::Base.helpers.sanitize(self.name) unless self.name.nil?
  self.story = ActionController::Base.helpers.sanitize(self.story) unless self.story.nil?
end
我想验证用户输入是否已被消毒,我不确定两件事: 1) 什么时候应该进行用户输入验证?在保存数据之前,我想这是很明显的,但是,在验证之前,我应该在控制器中处理这些内容,还是在验证用户输入没有脚本/html标记之前,在其他一些不明显的区域处理这些内容? 2) 为这个模型编写一个单元测试,除了将“这是一个恶意代码示例”与sanitize(示例)输出进行比较外,我如何验证脚本/html是否被删除


提前感谢。

有两种方法可以消除XSS漏洞:

A.在将内容存储到数据库之前对其进行过滤(您正在尝试执行的操作)。这里有两个插件可以为您实现这一点

B.在显示内容时对其进行过滤(Rails 3默认情况下进行过滤)。您可以使用
h
功能或使用


与您的第二个问题一样,我认为您的单元测试应该只测试是否调用了清理方法,而不是功能本身(因此,一个简单的基本示例断言就可以了)。默认情况下,消毒功能/插件已经经过了很好的测试。

我认为关于消毒输入的普遍共识是——不要。存储用户输入的输入,并在输出时使用
sanitize
helper。(例如,


也就是说,您可以始终使用中提到的
strip_标记
helper。

这不完全是一个答案,而是一个提醒:rails 3默认情况下会清理用户输入。感谢指向acts_as_sanitized和xss_terminate的指针。我想这也归结为我需要使用xss_terminate或自己使用。我刚刚发现xss_terminate在Ruby 1.9中异常,并将所有数据库字符串返回为“[]”的艰难方式。如果您使用HTML5libSanitize,另一个问题是它依赖于非常缓慢且不再受支持的Ruby HTML5lib实现。我不同意不清理用户输入的普遍共识。按照这个想法,我们将不会扫描驱动器上的文件以查找病毒。我认为在这种情况下,适当的纵深防御是投入和产出的最大努力。由于这个应用程序没有任何特殊的标记(没有bb代码等),我认为没有理由不从输入中删除任何看起来可疑的内容,也没有理由不让数据库中的逻辑炸弹等待执行。总有比你更聪明的人,是吗?永远不要冒险永久破坏用户输入。如果你不能在输出时捕捉到数据库中的“逻辑炸弹”,那么你无论如何也无法在输入时捕捉到它。坏人可以插入代码来利用数据库中的插入漏洞,因此你必须在插入之前对其进行清理!当然,如果要手动构建数据库查询字符串,则必须清理SQL字符串或其他任何字符串。Zettetic和@coreyward所说的是,您不会对输入本身应用随机的其他形式的损坏,并将损坏的形式存储在数据库中。在将所有外来数据存储到数据库之前,不必对其进行任意编码——这很愚蠢。回答向上投票。通常不同意,如果你有非法的输入,它不属于任何地方;你的数据库或上帝禁止在你的客户端。没有理由冒险。