1. http 和 socket 的区别,两个协议哪个更高效一点
创建 Socket 连接时,可以指定使用的传输层协议,Socket 可以支持不同的传输层协 议(TCP 或 UDP),当使用 TCP 协议进行连接时,该 Socket 连接就是一个 TCP 连接。 Socket 连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。注意, 同 HTTP 不同的是 http 只能基于 tcp,socket 不仅能走 tcp,而且还能走 udp,这个是 socket 的第一个特点。
HTTP 连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要 客户端向服务器发出请求后,服务器端才能回复数据。
Socket 效率高,至少不用解析 http 报文头部一些字段 。
2. 攻击网站的方法和原理。
1.DDos 攻击
syn Flood.
Land 攻击
2.XSS 攻击
又叫“跨站脚本攻击”。它指的是恶意攻击者往 Web 页面里插入恶意 html 代码,当 用户浏览该页之时,嵌入其中 Web 里面的 html 代码会被执行,从而达到恶意的特殊目的。 XSS 是实现 CSRF 的诸多途径中的一条,但绝对不是唯一的一条。比如:有些人在留言板中输入恶意脚本来获取用户的帐号和密码。
其特点是不对服务器端造成任何伤害, 而是通过一些正常的站内交互途径,例如发布评论,提交含有 JavaScript 的内容文本。这 时服务器端如果没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本。
解决方案:输入检查
输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如<、>、’、”等,如果 发现存在特殊字符,则将这些字符转义。
3.CSRF 攻击
又叫“跨站请求伪造”。可以这么理解 CSRF 攻击:攻击者盗用了你的身份,以你的 名义发送恶意请求。CSRF 能够做的事情包括:以你名义发送邮件,发消息,盗取你的账 号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
- 用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A;
- 在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器,此时用户登录网站 A 成功,可以正常发送请求到网站 A;
- 用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B;
- 网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点 A;
- 浏览器在接收到这些攻击性代码后,根据网站 B 的请求,在用户不知情的情况下携带 Cookie 信息,向网站 A 发出请求。网站 A 并不知道该请求其实是由 B 发起的,所以会根据用户 C 的 Cookie 信息以 C 的权限处理该请求,导致来自网站 B 的恶意代码被执行
从上可以看出,要完成一次 CSRF 攻击,受害者必须依次完成两个步骤:
1.登录受信任网站 A,并在本地生成 Cookie。
2.在不退出 A 的情况下,访问危险网站 B
防御方法:
.CSRF 攻击是有条件的,当用户访问恶意链接时,认证的 cookie 仍然有效,所以 当用户关闭页面时要及时清除认证 cookie。
.在客户端页面增加伪随机数。在所有 POST 方法提交的数据中提供一个不可预测 的参数,比如一个随机数或者一个根据时间计算的 HASH 值,并且在 Cookie 中也同样保 存这个参数值(保证 2 者数值的一致)。把这个参数嵌入标签保存在 FORM 表单中,当浏 览器提交 POST 请求到服务器端时,从 POST 数据中取出这个参数并且和 Cook.ie 中的 值做比较,如果两个值相等则认为请求有效,不相等则拒绝。根据同源策略(同源策略仅仅阻止了脚本读取来自其他站点的内容.但是却没有防止脚本向其他站点发出请求)和 Cookie 的安 全策略,第三方网页是无法取得 Cookie 中的参数值的.所以它不能构造出相同随机参数 的 POST请求.
3. 怎么确保数据传输过程中的安全性
3.1.数据加密
3.1.1 单向散列算法: MD5, SHA1
功能:
输入任意长度的信息, 经过处理, 输出为 128 位的信息(数字指纹) ;
不同的输入得到的不同的结果(唯一性) ;
根据 128 位的输出结果不可能反推出输入的信息(不可逆) ;
用途:
1、 防止被篡改, 比如我提供文件下载, 为了防止不法分子在安装程序中添加木马, 我可以在网站上公布由安装文件得到的 MD5 输出结果。
2、 防止直接看到明文, 现在很多网站在数据库存储用户的密码的时候都是存储用户密码的 MD5 值。 这样就算不法分子得到数据库的用户密码的 MD5 值, 也无法知道用户的密码。
3、 防止抵赖(数字签名), 例如 A 写了一个文件, 认证机构对此文件用 MD5 算法产生摘要信息并做好记录。 这样可以防止出现以后 A 不承认此事而带来的麻烦。
3.1.2 对称加密算法: DES, AES, RC4
AES:高级加密标准, 是下一代的加密算法标准, 速度快, 安全级别高。
3.1.3 非对称加密算法: RSA,DSA
3.2. 权限控制
4. Socket 编程
4.1服务端程序编写:
创建 Socket 连接时, 可以指定使用的传输层协议, Socket 可以支持不同的传输层协议(TCP 或 UDP) , 当使用 TCP 协议进行连接时, 该 Socket 连接就是一个 TCP 连接。Server 端所要做的事情主要是建立一个通信的端点, 然后等待客户端发送的请求。 典型的处理步骤如下: (服务器端建立连接过程)
1.构建一个 ServerSocket 实例, 指定本地的端口。 这个 socket 就是用来监听指定端口的连接请求的。
2.重复如下几个步骤:
a. 调用 socket 的 accept()方法来获得下面客户端的连接请求。 通过 accept()方法返回的socket 实例, 建立了一个和客户端的新连接。
b.通过这个返回的 socket 实例获取 InputStream 和 OutputStream,可以通过这两个 stream来分别读和写数据。
c.结束的时候调用 socket 实例的 close()方法关闭 socket 连接
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class serviceSocket {
public static void mian(String[] args) {
ServerSocket server = null;
try {
try {
server = new ServerSocket(4700);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("server-------------------------");
Socket socket = null;
try {
// 使用 accept()阻塞等待客户请求, 有客户
// 请求到来则产生一个 Socket 对象, 并继续执行
socket = server.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String line;
// 由 Socket 对象得到输入流, 并构造相应的 BufferedReader 对象
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 由 Socket 对象得到输出流, 并构造 PrintWriter 对象
PrintWriter os = new PrintWriter(socket.getOutputStream());
// 由系统标准输入设备构造 BufferedReader 对象
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client:"+is.readLine());
line = sin.readLine();
while(!line.equals("bye")) {
// 向客户端输出该字符串
os.println(line);
System.out.println("client:"+is.readLine()+"\n");
// 从系统标准输入读入一字符串
line = sin.readLine();
}
os.close();
is.close();
socket.close();
server.close();
}catch(Exception e) {
System.out.print(e);
}
}
}
4.2 客户端的请求过程稍微有点不一样:
1.构建 Socket 实例, 通过指定的远程服务器地址和端口来建立连接。
2.通过 Socket 实例包含的 InputStream 和 OutputStream 来进行数据的读写。
3.操作结束后调用 socket 实例的 close 方法, 关闭
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class clientSocket {
public static void main(String args[]) {
try {
Socket socket = new Socket("127.0.0.1",4700);
BufferedReader sin = new BufferedReader(new
InputStreamReader(System.in));
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader is = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
System.out.println("Client------------------------------");
String readline;
readline = sin.readLine(); // 从系统标准输入读入一字符串
while (!readline.equals("bye")) {
os.println(readline);
os.flush();
System.out.println("Server:" + is.readLine());
readline = sin.readLine(); // 从系统标准输入读入一字符串
}
os.close(); // 关闭 Socket 输出流
is.close(); // 关闭 Socket 输入流
socket.close(); //关闭 Socket
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}