SQL Server 基础II
2017-03-01 13:56
288 查看
一.语句
1.insert into statement(语句)
INSERT INTO table_name
VALUES (value1,value2,value3,...);
此时的新插入的数据个数必须符合列的数量,如果有无效值就打入null。
或
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
eg.在表格中插入一行新的数据
INSERT INTO Customers
(CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Cardinal','Tom
B. Erichsen','Skagen 21','Stavanger','4006','Norway');
eg.在表格中插入一行新的数据,没有提到的列则默认为null
INSERT INTO Customers
(CustomerName, City, Country)
VALUES ('Cardinal', 'Stavanger', 'Norway');
2.update statement(语句)更改表格中已经存在的数据
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
这里的where指定要更改数据的行,如果没有写where,则默认所有数据的那一列全部更改
eg.把ID为1的这一行中的city列数据改为hamburg
UPDATE Customers
SET City='Hamburg'
WHERE CustomerID=1;
eg.把ID为1的这一行中的contactname和city列数据都更改
UPDATE Customers
SET ContactName='Alfred
Schmidt', City='Frankfurt'
WHERE CustomerID=1;
eg.把country这列中为mexico的数据的contactname都更改为juan
UPDATE Customers
SET ContactName='Juan'
WHERE Country='Mexico';
eg.此处没有where语句,则所有数据的contactname列都改为juan
UPDATE Customers
SET ContactName='Juan';
3.delete statement(语句)
DELETE FROM table_name
WHERE some_column=some_value;
如果没有where子句,则默认是删除全部数据
小心使用这个语句,因为很可能命令执行后不可以返回
eg.删除表格中的customername为Alfreds Futterkiste而且ContactName为Maria
Anders的一行数据
DELETE FROM Customers
WHERE CustomerName='Alfreds
Futterkiste' AND ContactName='Maria
Anders';
eg.删除表格中的所有数据,但是表格的属性、结构等特性还维持不变
DELETE FROM table_name;
或
DELETE * FROM table_name;
二.用户注入(Injection)
1.把SQL语句应用在网页上
eg.
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
2.有些SQL语句的注入会威胁到网络安全
3.基于1=1恒等式的SQL注入
eg.要显示一个ID号码为105的客户信息,如果ID号码里没有105,则会报错,但是如果加上1=1这个恒等式,如下所示
SELECT * FROM Users WHERE UserId
= 105 or 1=1;
此时就会显示所有客户的信息
eg.同理,我们想要看到所有客户的用户名和密码
SELECT UserId, Name, Password FROM Users WHERE UserId
= 105 or 1=1;
这就是黑客可能在网页输入框中输入的信息
4.基于=恒成立的SQL注入
eg.网页通常用户登录时需要用户输入用户名和密码,服务器的代码为
uName = getRequestString("UserName");
uPass = getRequestString("UserPass");
sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'
运行结果为
SELECT * FROM Users WHERE Name
="John Doe" AND Pass
="myPass"
但是黑客很可能在登录页面的用户名和密码的输入框里都输入"or""=",然后结果为
SELECT * FROM Users WHERE Name
="" or ""="" AND Pass
="" or ""=""
此时就会显示所有用户的用户名和密码
5.基于分批处理命令的SQL注入
正常情况下,数据库是支持批处理分号隔开的命令,比如下面的代码会返回Users表格中的所有行,然后再删除掉一个叫Suppliers的表格
SELECT * FROM Users; DROP TABLE Suppliers
而且如果网页上含有下列语句
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
而黑客在User ID输入框中输入
105; DROP TABLE Suppliers
运行结果为
SELECT * FROM Users WHERE UserId
= 105; DROP TABLE Suppliers
则会显示表格的ID为105的数据,而且删除掉数据库里一个叫Suppliers的表格
6.保护参数(parameters)
用@做标记
例如
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);
或
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);
7.构建参数化(parameters)查询
select语句
txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserID);
command.ExecuteReader();
insert into语句
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();
1.insert into statement(语句)
INSERT INTO table_name
VALUES (value1,value2,value3,...);
此时的新插入的数据个数必须符合列的数量,如果有无效值就打入null。
或
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
eg.在表格中插入一行新的数据
INSERT INTO Customers
(CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Cardinal','Tom
B. Erichsen','Skagen 21','Stavanger','4006','Norway');
eg.在表格中插入一行新的数据,没有提到的列则默认为null
INSERT INTO Customers
(CustomerName, City, Country)
VALUES ('Cardinal', 'Stavanger', 'Norway');
2.update statement(语句)更改表格中已经存在的数据
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
这里的where指定要更改数据的行,如果没有写where,则默认所有数据的那一列全部更改
eg.把ID为1的这一行中的city列数据改为hamburg
UPDATE Customers
SET City='Hamburg'
WHERE CustomerID=1;
eg.把ID为1的这一行中的contactname和city列数据都更改
UPDATE Customers
SET ContactName='Alfred
Schmidt', City='Frankfurt'
WHERE CustomerID=1;
eg.把country这列中为mexico的数据的contactname都更改为juan
UPDATE Customers
SET ContactName='Juan'
WHERE Country='Mexico';
eg.此处没有where语句,则所有数据的contactname列都改为juan
UPDATE Customers
SET ContactName='Juan';
3.delete statement(语句)
DELETE FROM table_name
WHERE some_column=some_value;
如果没有where子句,则默认是删除全部数据
小心使用这个语句,因为很可能命令执行后不可以返回
eg.删除表格中的customername为Alfreds Futterkiste而且ContactName为Maria
Anders的一行数据
DELETE FROM Customers
WHERE CustomerName='Alfreds
Futterkiste' AND ContactName='Maria
Anders';
eg.删除表格中的所有数据,但是表格的属性、结构等特性还维持不变
DELETE FROM table_name;
或
DELETE * FROM table_name;
二.用户注入(Injection)
1.把SQL语句应用在网页上
eg.
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
2.有些SQL语句的注入会威胁到网络安全
3.基于1=1恒等式的SQL注入
eg.要显示一个ID号码为105的客户信息,如果ID号码里没有105,则会报错,但是如果加上1=1这个恒等式,如下所示
SELECT * FROM Users WHERE UserId
= 105 or 1=1;
此时就会显示所有客户的信息
eg.同理,我们想要看到所有客户的用户名和密码
SELECT UserId, Name, Password FROM Users WHERE UserId
= 105 or 1=1;
这就是黑客可能在网页输入框中输入的信息
4.基于=恒成立的SQL注入
eg.网页通常用户登录时需要用户输入用户名和密码,服务器的代码为
uName = getRequestString("UserName");
uPass = getRequestString("UserPass");
sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'
运行结果为
SELECT * FROM Users WHERE Name
="John Doe" AND Pass
="myPass"
但是黑客很可能在登录页面的用户名和密码的输入框里都输入"or""=",然后结果为
SELECT * FROM Users WHERE Name
="" or ""="" AND Pass
="" or ""=""
此时就会显示所有用户的用户名和密码
5.基于分批处理命令的SQL注入
正常情况下,数据库是支持批处理分号隔开的命令,比如下面的代码会返回Users表格中的所有行,然后再删除掉一个叫Suppliers的表格
SELECT * FROM Users; DROP TABLE Suppliers
而且如果网页上含有下列语句
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
而黑客在User ID输入框中输入
105; DROP TABLE Suppliers
运行结果为
SELECT * FROM Users WHERE UserId
= 105; DROP TABLE Suppliers
则会显示表格的ID为105的数据,而且删除掉数据库里一个叫Suppliers的表格
6.保护参数(parameters)
用@做标记
例如
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);
或
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);
7.构建参数化(parameters)查询
select语句
txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserID);
command.ExecuteReader();
insert into语句
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();
相关文章推荐
- PpLK: SQL Server基础和 Transact - SQL语言
- SQL Server 连接基础知识
- MS SQL入门基础:用户和安全性管理--SQL Server的登录认证
- 剖析SQL Server 2005查询通知之基础篇
- SQL Server 基础概念集
- 数据库基础 SQL Server 2005对海量数据处理
- MS SQL入门基础:SQL Server 安全性管理的途径
- MS SQL入门基础:SQL Server 2000 的关键字
- SQL Server 2005基础教程 (試讀)
- SQL Server基础
- SQL Server 基础概念集
- VSTS 2005 写SQL Server存储过程基础 (C#)
- SQL Server 基础概念集[转]
- 剖析SQL Server 2005查询通知之基础篇
- 系统分析员备考之ISO9000系列基础篇II(质量认证基础)
- c基础--II
- SQL Server基础概念集
- MS SQL入门基础:SQL Server 的工具--SQL Mail
- SQL Server 2000基础教程——字符串函数(二)
- SQL Server 索引基础知识(1)--- 记录数据的基本格式