只看:
(来源:https://xkcd.com/327/)
这个SQL做了什么:
Robert'); DROP TABLE STUDENTS; --
Run Code Online (Sandbox Code Playgroud)
我知道这两个'并且--是用于评论,但是这个词也没有DROP被评论,因为它是同一行的一部分?
我一直在向我的同事们讲道,在这里谈论在SQL查询中使用参数的好处,特别是在.NET应用程序中.我甚至承诺给予他们免受SQL注入攻击的抵抗力.
但我开始怀疑这是否真的如此.是否有任何已知的SQL注入攻击可以成功对抗参数化查询?例如,您可以发送一个导致服务器缓冲区溢出的字符串吗?
当然还有其他考虑因素可以确保Web应用程序是安全的(比如清理用户输入和所有内容),但现在我正在考虑SQL注入.我对MsSQL 2005和2008的攻击特别感兴趣,因为它们是我的主要数据库,但所有数据库都很有趣.
编辑:澄清参数和参数化查询的含义.通过使用参数我的意思是使用"变量"而不是在字符串中构建SQL查询.
所以不要这样做:
SELECT * FROM Table WHERE Name = 'a name'
Run Code Online (Sandbox Code Playgroud)
我们这样做:
SELECT * FROM Table WHERE Name = @Name
Run Code Online (Sandbox Code Playgroud)
然后在查询/命令对象上设置@Name参数的值.
我一直在互联网上搜索,但我似乎无法找到解释我的问题的任何东西(可能是我没有使用正确的搜索字符串),所以我发帖在这里希望有人可以帮助我有了这个.(我的程序是使用Visual Studio 2010编写的C#)
我注意到在C#中,有多种构造SQL命令的方法.
SqlConnection connection = GetAndOpenConnection(); //function containing connection string and open connection
SqlCommand command = connection.CreateCommand();
Run Code Online (Sandbox Code Playgroud)
到目前为止,我没有任何问题.我遇到的问题是CommandText.我在我的代码中使用了几个不同的命令(SELECT/ INSERT/ UPDATE/ DELETE),但SELECT举个例子.
//Example 1:
command.CommandText = String.Format("SELECT * FROM myTable WHERE name = '{0}'", "bob");
//Example 2:
command.CommandText = "SELECT * FROM myTable WHERE name = @myName";
command.Parameters.Add(new SqlParameter("myName", "bob"));
Run Code Online (Sandbox Code Playgroud)
上面两个例子之间有什么区别?(表现明智/结构明智/等)
我问的原因是因为在同一个.cs文件中,当我使用示例2中的方法时,有时候代码正常工作而有时它没有,那么我最终会像示例1中那样生成所有内容,每个单独工作时间.
使用任何一种方法都有显着的收益/损失吗?完成这样的任务的更合适的方法是什么?
其他问题
好的,所以我看到方法2是更合适的方法.
但是,如果我使用方法2则会出现问题.
我有一个循环循环通过List<string> names.在循环内部,当我使用方法2并添加名称作为参数时,我得到一个错误,说该参数已经存在且无法添加.
我怎样才能解决这个问题?
List<string> names = new List<string> {"adam", "bob", "john"};
foreach(string …Run Code Online (Sandbox Code Playgroud) 参数用于保护您免受恶意用户输入.
但是如果参数需要一个字符串,是否可以编写将被解释为sql的输入,因此恶意用户可以使用"DROP","TRUNCATE"等内容......?
asp,asp.net,java等参数之间的保护是否存在差异?
另请参阅:参数是否足以阻止SQL注入?
我正在尝试实体框架核心,偶然发现了一个我从未见过的错误,无法弄清楚如何修复它.我正在使用.net Core Web API 2.0和EntityFramework Core 2.00-preview2-final
这是一个触发错误的简单示例.
(概念:从数据库中获取用户的简单端点)
错误:System.PlatformNotSupportedException:此平台不支持类型Udt.
有什么建议?
问题是我在我的数据库中使用地理,但我在模型中将它用作字符串,因为实体框架核心还不支持空间数据......
如何在不摆脱地理位置的情况下保持这种蛋糕的美味,这是一个重要特征吗?
编辑:请参阅我当前解决方案的答案