Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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/8/redis/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
如何使用?Rails中SQL注入的帮助?_Sql_Ruby On Rails - Fatal编程技术网

如何使用?Rails中SQL注入的帮助?

如何使用?Rails中SQL注入的帮助?,sql,ruby-on-rails,Sql,Ruby On Rails,我的Rails应用程序中有这样的代码,我不确定它是如何工作的 @dogs = Dog.where(breed: search_breed).where(<<-SQL, search_color, search_name) color = ? AND name = ? SQL @dogs=Dog.where(breed:search\u breed)。where(这里真的没有理由使用原始SQL。该代码看起来很混乱,应该是: @dogs = Dog.where( breed

我的Rails应用程序中有这样的代码,我不确定它是如何工作的

@dogs = Dog.where(breed: search_breed).where(<<-SQL, search_color, search_name)
  color = ?
  AND name = ?
SQL

@dogs=Dog.where(breed:search\u breed)。where(这里真的没有理由使用原始SQL。该代码看起来很混乱,应该是:

@dogs = Dog.where(
  breed: search_breed,
  color: search_color,
  name: search_name
)
如果您使用的是
,那么默认情况下,
就是这样工作的。这将为您正确地转义所有内容

当您错误地执行以下操作时,会发生注射:

Dog.where("breed = #{search_breed}") # WRONG!
你真的不想做的事

安全的替代方案是:

Dog.where("breed=?", search_breed)

在这种情况下,数据库驱动程序用正确转义的
搜索值替换
,该值称为占位符值。正确转义在这里表示“避免SQL注入问题”.

因为没有占位符,您的查询字符串不会被转义。如果恶意用户向您的数据库发送drop table命令,则查询字符串将消失

Client.where("first_name LIKE '%#{params[:first_name]}%'")
这是对sql注入打开的。用户的任何输入都被数据库按原样接受

'John'; DROP TABLE clients;--

使用占位符来防止注入。

基于前面的答案,SQL注入可能非常危险,原因有很多。注入攻击使狡猾的用户能够通过“或1..”语句读取或操作数据库中的数据

假设您有一个应用程序,其中有许多可以搜索的报告。虽然某些报告应该对公众保持隐藏,但您允许所有用户在show action中这样访问它:

报告\u controller.rb

Reports.where("id = '#{params[:id]}'")
在这种格式下,
永远不会被转义。这允许用户使用OR 1语句直接在数据库中设置属性,恶意用户可以生成类似以下内容的查询:

SELECT * FROM reports WHERE name = '' OR 1--'
这实际上会将系统中的所有记录返回给用户。包括那些他们不应该看到的记录

另一个示例是绕过身份验证系统。如果您验证登录凭据,如下所示:

User.find_by("login = '#{params[:name]}' AND password = '#{params[:password]}'")
如果用户输入
'或'1'='1
作为登录值,输入
'或'2'>'1
作为密码,查询将类似于:

SELECT * FROM users WHERE login = '' OR '1'='1' AND password = '' OR '2'>'1' LIMIT 1
这样不仅会返回数据库中的第一个用户,还会授予恶意用户完全访问权限。 但如果使用这种格式:

User.find_by("login = ? AND password = ?", login_info, password_info).first
这样做的目的是转义SQL语句中的
,以便用户无法利用查询。您可以使用速记哈希表:

User.find_by(login: login_info, password: password_info)
您的查询仍将受到保护


参考:这是一个非常有用的部分,提供了有关此主题的更多示例/详细信息。

谢谢,但我仍然不明白为什么占位符比其他占位符更受欢迎。其他占位符意味着您的服务器会被一个类似的工具完全打开。无法正确转义是安全问题的首要原因。如果您写在创建JSON文档时,必须为JSON转义,与HTML或URL转义相同,否则XSS之类的东西会成为问题。占位符值会正确转义,并且转义的方式很明显,因此您可以审核代码,一眼就能看出所有操作都是正确的。这不是字符串插值的情况,您可以这样做不要仔细检查每个内联值。对不起,我想我还是不明白“转义”是什么意思使用占位符有何帮助?转义代码意味着给定的代码将不会被执行。它将保持为字符串,不会作为代码运行。您永远不希望用户能够直接从输入执行sql命令。使用占位符和给定的输入将由rails自动转义,您不必做任何额外的操作。
User.find_by(login: login_info, password: password_info)