SQL Server 基础II
来源:互联网 发布:蜂群算法matlab 编辑:程序博客网 时间:2024/04/28 00:05
一.语句
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();
- SQL Server 基础II
- SQL Server 转储 II
- SQL server Base II
- SQL Server Replication II
- SQL Server基础
- SQL SERVER 2005 基础
- sql server 数据库基础
- SQL Server数据库基础
- Sql Server 基础
- SQL Server基础
- SQL Server 基础
- sql server使用基础
- sql server基础
- SQL Server 基础1
- SQL Server----语言基础
- SQL Server程序设计基础
- SQL server 基础
- SQL Server基础试题
- Hibernate JPA 悲观锁,乐观锁
- (动态规划)最长回文子序列、回文子序列个数
- jsp <c:forEach> 标签属性解析
- 修改ObjectMapper的StdDateFormat(字符串日期格式化源码),支持更多格式
- Cocos2d-x iOS唯一标识解决方案
- SQL Server 基础II
- 20170228#cs231n#5.Neural Networks Part 1神经网络1 /Assignment1-NeuralNetwork
- Hadoop学习笔记—9.Partitioner与自定义Partitioner
- 测试图片
- 汇总Android视频录制中常见问题---待更新
- android 中关于输入法的一些小tips
- 我是如何从零开始自学Android到一万月薪的
- PHP 数组函数 array_map
- app-inspector 的使用