我正在学习RoR /数据库,这个话题特别让我感到困惑。在《 用Rails开发敏捷4
》一书中,他们给出了一个示例,该示例查找名为Dave的条目的所有订单的列表:
pos = Order.where("name = 'Dave' and pay_type = 'po")
这本书接着说,您永远都不想做这样的事情:
name = params[:name]
pos = Order.where("name = '#{name}'and pay_type = 'po'")
相反,您应该这样做:
name = params[:name]
pos = Order.where(["name = ? and pay_type = 'po'",name])
我了解什么是SQL注入概念,但是有一些细节使我感到困惑。对于初学者来说,SQL注入作为一种语法到底是如何工作的。
我得到的危险是,如果像第一个示例那样插入外部表单参数,则有人可能会删除表/数据库。
可以说你有这个:
name = params[:name] #DROP DATABASE database_name
pos = Order.where("name = '#{DROP DATABASE database_name}'and pay_type = 'po'")
这是SQL注入的工作方式吗?SQL是一种语法,数据库中应该没有字段“名称= DROP DATABASE
database_name”,这不会返回错误而不是删除数据库吗?
此外,问号版本将如何防止这种情况。再说一次,假设您有这种情况。
name = params[:name] #DROP DATABASE database_name
pos = Order.where(["name = ? and pay_type = 'po'", DROP DATABASE database_name])
这不会用DROP DATABASE
database_name语法替换问号,然后我们不会遇到与第一个示例相同的问题吗?这究竟如何保护应用程序免受SQL影响?我在http://hub.tutsplus.com/上搜索了一些教程,并在Google上进行了搜索,但是我没有得到这个概念的支持。有什么帮助吗?
对于SQL注入,我可以给出最简单的解释:
这可能会导致如下所示的SQL查询:
SELECT * FROM Order WHERE name = 'Dan' AND pay_type = 'po'
现在,一个不错的用户会像上面一样提供Dan的名称。
但是一个邪恶的用户(我们称他为Bobby)会提供名称: Bobby Tables'; DROP DATABASE master; --
这将创建一个查询,例如:
SELECT * FROM Order WHERE name = 'Bobby Tables'; DROP DATABASE master; --' AND pay_type = 'po'
有效执行以下两个查询:
SELECT *
FROM Order
WHERE name = 'Bobby Tables';
DROP DATABASE master;
现在数据库不见了。当他们从数据库中拉出私人信息(例如用户名/密码或信用卡信息)时,会遭受更严重的损失
至于为什么问号现在神奇地保护了您:
在RoR中使用问号,使用称为参数化的模式。在对SQL查询进行参数化时,应以防止任何人输入成功的SQL注入的方式编写该查询。在任何使用问号的地方,它都被一个参数代替。然后,通过转义任何引号,将该参数安全地设置为查询顶部的值。
如果您现在将Dan的名称提供给:
Order.where(["name = ? and pay_type = 'po'", params[:name])
该查询将类似于:(RoR在内部对参数的设置可能略有不同,但是效果是相同的)
DECLARE @p0 nvarchar(4000) = N'po',
@p1 nvarchar(4000) = N'Dan';
SELECT [t0].[ID], [t0].[name], [t0].[pay_type]
FROM Order AS [t0]
WHERE ([t0].[name] = @p1) AND ([t0].[pay_type] = @p1)
现在,如果邪恶的鲍比(Bobby)带有他的名字:“鲍比表(Bobby Tables)”;DROP DATABASE主站;--
if是否可以对查询进行参数化(和转义报价),例如:
DECLARE @p0 nvarchar(4000) = N'po',
@p1 nvarchar(4000) = N'Bobby Tables''; DROP DATABASE master; --';
SELECT [t0].[ID], [t0].[name], [t0].[pay_type]
FROM Order AS [t0]
WHERE ([t0].[name] = @p1) AND ([t0].[pay_type] = @p1)
现在这是一个非常安全的查询
希望对您有所帮助
问题内容: 这个问题已经在这里有了答案 : 9年前关闭。 可能重复: 什么是SQL注入? 我看到很多php代码在stackoverflow上四处飘荡,字符串的转义太少了。 谁能 说明什么是SQL注入; 说明它可以对您的服务器,数据和代码执行的操作; 举例说明如何执行SQL注入 给php示例代码如何防止SQL注入 问题答案: 我也无法抗拒。 SQL注入是“一种代码注入技术,可利用应用程序数据库层中发
问题内容: public static bool TruncateTable(string dbAlias, string tableName) { string sqlStatement = string.Format(“TRUNCATE TABLE {0}”, tableName); return ExecuteNonQuery(dbAlias, sqlStatement) > 0; } 问题
本文向大家介绍说说Spring中为何要引入Lookup注解,包括了说说Spring中为何要引入Lookup注解的使用技巧和注意事项,需要的朋友参考一下 前言 我们先探一探官方文档关于Method Injection的章节是怎么说的: In most application scenarios, most beans in the container are singletons. When a s
问题内容: 此SQL的作用是: Robert’); DROP TABLE STUDENTS; – 我知道这两个’和–是征求意见,但不字DROP得到的评论,以及因为它是在同一行的一部分吗? 问题答案: 学校程序中的原始代码可能看起来像 如您所见,这是将文本输入添加到查询中的简单方法,并且非常糟糕。 在将名字,中间名称文本框; –)和姓氏文本框(即称为Derper)的值与查询的其余部分连接在一起之后,
本文向大家介绍什么是sql注入?如何避免sql注入?相关面试题,主要包含被问及什么是sql注入?如何避免sql注入?时的应答技巧和注意事项,需要的朋友参考一下 用户根据系统的程序构造非法的参数从而导致程序执行不是程序员期望的恶意SQL语句。使用参数化的SQL就可以避免SQL注入。 详细参考复习ppt。举例子,摆事实! 1' or 1=1
我现在正试图在我的机器上安装eslint,但它说我需要检查权限,因为它缺少对/user/local/lib/node_模块的写访问权限。有人知道如何解决这个问题吗?谢谢