我有一个项目,其中包含许多用* .DLLs文件编译的SQL查询
昨天,我收到了一个新的错误:用单引号自动生成的用户名会导致错误。
原因是像这样的查询:
string.Format("SELECT TimeZone from yaf_User WHERE [Name]='{0}'", UserName);
有人可以建议任何类型的技巧或黑客来解决它?
更新:我不知道为什么开发人员使用这种可怕的方式来生成SQL查询,但是现在我应该修复它。客户端不明白我为什么要重写大量修复代码。
答案 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("'","''") + "'";