- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
感谢您在我开始学习 Ruby 和 Rails 时的帮助。
在 Rails API 中 ActiveRecord::Base ,有一个关于条件的部分,旨在简单地涵盖与 ActiveRecord 交互的语法。但是他们使用的示例包括一个非常有趣(对我来说)的 Ruby/Rails 输入清理入门:
class User < ActiveRecord::Base
def self.authenticate_unsafely(user_name, password)
where("user_name = '#{user_name}' AND password = '#{password}'").first
end
def self.authenticate_safely(user_name, password)
where("user_name = ? AND password = ?", user_name, password).first
end
def self.authenticate_safely_simply(user_name, password)
where(:user_name => user_name, :password => password).first
end
end
在这个示例代码之后,他们解释说:
"The authenticate_safely and authenticate_safely_simply both will sanitize the user_name and password before inserting them in the query, which will ensure that an attacker can’t escape the query and fake the login (or worse)."
我完全明白这种输入净化在防止注入(inject)攻击方面是一件好事。我不明白的是,如果没有调用特殊方法来预处理输入数据,这种隐式清理是在哪里发生的以及如何发生的。各种示例方法似乎具有几乎相同的语义,但由于它们的解析方式,形式上的差异对安全性有巨大影响。我假设这些形式上的变化类似于在包含转义字符的字符串周围使用单引号和双引号之间的区别实际上。但是任何人都可以帮助我变得更聪明、更快,通过一般术语(或者更确切地说:在逻辑层面,而不是在解释器内部)理解幕后到底发生了什么才能做到这一点?
此外,这些差异在多大程度上取决于特定于 Rails 的结构,而不是底层的 Ruby?
谢谢!
最佳答案
输入清理是 Active Record 提供的一项功能,称为 prepared statements or parameterized statements .
大多数数据库访问库 native 提供此功能,但是,Active Record 选择使用字符串处理机制模拟此功能。请参阅 active_record/relation/query_methods.rb
中的 build_where
并回溯到 sanitize_sql_for_conditions
(通过其 sanitize_sql
别名)在 active_record/base.rb
中。 (非常感谢 mu is too short 的研究。)
与在应用程序中将查询字符串构建为字符串 的旧式做法不同,您有一个带有参数的静态模板 查询。当您调用查询时,您提供参数,Active Record 将为 SQL 引擎构建一个安全的查询来执行。
您可以自己完成这项任务——无数 PHP 程序员选择避开他们类似的 PDO database access layer .然而,许多程序员无法正确理解:there are roughly 1500 SQL Injection flaws在过去三年和我的本地发现CVE database自 MITRE 开始跟踪以来,显示了 5000 多个易受 SQL 注入(inject)攻击的程序实例。几乎所有这些都完全归因于选择手动编写自己的 SQL 代码并且没有正确清理输入的人。 (我没有亲自检查每一个,但我不记得在 ORM 或数据库访问层中看到任何允许 SQL 注入(inject)攻击通过的缺陷。但为了保守起见,我选择了“几乎所有”。)
堆友Jeff Atwood equates old-style SQL queries as the goto
of database programming :
Non-parameterized SQL is the GoTo statement of database programming. Don't do it, and make sure your coworkers don't either.
关于ruby - Rails 中输入的隐式清理 : Why do these examples from the API work the way they do?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9576665/
我正在使用 Mechanize 配置 ssl , 根据 document我需要设置 agent.cert = 'example.cer' agent.key='example.cer' 但是我怎样才能
我有一个表格,允许人们将士兵添加到列表中,该列表可以很好地传输到 mysql。如果我在没有变量的情况下这样做甚至很好,但是一旦我尝试添加一个如下所示。 // Get Variable from Loc
使用 .htaccess 重写,我想要: http://example.com 重定向到:http://www.example.comhttps://www.example.com 重定向到:http
我想将所有流量重定向到 https://www.sitename.com 例子 http://sitename.com --> https://www.sitename.com http://www.
我只有 example.com 的 SSL 证书,并且想同时重定向 http://example.com和 http://*.example.com 到 https://example.com使用 n
我有服务器 A,它托管我们在 www.example.com 上的主要站点;我们有一个涵盖 *.example.com 的 SSL 证书。 在我们网站的安全部分,我们希望向我们编写并托管在单独机器/I
我正在努力平衡多行上的一些文本,并且我正在添加手动换行符以将文本均匀地分割在各行上。为了弄清楚这一点,我需要查看在哪里添加“\n”来测试我的代码,但我发现的唯一方法是将其全部打印为字符: ["T",
我在我们的域中安装了 Apache 和 Tomcat 服务器,因为我有超过 25 个服务,一些服务由 Apache 处理,一些服务由 Tomcat 处理。 tomcat 服务显示 http://exa
编辑:问题终于解决了。详细信息可以在此消息末尾的疑难解答部分中找到。 我在这里保留了详细的步骤,以防可能对某人有所帮助。 设置OpenLDAP I-创建服务器 该文档通常已经过时,并且您会找到多种实现
这个问题在这里已经有了答案: offsetting an html anchor to adjust for fixed header [duplicate] (28 个答案) 关闭 8 年前。
目前谷歌将我的网站链接显示为... example.com/ ...但是,我希望它显示为... example.com 我确实有以下元数据 ...下面是我的 htaccess 文件... Index
我使用 Microsoft Visual Studio 2012。当我将代码示例放入 C# 类/方法的 XML 注释中时,我想知道:引用我的程序集的用户将如何看到该代码示例? 我试图引用我自己的程序集
我对正则表达式还很陌生,无法真正弄清楚它是如何工作的。我试过这个: function change_email($email){ return preg_match('/^[\w]$/', $e
我正在使用 Hibernate 版本 4.3.5.Final。这里的问题是 Hibernate 找到 Foo 类型的实体,其中属性 address 的大小写不同(例如“BLAFOO”)。但是,在我的示
我为环境特定变量(如用户名和密码)设置了一个环境 YAML 文件。要在我的应用程序中使用这些变量,我需要使用 APP_CONFIG['username']而不是 APP_CONFIG[:usernam
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
这个问题在这里已经有了答案: Does Python have a string 'contains' substring method? (10 个答案) 关闭 8 年前。 我想检查发件人 hea
我已经在 https://arieldemian.it 上配置了 SSL/TLS但似乎https://www.arieldemian.it不安全。这是为什么?我需要注册他们两个吗?我正在使用 http
当我使用 ProGuard 时,com.example.** 和 com.example.**{*;} 之间的区别是什么?例如,每种情况会发生什么情况? -keep class com.examp
我的主页的内容是根据使用 slug“home”对数据库的查询提取的。例如,如果我在地址栏中输入 example.com/home,它会根据看到的“/home”查询数据库并提取正确的内容(使用变量“$p
我是一名优秀的程序员,十分优秀!