统一资源定位符 Uniform Resource Locator URL Web上每一个可访问文档在全球惟一的名字git
HTTP请求无链接,请求完成后当即断开算法
双因素认证 two-factor authentication数据库
两个独立的因素用于识别一个用户(两个因素不能具备一样的弱点,好比都是密码)浏览器
使用双因素认证可能会收到中间人攻击 man-in-the-middle-attack MITM缓存
攻击者可能会假装成代理服务器,在通讯的双方传输数据时对数据进行窃取和修改。(HTTPS对数据进行加密,能够必定程度上防止中间人攻击)安全
单点登陆 single sign-on 用于只须要认证一次,多个应用经过同一个认证服务对用户进行验证,服务器
安全断言标记语言 security assertion markup languagecookie
在不一样的认证服务间交换认证和受权信息,以提供跨机构的单点登陆session
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协议中,网站首先发送一个电子证书到用户的浏览器,浏览器解密使用信任的公钥解密电子证书而且从证书中解析网站的 名称。这样的话用户能够校验其将要访问的网站名称和解析的网站名称是否一致并接受证书。浏览器使用公钥(证书携带的信息) 加密用户数据。攻击者能够经过证书获取用户的信息,可是因为用户数据是加密的,攻击者在没有获取私钥的状况下没法解析 用户数据。