兴国安邦

C# 3.0, Linq, Linq To Sql

博客园 首页 新随笔 联系 订阅 管理
  33 Posts :: 0 Stories :: 524 Comments :: 51 Trackbacks
在sql语句中,有些特殊字符,是sql保留的。比如 ' [ ]  等。我们可以先看看它们的用法。

当需要查询某数据时,加入条件语句,或着当你需要insert记录时,我们用  '  来将字符类型的数据引起来。比如:
Select * from Customers where City = 'London'

当表的名字或列的名字中,含有空格等一些特殊字符时,我们需要用[] 将表名引起来,告诉语法分析器,[]号内的才是一个完整的名称。比如

Select * from [Order Details]

如果,字符数据中,含有 '  改怎么办呢?其实,好多人在这里并没有处理字符川中 ' 符号,才造成sql 注射危险。就那上面的那个例子。在Sql语句拼接的时代,比如

string sql = "select * from Customers where CustomerID = '" + temp + "'";

如果,我给temp赋值为 Tom' or 1=1 --- 
那么你拼接起来的语句为 select * from Customers where CustomerID = 'Tom' or 1=1 --- '
哈哈,1=1 衡为真,---会把后面的sql语句注释掉。而前面因为有输入的 ' 而使的语句是合法的。那or的条件,会把所有的记录都选出来。这就是sql注入。在做用户登陆时,如果没有处理该问题,那你的系统受危害的可能性会很高的。
如何处理字符数据中的 ' 符号呢? 方法很简单,用两个 ' 符号代替一个。 比如,其实际传入的值为Lon'don,处理后为
Select * from Customers where City = 'Lon''don'
就可以了。

如果表或列的名称中含有 [ 或 ] 字符呢?比如Select * from [Order] Details],那中间 ] 符号岂不是先和第一个[ 配了。后面的就是非法的了。怎么办呢? 简单,使用 ]] 代替 ] 。对于[,则无须处理。那就该为
Select * from [Order]] Details]。


posted on 2007-08-17 11:59 Tom Song 阅读(1699) 评论(4)  编辑 收藏 所属分类: Linq To Sql

Feedback

#1楼  2007-08-17 12:13 henry      
很多时候是程序员的懒惰从而引起这情况的出现,花点时间写下Parameter不就解决问题了.
  回复  引用  查看    

#2楼  2007-08-17 16:25 伍迷      
@henry
对,通常不要用拼接字符串的方式,而用Parameter的方式来处理,就不会出现类似的问题。
  回复  引用  查看    

#3楼  2007-08-24 17:32 妖居      
@henry
同意,用param比较好。再加上sp,所有的sql代码都在server里面,比较保险。
  回复  引用  查看    

#4楼  2008-02-22 17:04 Attila [未注册用户]
都用SP?那数据库负担不是很重?为什么不把计算放前台去?
  回复  引用  查看