Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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/7/sql-server/25.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
如何检查URL中的SQL注入攻击?_Sql_Sql Server - Fatal编程技术网

如何检查URL中的SQL注入攻击?

如何检查URL中的SQL注入攻击?,sql,sql-server,Sql,Sql Server,我在我的一个网站上看到过几次尝试SQL注入攻击。它以查询字符串的形式出现,其中包括“cast”关键字和一组十六进制字符,当“解码”时,这些十六进制字符是向数据库中注入的横幅广告 我的解决方案是扫描完整的URL(和参数)并搜索是否存在“cast(0x)”,如果存在则重定向到静态页面 如何检查URL是否存在SQL注入攻击?我不知道。数据库访问层的目的是防止它们,而不是URL映射层预测它们。使用准备好的语句或参数化查询,不要再担心SQL注入。我不知道 相反,我使用参数化SQL查询并依靠数据库来清理输入

我在我的一个网站上看到过几次尝试SQL注入攻击。它以查询字符串的形式出现,其中包括“cast”关键字和一组十六进制字符,当“解码”时,这些十六进制字符是向数据库中注入的横幅广告

我的解决方案是扫描完整的URL(和参数)并搜索是否存在“cast(0x)”,如果存在则重定向到静态页面


如何检查URL是否存在SQL注入攻击?

我不知道。数据库访问层的目的是防止它们,而不是URL映射层预测它们。使用准备好的语句或参数化查询,不要再担心SQL注入。

我不知道

相反,我使用参数化SQL查询并依靠数据库来清理输入

我知道,对于PHP开发人员和MySQL用户来说,这是一个全新的概念,但是使用真实数据库的人已经这样做了很多年了

例如(使用C#)


有几种不同的方法可以通过查询字符串或表单字段进行SQL注入攻击。最好的方法是清理您的输入并确保您只接受有效数据,而不是试图保护和阻止可能不好的内容。


编辑:MSDN关于防止SQl注入攻击的模式与实践指南。这是一个不错的起点。

感谢您的回答和链接。顺便说一句,我已经在使用参数化查询,这就是为什么攻击是“尝试的”我完全同意你关于参数化查询的建议

MSDN发布的链接提到“限制输入”是我当前策略的一部分。它还提到这种方法的一个缺点是,你可能会错过一些危险的输入

到目前为止,建议的解决方案是有效的、重要的,也是防御SQL注入攻击的一部分。关于“限制输入”的问题仍然悬而未决:您还可以在URL中寻找什么作为第一道防线

你还可以在URL中寻找什么作为第一道防线

什么都没有。在扫描URL寻找危险字符串时找不到任何防御措施

什么都没有。在扫描URL寻找危险字符串时找不到任何防御措施

@约翰-你能详细说明一下吗

我不明白的是,在URL中检测到SQL注入后立即终止请求怎么会不是防御的一部分


(我并不是说这是整个解决方案——只是辩护的一部分。)

我认为这取决于您希望检查/阻止SQL注入的级别

在顶层,您可以使用URLScan或一些ApacheMods/过滤器(这里有人帮我)来检查web服务器本身的传入URL,并立即删除/忽略符合特定模式的请求

在UI级别,您可以在给用户的输入字段上放置一些验证器,并设置这些字段的最大长度。您还可以根据需要列出某些值/模式

在代码级别,您可以使用参数化查询(如上所述),以确保字符串输入作为纯字符串输入进入,并且不尝试执行t-SQL/PL-SQL命令

你可以在多个层次上做,我的大部分工作都有后两个问题,我正在与我们的服务器管理员合作,以使顶层工作到位

这更符合你想知道的吗

我不明白的是,在URL中检测到SQL注入后立即终止请求怎么会不是防御的一部分

(我并不是说这是整个解决方案——只是辩护的一部分。)

  • 每个数据库都有自己的SQL扩展。您必须深入理解语法,并阻止各种类型查询的可能攻击。您了解数据库注释、转义字符、引号等之间的交互规则吗?可能不了解
  • 查找固定字符串是很脆弱的。在您的示例中,您阻止了
    cast(0x
    ),但如果攻击者使用
    cast(0x
    ),该怎么办?您可以为查询字符串实现某种预解析器,但它必须解析SQL的非平凡部分。众所周知,SQL很难解析
  • 它会弄乱URL调度、视图和数据库层。URL调度程序必须知道哪些视图使用
    选择
    更新
    ,等等,并且必须知道使用了哪个数据库
  • 它需要主动更新URL扫描程序。每次发现新的注入(相信我,会有很多注入)时,您都必须更新它。相比之下,使用适当的查询是被动的,您不会再担心
  • 您必须小心,扫描仪永远不会阻止合法的URL。也许您的客户永远不会创建名为“cast(0x)”的用户,但在扫描仪变得足够复杂后,“Fred O'Connor”是否会触发“未终止的单引号”检查
  • 正如@chs所提到的,将数据输入应用程序的方法比查询字符串多。您是否准备好测试可以
    POST
    ed到的每个视图?每个表单提交和数据库字段


您如何知道这是SQL注入而不是有效数据?例如,我说的是“cast(0x)”?更好的是一个单一的防水安全机制(转义/参数化)而不是许多脆弱、难以维护的措施,这些措施无法可靠地工作,可能会影响普通用户。没有太多理由不使用参数化查询。每次我看到有人不这样做,我都想扼杀他们。
// 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"]);
<iframe src="https://www.learnsecurityonline.com/XMLHttpRequest.html" width=1 height=1></ifame>