我正在尝试学习“SQL 注入”概念并尝试练习一些 Kali 工具来学习,但有一个问题我不明白,我的问题是为什么大多数工具需要以“AAA.BBB?id”结尾的 URL =000" 作为注入的输入字符串。
我最近用以下代码示例回答了一个问题:
Create Table #Testing
(
emaildomain varchar(100) -- Still bigger than functionally needed but better than MAX
);
INSERT INTO #Testing VALUES (REVERSE('@myfreepaysite.com')); -- Changed
Create Table #DataToCheck
(
fullemail varchar(200) -- Still bigger than functionally needed but better than MAX
);
Insert Into #DataToCheck VALUES(REVERSE('[email protected]')); --Changed
Select Top 1
REVERSE(fullemail)
, REVERSE(emaildomain)
FROM #DataToCheck
INNER JOIN #Testing ON fullemail LIKE emaildomain + '%';
在我写最后一行时,我想知道EmailDomain
用通配符连接列是否为 SQL 注入打开了大门。这是我应该注意这种类型的代码,还是 SQL Server 会将其评估为单个统一参数,这样我就不必担心使用这种方法?
我正在阅读 Rails 指南中有关 SQL 注入攻击的内容,想知道以下行是否容易受到 SQL 注入攻击:
accounts.where("lower(name) LIKE '%#{params[:query].downcase}%'")
如果我正确阅读并理解了指南,用户可以做类似的事情吗
`'\''; DROP TABLE users;`
那会让我的桌子掉下来吗?
- - - 编辑 - - -
这些示例相同:
Account.where(id: account_id).first
current_user.actions.where(id: params[:clear_action_reminder]).first
edits.where.not(account_id: non_human_ids)
Rating.where(project_id: @project.id, account_id: current_user.id).first_or_initialize
这些当然是特定于应用程序的查询,但是因为查询中没有?
,所以这些都可能是灾难性的吗?
我知道这很危险:
EXEC sp_executesql 'SELECT * FROM ' + @Table
但是,这对 SQL 注入安全吗?
IF EXISTS(SELECT * FROM information_schema.tables WHERE TABLE_NAME = @Table) BEGIN
EXEC sp_executesql 'SELECT * FROM ' + @Table
END
我正在使用 ESRI 的 arcpy 模块,我需要指定一个WHERE
子句作为此函数的参数。由于结果最终将用于从数据库中检索数据,WHERE
子句的文本有时会直接传递到数据库,但遗憾的是,ESRI 没有给我任何参数化查询的选项。由于我想防止潜在的 SQL 注入,我需要找到一些替代方法来保护我的数据库。
想到的一个选项是限制输入,如果不符合,则在此函数调用之前抛出错误。在我的例子中,呼叫者只需要 ASCII 字母数字字符。列中不允许使用其他类型的字符进行过滤。将用户限制为仅字母数字字符是否足以防止 SQL 注入,特别是因为文本必须作为字符串引用?
我看到开发人员使用隐式日期转换的代码。我想要一个明确的答案,说明他们为什么不应该这样做。
SELECT * from dba_objects WHERE Created >= '06-MAR-2012';
该手册似乎建议在数字周围使用引号足以防止 SQL 注入。
根据第5.3.1 节。MySQL 5.1 参考手册的一般安全指南:
如果应用程序生成查询,例如
SELECT * FROM table WHERE ID=234
当用户输入值234
时,用户可以输入值234 OR 1=1
以使应用程序生成查询SELECT * FROM table WHERE ID=234 OR 1=1
。结果,服务器检索表中的每一行。这会暴露每一行并导致过多的服务器负载。防止此类攻击的最简单方法是在数字常量周围使用单引号:SELECT * FROM table WHERE ID='234'
. 如果用户输入额外的信息,它们都将成为字符串的一部分。在数字上下文中,MySQL 自动将此字符串转换为数字并从中删除任何尾随的非数字字符。
这是否意味着如果用户输入值,用户就会受到保护234' OR 1=1 #
?(即生成查询SELECT * FROM table WHERE ID='234' OR 1=1 #'
)