数据库系统概论-第九章

统一资源定位符 Uniform Resource Locator URL Web上每个可访问文档在全球唯一的名字

HTTP请求无连接,请求完成后立即断开

双因素认证 two-factor authentication

两个独立的因素用于识别一个用户(两个因素不能具有同样的弱点,比如都是密码)

使用双因素认证可能会收到中间人攻击 man-in-the-middle-attack MITM

攻击者可能会伪装成代理服务器,在通信的双方传输数据时对数据进行窃取和修改。(HTTPS对数据进行加密,可以一定程度上防止中间人攻击)

单点登录 single sign-on 用于只需要认证一次,多个应用通过同一个认证服务对用户进行验证,

安全断言标记语言 security assertion markup language

在不同的认证服务间交换认证和授权信息,以提供跨机构的单点登录

OpenID

不同应用间身份认证方案

加密技术

对称加密 加密密钥同时用于加密和解密数据
非对称加密 公钥用于加密,私钥用于解密

扩展加密标准 Advanced Encryption Standard AES 基于Rijndael算法

公私钥 通常用两个大素数p1和p2的积创建公钥,私钥由(p1,p2)组成,由于计算大数的素数因子需要的时间以年计算,所以相对安全

公钥的一个应用是数字签名 digital signature 使用私钥对数据进行加密,然后用公钥进行解密,只有持有私钥的人可以加密数据

数字证书

无连接协议和有连接协议对比

无连接协议在请求完成后可以立即断开连接,因此可以为更多的客户端提供连接,并且无连接协议可以提供负载均衡和熔断机制。
无连接协议在每次请求时都需要建立,并且需要通过cokkie或者隐藏字段(hidden fields)来发送session信息。

使用缓存提高Web服务性能
1.建立HTTP连接池,减少建立HTTP连接的时间
2.缓存请求数据,如果遇到相同的请求,可以直接从缓存中取数据而不用查询数据库(同步缓存需要消耗额外的内存)

SQL注入

SQL注入发生在恶意用户试图执行自己的查询SQL时。如果应用程序通过拼接SQL进行查询,那么攻击者可能通过参数传入自己查询语句。

比如有句SQL “SELECT password FROM userinfo WHERE userid= ’ ” + userid + “ ’ ”这样拼接的,然后攻击者输入的userid是john’ OR userid= ’admin,这样SQL就变成了
SELECT password FROM userinfo WHERE userid=’john’ OR userid=’admin’;

一般我们使用预编译的方法防止SQL注入的问题。

编写管理连接池的伪码,必须包含一个创建连接池的函数(以数据库连接字符串,数据库连接账号和密码作为输入参数),一个向连接池请求连接的函数,一个归还连接的函数和一个关闭连接池的函数。

//初始化连接池的大小
INTEGER INITIAL_POOL_SIZE = 10;

//扩容时的增长值
INTEGER POOL_SIZE_INCREMENT = 5;

//连接池最大尺寸
INTEGER MAX_POOL_SIZE = 100;

//连接URL
String connectionURL;

//连接用户账号
String userAccount;

//连接用户密码
String userPassword;

//空闲连接池
Queue freeQueue = new Queue();

//活跃连接池
Queue activeQueue = new Queue();

//初始化连接池,设置大小为初始大小
void createPool(String connectionURL,String userAccount,String userPassword){
this.connectionURL = connectionURL;
this.userAccount = userAccount;
this.userPassword = userPassword;

for(int i = 0;i < INITIAL_POOL_SIZE;i++ ){
Connection conn = createConnection(connectionURL,userAccount,userPassword);
freeQueue.add(conn);
}
}

//获取连接
Connection getConnection(){
Connection conn = null;
//优先从空闲连接次获取连接资源
if(freeQueue.size() != 0){
conn = freeQueue.remove();
activeQueue.add(conn);
}

int activeConns = activeQueue.size();

//到达连接池最大连接数,抛出异常
if(activeConns == MAX_POOL_SIZE){
ERROR("has reached the max pool size");
}

//可创建线程池大于扩容增长值
if(MAX_POOL_SIZE - activeConns > POOL_SIZE_INCREMENT){
toCreateConns = POOL_SIZE_INCREMENT;
}else{ //可扩容数小于扩容增长值
toCreateConns = MAX_POOL_SIZE - activeConns;
}

for(inti =0;i<toCreateConns;i++){
Connection conn = createConnection(connectionURL,userAccount,userPassword);
freeQueue.add(conn);
}
return getConnection();
}

void releaseConnection(){
Connection conn = activeQueue.remove();
freeQueue.add(conn);
}

void closePool(){
if(activeConnections.size() != 0)
WARNING("Connections active. Will force close.");

for (i=0; i < freeConnections.size(); i++) {
  conn = freeConnections.elementAt(i); 
  freeConnections.removeElementAt(i); conn.close();
}
for (i=0; i < activeConnections.size(); i++) { 
conn = activeConnections.elementAt(i); 
activeConnections.removeElementAt(i); 
conn.close();

}
}

XSS攻击

XSS攻击者输入JavaScript或者flash脚本来代替输入参数,当另一个用户访问页面时,攻击者使用如同源策略来获取用户的cookie等包含私人信息的参数,或者其实用户输入的信息被使用在另一个网站登陆。

HTTP协议允许服务检查页面的引用,及用户点击后跳转的链接。如果检测到引用(跳转的链接)是有效的,比如引用页面和
当前页面在同一个网站,那么使用同源策略试图讲用户导向不同网站的XSS攻击将被阻止。引用字段是由浏览器设置的,因此
恶意浏览器及收到攻击的浏览器可以伪造引用字段,但是引用字段可以防止基础的XSS攻击。

HTTPS网站如何保证安全性

在HTTPS协议中,网站首先发送一个电子证书到用户的浏览器,浏览器解密使用信任的公钥解密电子证书并且从证书中解析网站的
名称。这样的话用户可以校验其将要访问的网站名称和解析的网站名称是否一致并接受证书。浏览器使用公钥(证书携带的信息)
加密用户数据。攻击者可以通过证书获取用户的信息,但是由于用户数据是加密的,攻击者在没有获取私钥的情况下无法解析
用户数据。

原文地址:https://www.cnblogs.com/Simon-cat/p/10943176.html