绿盟实习点滴【3】

来源:互联网 发布:js解决url中文传参乱码 编辑:程序博客网 时间:2024/03/28 17:22

一周别来无恙,新知识收好


SSL/TLS

概念:SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。
作用:不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,存在窃听风险,篡改风险和冒充风险

运行过程:SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

  • 客户端向服务器端索要并验证公钥
  • 双方协商生成”对话密钥”
  • 双方采用”对话密钥”进行加密通信。

SSH

概念:SSH为Secure Shell的缩写,由IETF的网络小组(Network Working Group)所制定;SSH为建立在应用层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。

作用:通过使用SSH,可以把所有传输的数据进行加密,这样”中间人”这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的”通道”。


Socket

预备知识:要想理解socket首先得熟悉一下TCP/IP协议族,TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,每一抽象层建立在低一层提供的服务上,并且为高一层提供服务,看起来大概是这样子的

这里写图片描述

在TCP/IP协议中两个因特网主机通过两个路由器和对应的层连接。各主机上的应用通过一些数据通道相互执行读取操作

这里写图片描述

socket概念:什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket作用:把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
怎么利用socket通信?:两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,那么在基于应用与传输层之间的一个抽象层,该如何标示一个网络中的进程呢?我们使用ip地址+协议+端口号唯一标示网络中的一个进程。
socket通信流程:如下图所示

这里写图片描述

值得注意的是:服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回


APT

概念:APT(Advanced Persistent Threat)——–高级持续性威胁。 利用先进的攻击手段对特定目标进行长期持续性网络攻击的攻击形式。

特点:高度目的性,高度隐蔽性,高度突然性,高度规模性,高度危害性,高度复合性,共时并发性,目标实体化,攻击非对称化—–真正的APT攻击不是单个黑客或者几个黑客为了捞点儿钱就能搞出来的花样,那必然是有着深厚背景和强大支撑力量的组织发起的,只有这样才能支持和维持APT攻击所需要的大量时间、人力、物力与财力。
攻击步骤

这里写图片描述


IDS

概念:IDS是“Intrusion Detection Systems”的简称,也就是入侵防御系统;在本质上,入侵检测系统是一个典型的”窥探设备“。它不跨接多个物理网段(通常只有一个监听端口),无须转发任何流量,而只需要在网络上被动的、无声息的收集它所关心的报文即可。对收集来的报文,入侵检测系统提取相应的流量统计特征值,并利用内置的入侵知识库,与这些流量特征进行智能分析比较匹配。

IDS与防火墙的区别:防火墙只是防御为主,通过防火墙的数据便不再进行任何操作,IDS则进行实时的检测,发现入侵行为即可做出反应,是对防火墙弱点的修补;防火墙可以允许内部的一些主机被外部访问,IDS则没有这些功能,只是监视和分析用户和系统活动。


零碎的Python知识

#!/usr/bin/python

我们经常可以在别人的py文件中看到这一行,现在了解一下,这是用来指定用什么解释器运行脚本以及解释器所在的位置。在运行时刻申明这是个python脚本,要用python解释器来运行。

更通用的方法:为了防止操作系统用户没有将python装在默认的/usr/bin路径里,可以用#!/usr/bin/env python,当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作


str.format()格式化字符串

概念:与格式化字符串不同的是,它通过{}和:来代替%

栗子解析:

In[2]: "{0},{1},{0}".format("zero","one","two")Out[2]: 'zero,one,zero'In[3]: "{0},{1},{0},{2}".format("zero","one","two")Out[3]: 'zero,one,zero,two'In[4]: "{name},{age}".format(name="mrlevo",age = "23")Out[4]: 'mrlevo,23'In[5]: "My name is {0[0]},{0[1]} years old".format(["mrlevo","23"])Out[5]: 'My name is mrlevo,23 years old'

上面的栗子比较好懂,但下面的栗子有必要说明一下

“^”、”<”、”>”分别是居中、左对齐、右对齐,后面带宽度”
:”号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充

# 下面的栗子说明,左对齐,留有10个位置,如果没填充够,用n来填充In[7]: "{:n<10}".format("Python")Out[7]: 'Pythonnnnn'

想要了解更多细节请看@Hongten–python中的字符串格式函数str.format()


Pipe管道

pipe概念:可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信

实现机制:管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。

简单栗子:实现两个进程之间的信息通信

from multiprocessing import Process, Pipeimport timedef TimeTest(pipe):    for i in range(20):        print "the pipe sent is %s"%i        pipe.send(i)        time.sleep(1)def ShowDetail(pipe):    while True:        print "the dataflow from Func:",pipe.recv()        time.sleep(2)if __name__ == '__main__':    pipe = Pipe()    p4 = Process(target=TimeTest,args=(pipe[0],))    p3 = Process(target=ShowDetail,args=(pipe[1],))    p4.start()    p3.start()    p4.join()    p3.join()

输出以下内容

the pipe sent is 0the dataflow from Func: 0the pipe sent is 1the pipe sent is 2the dataflow from Func: 1the pipe sent is 3the pipe sent is 4the dataflow from Func: 2the pipe sent is 5the pipe sent is 6the dataflow from Func: 3...

可见,Pipe的运行方式有点像队列,我send一个值放进管道中,之后读取的时候,还是按照先进先出的原则,也就是说和队列保持一致,而且,放入管道中的值是按照顺序取的。

