您的位置:首页 > 数据库

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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息