[size=x-large][color=green] 防止SQL注入式攻击
SQL 代码注入攻击是最常见的一种攻击WEB应用程序的方法。 这种攻击的结果是让你的数据库被破坏或者完全暴露。最好的防范SQL代码注入的方式是过滤掉所有输入的信息。 并且对最后的结果进行转义输出。
解决方法:
使用Active Record 提供的变量绑定功能对查询语句进行“消毒”,这些邦定的变量会成为你的SQL 语句的一部分。 考虑下面的方法, 他以 id 作为参数查询你的 记录。
如果想你期望的那样, params[:id] 包含了一个整型参数,那么这个语句就会如期执行。但是,如果一个用户传进的语句像 “1 or 1=1”会怎么样? 他会插入到生成的SQL语句中:
下面get_user 的另一种实现方式, 利用一种绑定的参数来防止 SQL语义篡改。
SQL 代码注入攻击是最常见的一种攻击WEB应用程序的方法。 这种攻击的结果是让你的数据库被破坏或者完全暴露。最好的防范SQL代码注入的方式是过滤掉所有输入的信息。 并且对最后的结果进行转义输出。
解决方法:
使用Active Record 提供的变量绑定功能对查询语句进行“消毒”,这些邦定的变量会成为你的SQL 语句的一部分。 考虑下面的方法, 他以 id 作为参数查询你的 记录。
def get_user
@user = User.find(:first, :conditions => "id = #{params[:id]}")
end
如果想你期望的那样, params[:id] 包含了一个整型参数,那么这个语句就会如期执行。但是,如果一个用户传进的语句像 “1 or 1=1”会怎么样? 他会插入到生成的SQL语句中:
SELECT * FROM users WHERE (id = 1 OR 1=1)
这些语句SQL 将返回所用用户,因为 Boolean OR 个条件 1=1 永远是true , 对find 的调用将之返回一个用户, 但这里不能担保 id 为1 的用户一定被返回,返回结果依赖于数据库内部是如何来排序记录的。
下面get_user 的另一种实现方式, 利用一种绑定的参数来防止 SQL语义篡改。
def get_user
@user = User.find(:all, :conditions => [ "id = ?", params[:id] ])
end
现在讲“1 OR 1=1 ”传入 find 的方法会产生如下 的SQl :
SELECT * FROM users WHERE (id = '1 OR 1=1')
在这种情况下, id 将和整个字符串比较,数据库将试图把它转换为一个数字,这里转换的结果就是 1 , 只是把id 为1 的用户信息输出而已。[/color][/size]