MSSQL:单引号导致查询错误

时间:2014-01-20 15:07:17

标签: sql .net sql-server


我有一个项目,其中包含许多用* .DLLs文件编译的SQL查询 昨天,我收到了一个新的错误:用单引号自动生成的用户名会导致错误。
原因是像这样的查询:

    string.Format("SELECT TimeZone from yaf_User WHERE [Name]='{0}'", UserName);


有人可以建议任何类型的技巧或黑客来解决它?

更新:我不知道为什么开发人员使用这种可怕的方式来生成SQL查询,但是现在我应该修复它。客户端不明白我为什么要重写大量修复代码。

3 个答案:

答案 0 :(得分:7)

你正在做的事情是危险的,因为它有助于SQL注入攻击(作为副作用,它也会引起你所看到的问题。

解决方案是使用参数化查询 - 这也可以避免SQL注入攻击。

SqlCommand cmd = new SqlCommand("SELECT TimeZone from yaf_User WHERE [Name]=@UserName"), conn);
cmd.Parameters.Add(new SqlParameter("Username", theUsername));

唯一的选择是逃避单引号。但是,这是对您的代码的修复,但您的解决方案仍然不安全。 我无法强调解决此问题的重要性 - 因为我可以通过使用恶意用户名登录来清除系统中的整个数据表。

答案 1 :(得分:1)

这是给克里斯的。转义字符可能有效。如果这个人很聪明,那就是它的一些方法。

例如。

-- Use Adventure works
use adventureworks2012
go

说,我知道你用两个,你所选择的解决方案替换单引号。输入以下

<强> Bothell的';授予[adw_user];在文本框中打印'。

这归结为这个@fld变量。

-- Declare the vars
declare @sql nvarchar(max);
declare @fld varchar(128) = 'Bothell''; GRANT CONTROL TO [adw_user];PRINT''';
print @fld

-- Perform some injection
set @sql = 'select * from [Person].[Address] where City = ' + 
    char(39) +  @fld + char(39);
print @sql
exec sp_executesql @sql

你有SQL注入。

select * from [Person].[Address] where City = 'Bothell'; 
GRANT CONTROL TO [adw_user];PRINT''

(26 row(s) affected)

http://www.w3schools.com/sql/sql_injection.asp

来自W3Schools的报价 - 保护网站免受SQL注入攻击的唯一可靠方法是使用SQL参数。

非常好读。查看截断攻击的链接。简而言之,参数化确保输入被视为文字,而不是代码。

http://blogs.msdn.com/b/raulga/archive/2007/01/04/dynamic-sql-sql-injection.aspx

答案 2 :(得分:0)

单引号是数据库被黑客攻击的原因。这是SQL注入背后的概念。利用字符串使用引号这一事实。通过添加其他引号并弄乱整个SQL语句来处理要插入的值。您可以使用参数化查询来避免SQL注入,但需要更多行代码或使用此代码。

sql="SELECT TimeZone from yaf_User WHERE [Name]='" + VariableName.replace("'","''") + "'";