再来个例子,Pipe默认是支持全双工的,就是说,即可收信息又可发信息:

from multiprocessing import Process, Pipedef TimeTest(pipe):    pipe.send("T:Hello! ShowDetail!\nHow is the weather? ")    print pipe.recv()    pipe.send("T:Don't worry,i can handle it!\nthanke you anywhere ")    print pipe.recv()def ShowDetail(pipe):    print pipe.recv()    pipe.send("S:Hi,TimeTest,the weather is not so good\nhow about your work?")    print pipe.recv()    pipe.send("S:All right!")if __name__ == '__main__':    pipe = Pipe()    p4 = Process(target=TimeTest,args=(pipe[0],))    p3 = Process(target=ShowDetail,args=(pipe[1],))    p4.start()    p3.start()    p4.join()    p3.join()

两个进程之间的聊天

T:Hello! ShowDetail!How is the weather? S:Hi,TimeTest,the weather is not so goodhow about your work?T:Don't worry,i can handle it!thanke you anywhere S:All right!# 对,我就是那么无聊,可以过来打我

想了解更多请看@rfyiamcool–使用pipe管道使python fork多进程之间通信


sys.argv[] 使用

sys.argv[0]表示代码本身文件路径
目前用的比较多的就是logging记录日志的时候用自己的文件名作为日志名的一部分进行记录,这样比较方便,以后存储别的文本txt也好CSV也好,可以有更好的命名方式了呢!

#比如说我的文件是test.py# 执行如下操作import syswith open("%s.txt"%(sys.argv[0][:-3]),"a") as f:    f.write("this is a test")# 输出在同一目录的名为test的txt文件# 如果我改变为sys.argv[0],则输出名为test.py的txt文件,[:-3]相当于是切片操作

logging日志

因为在服务器上跑任务需要查看实时记录的日志,所以这里顺便学习一下日志相关的东西
为什么要用log而不是存在txt:以我现在使用多个角度来说,log能够时时的显示数据,而且数据的等级也不一样,便于观察和管理,而且可以了解内部运行过程,划分打印等级等等,目前想到的只有那么多,以后补充

封装起来后调用使用:

def Init_Logging(level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt='%a, %d %b %Y %H:%M:%S',filename='%s.log'%(sys.argv[0]),                        filemode="a"):    logging.basicConfig(level=level,                        format=format,                        datefmt=datefmt,                        filename=filename,                        filemode=filemode)    logger = logging.getLogger('main')    return logger# 这里抽象为一个函数了。# 直接调用即可,产生什么log类型随意# 比如:产生info,或者debuglog = Init_Logging(filename=logname) #实例化,具体参数自己传递log.info(current_log)log.debug(TimeDetail)# 其中current_log和TimeDetail分别是写入info和debug的内容,就是你想print的内容,它帮你写进日志里了而已 

如果还想深入学习用法请参考
@转–说一说Python logging
@DK’s Blog–python 的日志logging模块学习


zip联结

定义:zip([seql, …])接受一系列可迭代对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。

栗子:

#!/usr/bin/python# -*- coding: utf-8 -*-name = ['mrlevo','hasky']kind = ['human','dog']z1 = [1,2,3]z2 = [4,5,6]result = zip(z1,z2) # 压缩过程uzip= zip(*result) # 解压过程,拆分为元组print "the zip:",result# the zip: [(1, 4), (2, 5), (3, 6)]print "the uzip:",uzip#the uzip: [(1, 2, 3), (4, 5, 6)]print "the uzip part of z1:%s\nthe uzip part of z2:%s"%(str(uzip[0]),str(uzip[1]))#the uzip part of z1:(1, 2, 3)#the uzip part of z2:(4, 5, 6)

更多高级的用法请参考@BeginMan–Python零碎知识(2):强大的zip


一周总结

上一周还是按部就班的工作学习,多分配给我了四台服务器,帮我搭好了集群环境,只是因为我说了一句我电脑跑不动了,想学spark。这周接触到新的东西都值得记录,数据分析方面找到了一个可视化的大神可以带我飞,不过学echarts之前还得把js和css学了,学这些顺便把django也学了,正好有人带,不懂得还可以问问挺好,前京东小哥写分布式的爬虫,刚好代码也可以借来学习观摩观摩,研究课题方面也找到个算法大哥,超参数用的66的,顺便可以请教一下课题方面的事,虽然现在网络方面安全方面不懂,但可以慢慢学,django学完估计会对网络有个更深刻的理解,各个方面跟进把,虽然很累,过着9-22-7的生活(这里周末竟然只有我一个人0.0他们不加班的),觉得可能这是我活到现在感觉到最忙碌的时刻了,中午休息时间顺便把记录博客写了。好在写这段总结不需要脑子,哈哈,权当作休息了,哈尔滨下雪了,我倒是想回去看看。

致谢

@转–简单理解Socket
@阮一峰–SSL/TLS协议运行机制的概述
@水波–什么是 APT 攻击?
@Hongten–python中的字符串格式函数str.format()
@yuyan–Python sys.argv[] 使用
@qyf404–Linux查看日志命令
@DK’s Blog–python 的日志logging模块学习
@转–说一说Python logging
@BeginMan–Python零碎知识(2):强大的zip
@rfyiamcool–使用pipe管道使python fork多进程之间通信

0 0
原创粉丝点击