提问人:tkhuynh 提问时间:1/31/2019 最后编辑:Laurenz Albetkhuynh 更新时间:1/31/2019 访问量:564
SQL 注入输入验证
SQL Injection input validation
问:
我有一个基于 Ruby on Rails 构建的 API,我不在 ActiveRecord 方法中使用字符串插值,例如 ,....这可以防止我的代码执行任何 SQL 注入并将 SQL 注入视为字符串。where
find_by
但是,我想找到一种方法在处理请求之前验证参数。如果参数中的任何字符串值包含 SQL 注入,我想立即拒绝该请求。
我一直在寻找一个 gem 来帮助进行 SQL Inject Input 验证,但我找不到任何 gem。我可以使用 REGEX 通过在字符串中查找任何 and 关键字来验证字符串值,但这不是一个好方法,因为如果字符串值(注释)包含类似 的文本,如果我使用 REGEX for 和关键字,此值可能会被拒绝。select
from
"We select this item from the collection A"
select
from
我可以验证 SQL 注入输入的最佳方法是什么?谢谢!如果这篇文章恰好是重复的,请给我类似帖子的链接,我将删除这篇文章。
答:
0赞
Laurenz Albe
1/31/2019
#1
这很难回答,因为它取决于你如何定义字符串是否危险。
通常,字符串只有在包含单引号时才会造成伤害,因此此 SQL 条件应该足够好:
'''' || string || '''' <> quote_literal(string)
但是任何检查单引号的方法都应该可以。
评论
0赞
tkhuynh
2/2/2019
如果输入中的值是 ,如果代码写成 ,这可能会造成伤害,当然,如果代码是 ,则不会造成伤害。我试图做的是,如果输入值为“(select email from customers,其中 1 = 1 限制 1)”,我想拒绝请求,但是使用正则表达式可能会意外拒绝“项目(从集合 A 中选择它)”,这是一个合法的注释,而不是 sql 注入字符串(select email from customers where 1 = 1 limit 1)
Customer.where("email = #{email}")
Customer.where(email: email)
0赞
Laurenz Albe
2/4/2019
您显示的示例不是通常所说的 SQL 注入,因为您的字符串不包含单引号,例如 .在所示情况下,用户输入无论如何都必须是 SQL 代码,也就是说,用户输入必须包含其单引号才能形成正确的 SQL 语句。在我在此评论中展示的经典 SQL 注入场景中,任何单引号都是错误的。"WHERE email ='" + user_input + "''"
评论