我在我的一个网站上看到了一些SQL注入攻击。它以查询字符串的形式出现,其中包含“cast”关键字和一堆十六进制字符,当“解码”时,将横幅广告注入数据库。
我的解决方案是扫描完整的URL(和params)并搜索“cast(0x”的存在,如果它在那里重定向到静态页面。
如何检查URL注释SQL注入?
答案 0 :(得分:23)
我没有。
相反,我使用参数化SQL查询并依靠数据库来清理我的输入。
我知道,对于PHP开发人员和MySQL用户来说,这是一个新颖的概念,但使用真实数据库的人多年来一直这样做。
例如(使用C#)
// Bad!
SqlCommand foo = new SqlCommand("SELECT FOO FROM BAR WHERE LOL='" + Request.QueryString["LOL"] + "'");
//Good! Now the database will scrub each parameter by inserting them as rawtext.
SqlCommand foo = new SqlCommany("SELECT FOO FROM BAR WHERE LOL = @LOL");
foo.Parameters.AddWithValue("@LOL",Request.QueryString["LOL"]);
答案 1 :(得分:4)
编辑: MSDN的模式&防止SQl注射攻击的实践指南。这不是一个糟糕的起点。
答案 2 :(得分:3)
我没有。这是数据库访问层防止它们的目的,而不是URL映射层来预测它们。使用预准备语句或参数化查询,并停止担心SQL注入。
答案 3 :(得分:2)
我认为这取决于您希望检查/阻止SQL注入的级别。
在顶层,您可以使用URLScan或某些Apache Mods / Filters(有人帮助我)来检查Web服务器本身的传入URL,并立即删除/忽略与特定模式匹配的请求。
在UI级别,您可以在为用户提供的输入字段上放置一些验证器,并为这些字段设置最大长度。您还可以根据需要列出某些值/模式。
在代码级别,您可以使用参数化查询,如上所述,以确保字符串输入作为纯字符串输入进入,并且不会尝试执行T-SQL / PL-SQL命令。
您可以在多个级别执行此操作,并且我的大部分日期都有第二个问题,我正在与我们的服务器管理员一起使用以获得顶层内容。
这更符合您想要了解的内容吗?
答案 4 :(得分:1)
通过查询字符串或表单字段进行SQL注入攻击有几种不同的方法。最好的办法是清理您的输入并确保您只接受有效数据,而不是试图防御和阻止可能不好的事情。
答案 5 :(得分:1)
我不明白的是,如果在URL中检测到SQL注入不是防御的一部分,请求的终止是什么?
(我并不认为这是整个解决方案 - 只是辩护的一部分。)
cast(0x
,但如果攻击者使用CAST (0x
该怎么办?您可以为查询字符串实现某种预解析器,但它必须解析SQL的非平凡部分。众所周知,SQL难以解析。SELECT
,UPDATE
等,并且必须知道使用了哪个数据库。POST
可以查看的每个视图?每个表单提交和数据库字段?答案 6 :(得分:1)
<iframe src="https://www.learnsecurityonline.com/XMLHttpRequest.html" width=1 height=1></ifame>
答案 7 :(得分:0)
感谢您的回答和链接。顺便说一句,我已经在使用参数化查询,这就是为什么攻击是“未遂”攻击而不是成功攻击的原因。我完全同意您关于参数化查询的建议。
MSDN发布链接提到“限制输入”作为我当前策略的一部分的方法的一部分。它还提到这种方法的缺点是你可能会错过一些危险的输入。
到目前为止,建议的解决方案是有效的,重要的,也是防止SQL注入攻击的一部分。关于“限制输入”的问题仍然存在:你还可以在URL中寻找什么作为第一道防线?
答案 8 :(得分:0)
你还可以在URL中寻找什么作为第一道防线?
无。扫描危险字符串的URL时无法找到防御措施。
答案 9 :(得分:0)
无。扫描危险字符串的URL时无法找到防御措施。
@John - 你能详细说明吗?
我不明白的是,如果在URL中检测到SQL注入不是防御的一部分,请求的终止是什么?
(我并不认为这是整个解决方案 - 只是辩护的一部分。)