常见web攻击 及基础 回顾(杂记)
1.http 和 https 之间的区别; 1. http超文本传输协议 信息为明文传输 无状态 即:超文本传输协议,HTTP连接最显著的特点是客户端发送的每次请求都需要服务器 回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。 2.https 是以安全为目标的http通道 即为http协议下 加入ssl层 需要到ca申请证书 收费 ssl+http协议 构建的可进行加密传输 身份认证的网络协议 比 http安全 3.socket 是套接字 是对tcp/ip的封装 他对数据传输的两者 提供了一个全双工管道 和http一样 传输数据要经历三次握手四次挥手 和http协议的区别在于 socket是一个长连接 http是短链接 但是由于网络或者是其他原因有可能会断开链接 所以往往会提供一个心跳包 每隔一段时间 向服务器发送一个 规定好的心跳包 如果某段时间 没有心跳包 那代表已经断开链接了 socket传输的特点: 传输数据为字节级别的 传输数据可自定义 数据量小 传输数据时间段 性能高 适合客户端和服务器之间的信息实时交互 可以加密数据 数据安全性高 基于Socket传输的特点:Socket 传输方式适合于对传输速度,安全性,实时交互,费用等要求高的应用中,如网络游戏,手机应用, 银行内部交互等 基于http协议传输的特点:基于http协议传输方式适合于对传输速度,安全性 要求不是很高,且需要快速开发的应用。 如公司OA系统,互联网服务等。 tcp 和 udp tcp 和udp 是的区别 他们是传输层的两个协议 一次http操作称为一个事务 过程可分为四步 client 和 server建立链接 client发送一个请求给server 请求方式格式为:统一资源标识符(url) 协议版本号 mime信息包括server 信息 实体信息和可能的内容 server接受到请求后 给与相应的响应 格式为一个状态行 包括信息的协议版本号 一个成功或者错误的代码 后边是mime 信息 包括server信息 实体信息 和可能的内容 client 收到server信息通过浏览器显示 然后断开链接 https; client 使用 https的url访问web服务器 要求与web服务器建立ssl链接 web服务器收到客户端请求后 会将网站的证书信息(证书中包含公钥) 传送一份给客户端 客户端的浏览器与web服务器开始协商ssl链接的安全等级 也就是信息加密的等级 客户端的浏览器根据双方同意的安全等级 建立会话密钥 然后利用网站公钥将绘画密钥加密 并且传送给网站 web服务器利用自己的私钥揭密出会话密钥 web服务器利用会话密钥加密与客户端之间的通信 https;优缺点 1.https协议可认证用户和服务器 缺保数据发送到正确的客户机和服务器 2.https协议是由ssl+http协议构建的可进行加密传输身份认证的网络协议 要比http协议安全 可防止数据在传输过程中不被窃取 改变 确保数据完整性 缺点: 1https协议握手阶段比较费时 会使页面加载延长50% 增加10%到20%耗电 https链接缓存不如http高效 会增加数据开销和功耗 甚至已有的安全措施会受到影响 ssl证书需要钱 功能越强大费用越高 ssl证书一般需要绑定ip 不能再同一ip上绑定多个域名 ssl: 机密性:ssl协议使用密钥加密通信数据 可靠性:服务器和客户都会被验证 客户认证是是首选 完整性:ssl协议 会对传送数据进行完整性 检查 xss;跨站脚本攻击 1.类型 1.持久型跨站 跨站代码存储在服务器 数据库 2.非持久型跨站:反射型跨站脚本漏洞 最普遍类型 用户访问服务器 跨站链接 返回跨站代码 dom跨站 客户端脚本处理逻辑导致的 安全问题 html 注入 预防 xss 攻击 1.输入验证 2.输出编码 防御规则: 1.不要再允许位置插入不可行数据 2.在向html 元素内容插入不可信数据前对html解码 3.在向html javascript data values 插入不可信数据前 进行javascript解码 3.在向html css中插入不可行数据前进行css解码 5.在向html url属性插入不可信数据前 进行url解码 6.httpcookie only 预防XSS攻击窃取用户cookie最有效的防御手段。Web应用程序在设置cookie时,将其属性设为HttpOnly, 就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。( dos和ddos攻击 dos 即为拒绝服务 造成远程服务器拒绝服务的行为被称为dos攻击 举例子: 1.tcp 三次握手 数据段互换client 发送链接请求报文 server 接受后 回复ack报文 并且 为这次链接分配资源 client接收到ack 报文后 也向server发送ack报文 并分配资源 这样tcp链接就建立了 前两次握手 是为了保证服务端能接受到客户端信息 并做出正确的应答 后两次握手是为了保证客户端能够接受服务器信息 并做出正确的回答 建立完tcp三次握手后 client就可以和web 服务器进行通信 在dos攻击中 攻击者通过伪造 ack数据包 希望server 重传某些数据包 server 根据tcp重传 机制 进行数据重传 攻击者 利用tcp协议缺陷 通过发送大量半联结请求 耗费cpu和内存 预防 ; 第一中缩短syn time out时间 及时将超时请求丢弃 释放被占用cpu 和内存 第二种限制同时打开syn半联结数目 关闭不必要的服务 第三种 给每一个ip分配一个cookie 如果短时间内收到某个ip的重复syn报文 就认定收到了攻击 以后这个ip来的包 一概丢弃 csrf跨站请求伪造 利用cookie等伪造请求 发送攻击请求 预防 1.验证码 特别是账户交易等操作 强制用户输入验证码 2.referer http 一般会带上链接之前的地址 3.token token 值 sql 注入 (1) 转义字符处理不当。特别是输入验证和单引号处理不当。用户简单的在url页面输入一个单引号,就能快速识别Web站点是否易收到SQL注入攻击。 (2) 后台查询语句处理不当。开发者完全信赖用户的输入,未对输入的字段进行判断和过滤处理,直接调用用户输入字段访问数据库。 (3) SQL语句被拼接。攻击者构造精心设计拼接过的SQL语句,来达到恶意的目的。 如构造语句:select * from users where userid=123; DROP TABLE users;直接导致user表被删除。 SQL注入常见的注入方式有: (1) 内联SQL注入。向查询注入一些SQL代码后,原来的查询仍然会全部执行。内联SQL注入包含字符串内联SQL注入和数字内联SQL注入。 sql 索引原理 和sql建索引 索引是一种数据结构 索引中是 包含一个表中的列的值和他的物理地址的值 并且这些值存储在一个数据结构中 常用的数据结构 二叉树 哈希表 索引中寸的数据 其中只存一个表中的一列 或者 多列 多数情况下 查询都是全表检索 当我们的select是查询empno=4的时候,dbms会生成一个类似指针的东西,从empno=1的地方开始搜索, 一直搜索到表的结束,这里是empno=11. 索引类型 主键索引 普通索引 全文索引 唯一索引 sql primary key 和 unique区别 primarykey: 不能为空 只能有一个 允许多列组合 = unique +not null 做记录标记 unique:可以为空 允许多个 允许多列组合 保证唯一性 生成器 迭代器 可迭代对象 可迭代对象 包括迭代器 如果一个对象拥有__iter__方法 是可迭代对象 如果一个对象拥有了next方法 就是迭代器 生成器是一种特殊的迭代器 只能对其迭代一次 生成器自动实现了 迭代器协议 不需要手动实现 生成器在迭代过程中可以改变当前迭代值 而修改普通迭代器的当前迭代值 回发生异常 生成器一边循环 一边计算后边的值 这种机制 成为生成器 具有yield 关键字的函数都是生成器 yiled可以理解为return 返回后面的值给调用者 不同的是 return返回后函数会释放 而生成器则不会 在直接调用next方法或用for语句进行下一次迭代时 生成器会从yield下一句开始执行 直至遇到下一个yield python 赋值 copy deepcopy 赋值就是value=[1,2,3] python 首先创建一个列表对象给他贴上value的标签 赋予新值后把value标签换到新得列表 赋值前后共用一个 互相影响 浅复制 git config --global http.sslVerify false git ssl设置为false # import copy # # # 赋值 # 直接赋值 就是对象引用 # a = [1, 2, 3, [5, 6, [7, 8]]] # b = a # b[0] = 22 # b[3][1] = 22 # b[3][2][0] = 22 # a[3][2][1] = 99 # print a, id(a) # print b, id(b) # ''' # [22, 2, 3, [5, 22, [22, 99]]] # [22, 2, 3, [5, 22, [22, 99]]] # ''' # # 浅拷贝 # a = {'a': 1, 'b': 2, 'c':[1, 2, 3, [4, 5]]} # b = a.copy() # b['a'] = 'opp' # 拷贝了一份a对象父对象 互不影响 # a['a'] = '123456' # 拷贝了一份a对象父对象 互不影响 # # a['c'] = '123456' # 拷贝了一份a对象父对象 互不影响 # b['c'][0] = '789456' # 对于含有子对象的 依然是引用 # a['c'][0] = '123' # 对于含有子对象的 依然是引用 # a['c'][3][0] = '12223' # 对于含有子对象的 依然是引用 # print a # print b # ''' # {'a': '123456', 'c': ['123', 2, 3, ['12223', 5]], 'b': 2} # {'a': 'opp', 'c': ['123', 2, 3, ['12223', 5]], 'b': 2} # ''' # a = [1, 2, 3, 4, 5, [6, 7]] # b = copy.copy(a) # a[0] = 88 # 拷贝了一份a对象父对象 互不影响 # b[0] = 99 # a[-1][0] = 99 # 对于含有子对象的 依然是引用 # # b[-1][0] = 99 # print a # print b # # # 深拷贝 # import copy # a = [1, 2, 3, 4, 5, [6, 7]] # b = copy.deepcopy(a) # b[0] = 22 # 完全拷贝一份 互不影响 # b[-1][0] = 22 # a[-1][0] = 11 # a[-1] = 22 # print a,id(a) # print b,id(b) # ''' # [1, 2, 3, 4, 5, 22] # [22, 2, 3, 4, 5, [22, 7]] # ''' # # 基本语法 一般用来捕获异常 保证程序不会因为错误奔溃 或者是模块分离 # try: # pass # 用来捕获异常 # except: # exception,e 捕获所有异常(sys.exit()相关之外) # pass # else: # 没用异常执行 # pass # finally: # 都会执行 # pass # 1.索引 用到的字段做索引 复合索引 sql 语句优化(比如避免子查询 union all 等合理使用) # 2.记录上次查询id 或者主键 为条件 快速定位 先过滤 在分组 # 2.也可以设置最大offset超过另行处理 '''xrange的用法与range相同,即xrange([start,] stop[, step]) 根据start与stop指定的范围以及step设定的步长,不同的是xrange并不是生成序列,而是作为一个生成器 所以相对来说,xrange比range性能优化很多,因为他不需要一下子开辟一块很大的内存,特别是数据量比 较大的时候,pytohn3去掉xrange 用range实现了功能''' import os all_path = [] def print_directory_contents(sPath): """ sPath 是这个函数接受文件夹的名称作为输入参数, 返回该文件夹中文件的路径, 以及其包含文件夹中文件的路径 """ all_file_list = os.listdir(sPath) # 遍历该文件夹下的所有目录或者文件 for file_ in all_file_list: file_path = os.path.join(sPath, file_) # 如果是文件夹,递归调用函数 if os.path.isdir(file_path): print_directory_contents(file_path) # 如果不是文件夹,保存文件路径及文件名 elif os.path.isfile(file_path): all_path.append(file_path) return all_path '''is 比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象,是否指向同一个内存地址。 == 比较的是两个对象的内容是否相等,默认会调用对象的__eq__()方法。 '''
本文来自博客园,作者:南鱼羁荒渡,转载请注明原文链接:https://www.cnblogs.com/nanyu/p/13204301.html