防止SQL注入
原文地址:http://hi.baidu.com/%BC%D9%BA%EC%D2%B6%CE%E8%CE%F7%B7%E7/blog/item/81f35da209e287abcbefd005.html
1. 什么是SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过递交参数构造巧妙的SQL语句,从而成功获取想要的数据。
2. SQL注入的种类
从具体而言,SQL注入可分为五大类,分别是:数字型注入、字符型注入、搜索型注入(like)、in型的注入、句语连接型注入。从应用来说,要特别注意IP、搜索、批量删除、从数据库转到数据库等地方的SQL注入。
3. 如何防止SQL注入
3.1 SQL注入产生的原因
看下面检查登陆的SQL语句:
SQL代码
SqlCommand cmd = new SqlCommand("SELECT * from PE_USERS WHERE UserName = '"
+ UserName + "' AND UserPassword = '" + PassWord + "'", conn);
由于没有对UserName和PassWord进行任何验证,如果UserName=” admin’ OR 1=1--“
所执行的SQL语句就成了:
SQL代码
SELECT * from PE_USERS WHERE UserName=’admin’ OR 1=1—‘ AND UserPassword=’’
这就造成了SQL注入,条件永远为真,也就不用密码也能登陆成功。
3.2主要防御方式
防御手段一:参数化查询
保护级别:★★★★★
描述:
使用参数化查询的好处:可以防止sql注入式攻击,提高程序执行效率。
例如:
SQL代码
const string strSql = "SELECT * from [PE_Users] WHERE UserName = @UserName";
Parameters parms = new Parameters("@UserName", DbType.String, userName);
中有一个参数@UserName, 使用Prarmeter对象,通过它把参数添加到Command对象上,
这样就获得参数化查询。
14
14 安全开发手册
如上述语句,ADO.NET 会向SQL Server 发送下面的SQL语句:
SQL代码
Exec sp_executesql N ‘select * from [pe_users] where username=@username ‘,N
‘@username nvarchar(20) ‘,@username=N ‘name’
SQL Server 把@username 替换成字符串”name”,然后再执行查询.
假设有下面的输入:
SQL代码
‘ union select @@version,null,null—
生成的SQL语句如下所示:
SQL代码
Exec sp_executesql N ‘select * from [pe_users] where username=@username &
相关文档:
设计原则
符号三大范式(每一列表达一个意思,每一行代表一个实例/每一行有唯一键/表内没有其它表的非主键信息)
每个表应该有的3个有用字段(记录创建或更新时间/记录创建者/记录版本)
避免保留字
表应避免可为空的列
命名规范
表
表名如Or ......
Linq to SQL uses a DataContext to manage it's access to the database as well as tracking changes made to entities retrieved from the database. Linq to SQL has a persistent approach to managing its 'connection' to the database via this data context and it basically assumes that you use a single Dat ......
1、在.net framework 2.0的安装目录下
(默认是WINNT\Microsoft.NET\Framework\v2.0.40607),启动一个叫ASPnet_regsql.exe的命令行工具,比如:
ASPnet_regsql -S localhost –U sa –P 123456 -d Pubs –ed
上面的意思是,指定了本地的数据库服务器localhost,并指定了登陆的用户名和密码,并用参 ......
比如在Northwind数据库中
有一个查询为
SELECT c.CustomerId, CompanyName
from Customers c
WHERE EXISTS(
SELECT OrderID from Orders o
WHERE o.CustomerID = cu.CustomerID)
这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯 ......