HTTP 详解(下)---网站攻击 socket 编程

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 能够做的事情包括:以你名义发送邮件,发消息,盗取你的账 号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。

  1. 用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A;
  2. 在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器,此时用户登录网站 A 成功,可以正常发送请求到网站 A;
  3. 用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B;
  4. 网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点 A;
  5. 浏览器在接收到这些攻击性代码后,根据网站 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();
        }

    }
}

猜你喜欢

转载自blog.csdn.net/jcsyl_mshot/article/details/80727802