我们正在讨论在我们的代码中使用参数化sql查询的另一个讨论.我们在讨论中有两个方面:我和其他一些人说我们应该总是使用参数来防止sql注入以及其他不认为有必要的人.相反,他们想要在所有字符串中用两个撇号替换单撇号以避免sql注入.我们的数据库都在运行Sql Server 2005或2008,我们的代码库运行在.NET framework 2.0上.
让我在C#中给你一个简单的例子:
我希望我们使用这个:
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
Run Code Online (Sandbox Code Playgroud)
而其他人想要这样做:
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
Run Code Online (Sandbox Code Playgroud)
SafeDBString函数定义如下:
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
Run Code Online (Sandbox Code Playgroud)
现在,只要我们在查询中的所有字符串值上使用SafeDBString,我们就应该是安全的.对?
使用SafeDBString函数有两个原因.首先,它是自石头老化以来完成的方式,其次,由于您看到在数据库上运行的精确查询,因此更容易调试sql语句.
那么.我的问题是使用SafeDBString函数是否真的足以避免sql注入攻击.我一直试图找到破坏这种安全措施的代码示例,但我找不到任何示例.
那里有人可以打破这个吗?你会怎么做?
编辑: 总结到目前为止的答复:
我一直在向我的同事们讲道,在这里谈论在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参数的值.
我试图将数据库的副本复制到同一服务器上的新数据库.服务器是我在Windows XP下运行SQL 2008 Express的本地计算机.使用SMO.Transfer类这样做应该很容易,它几乎可以正常工作!
我的代码如下(稍微简化):
Server server = new Server("server");
Database sourceDatabase = server.Databases["source database"];
Database newDatbase = new Database(server, "new name");
newDatbase.Create();
Transfer transfer = new Transfer(sourceDatabase);
transfer.CopyAllObjects = true;
transfer.Options.WithDependencies = true;
transfer.DestinationDatabase = newDatbase.Name;
transfer.CopySchema = true;
transfer.CopyData = true;
StringCollection transferScript = transfer.ScriptTransfer();
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand switchDatabase = new SqlCommand("USE " + newDatbase.Name, conn))
{
switchDatabase.ExecuteNonQuery();
}
foreach (string scriptLine in transferScript)
{
using (SqlCommand scriptCmd = new SqlCommand(scriptLine, …
Run Code Online (Sandbox Code Playgroud) 有没有一种很好的方法来读取RAW图像文件(特别是Canon CR2和Adobe DNG文件)作为GDI +位图的速度相当快?
我找到了一个在WPF下运行的示例,该示例将使用任何已安装的图像编解码器读取图像,然后将其显示在图像控件中.我修改了这个例子,通过将WPF图像写入MemoryStream并从中创建Bitmap来创建GDI +位图.但这个过程很慢!非常慢!在我的电脑上打开一张简单的图像需要大约10秒钟.此解决方案还需要对WPF程序集的引用,这感觉不对,特别是因为我想在ASP.NET项目中运行代码.
有些程序会对图像进行批量转换,但我更愿意在请求时动态转换图像.
那么,有什么建议吗?
我刚回答了一个问题,我说虽然字符串实习很好,但它可能是一个安全问题,因为以后可以很容易地访问字符串值.
虽然我很确定这是真的:-)我不确定它到底有多容易.我尝试使用谷歌搜索主题,但我没有相关的结果(谷歌在这一个是弱的),所以然后我尝试你们的人.
你知道在app domian中访问intered字符串列表的任何"简单"方法吗?我必须使用内存转储和那些东西,还是有像AppDomain.GetInteredStringsList()这样的方法?
与此相关:从intered字符串中获取任何有用的数据真的很容易.将敏感数据存储在字符串中真的是一个安全漏洞吗?
我试图确定为什么asp.net网格视图非常慢.网格视图包含在自定义子类中,该子类添加自定义分页器并执行一些特殊格式设置.此外,自定义网格视图包含在用户控件中,该控件将网格视图放在更新面板中并将其与对象数据源组合以使控件易于使用.
我追溯了两个问题领域:
所以,我的问题是我应该如何解决这个问题?我在追踪asp.net在PreRender阶段所做的事情时遇到了问题.我在调用的用户控件中有一些代码,但大部分时间都花在我的代码之外.
我尝试下载asp.net的调试符号,但Visual Studio仍然不允许我进入代码,并且跟踪不会在这里提供太多信息.
还有其他人处于这种情况吗?我首先怀疑我的数据源,但数据库调用很快所以问题不存在.