说明
- 本文主要对json内容的读取
实例
data.json
文件内容
1 | {"code": 1, "msg":"success", "data":[{"id": 1, "name":"西瓜"},{"id": 2, "name": "苹果"}]} |
main.go
代码
1 | package main |
data.json
文件内容1 | {"code": 1, "msg":"success", "data":[{"id": 1, "name":"西瓜"},{"id": 2, "name": "苹果"}]} |
main.go
代码1 | package main |
Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求
常用的Socket类型有两种:流式Socket和数据报式Socket,流式是一种面向连接的Socket,针对于面向连接的TCP服务应用,数据报式Socket是一种无连接的Socket,针对于无连接的UDP服务应用
TCP:比较靠谱,面向连接,比较慢
UDP:不是太靠谱,比较快
举个例子:TCP就像货到付款的快递,送到家还必须见到你人才算一整套流程。UDP就像某快递快递柜一扔就走管你收到收不到,一般直播用UDP。
1 | # hello_work\tcp\server.go |
1 | package main |
分别运行go run hello_work/tcp/server.go
和go run hello_work/tcp/client.go
客户端输入数据后,服务端返回数据
1 | PS E:\proj\gowork\hello_work\tcp> go run .\server.go |
1 | # hello_work/http/server.go |
1 | go run hello_work/http/server.go |
1 | # hello_work/http/client |
1 | PS E:\proj\gowork\hello_work> go run .\http\client.go |
1 | # hello_work/http/server.go |
1 | # hello_work/http/client |
1 | S E:\proj\gowork> go run .\hello_work\http\client.go |
在处理json这种数据结构时,感觉go还是比较复杂,还是python用起来更舒服
打开官网,下载win平台下的msi安装文件,环境变量设置E:\app\Go\bin
本地新建目录,E:\proj\gowork
作为工作空间
初始化项目
1 | cd E:\proj\gowork |
go mod tidy 执行后,把当前项目中不需要用的依赖文件删除,也就是go.mod中添加的依赖文件
1 | Administrator@WIN-5TF67LA12I4 MINGW64 /e/proj/gowork |
ctrl+shift+x
,打开扩展,安装GO和chinese1 | go env -w GO111MODULE=on |
Ctrl+Shift+P
然后搜索>Go:Install/Update Tools
然后勾选全部项目即可。E:\proj\gowork
目录go get github.com/georgehao/gomodtestc
go.mod
文件中生产的代码如下1 | module example.com/hello_work |
hello_wrok/main.go
1 | package main |
在编写代码中,比如输入Print_hello,import自动导入依赖包
hello_work/hello.go
1 | package main |
hello_work/util/work.go
1 | package util |
1 | PS E:\proj\gowork> go run .\hello_work\main.go .\hello_work\hello.go |
go1.18
以后的版本,不在使用GOPATH
进行项目依赖管理,因此在搭建环境过程中就不在需要新建src,bin,pkg
目录
1 | from tkinter import * |
root = Tk()
,查看源码,发现其实就是实例化class Tk(Misc, Wm)
,发现注释中写明了是Base class
,经过搜索发现了6个基类,这6个基类包含了常见的组件1 | from tkinter import * |
主要用于显示文本信息,也可以显示图像,常见属性如下
width,height
用于指定区域大小,如果显示是文本,则以单个英文字符大小为单位(一个汉字宽度占 2 个字符位置,高度和英文字符一样);如果显示是图像,则以像素为单位。默认值是根据具体显示的内容动态调整。
font
指定字体和字体大小,如:font =(font_name,size)
image
显示在 Label 上的图像,目前 tkinter 只支持 gif 格式。
fg
和 bg
fg(foreground
):前景色、bg(background)
:背景色
justify
针对多行文字的对齐,可设置 justify 属性,可选值”left” “center” “right”
1 | from tkinter import * |
上述例子中,注意pack()的用法,是tkinter中一种布局管理的方法,文章后面介绍了三种布局
我们可以通过 Options 设置组件的属性,从而控制组件的各种状态。比如:宽度、高度、颜色、位置等等。
1 | class Application(Frame): |
print(self.btn01.config())
可查看到options中的常用方法
1 | from tkinter import * |
tkinter
提供了三种管理器:pack、grid、place
。
grid 表格布局,采用表格结构组织组件。子组件的位置由行和列的单元格来确定,并且可以跨行和跨列,从而实现复杂的布局。
1 | # 测试 Grid 布局管理器的基本用法,使用面向对象的方式 |
1 | # 测试 pack 布局管理 |
place 布局管理器可以通过坐标精确控制组件的位置,适用于一些布局更加灵活的场景
1 | from tkinter import * |
1 |
|
1 | pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple |
1 | D:\project\studyTK>pyinstaller -F main.py |
_iter_
方法和_next_
方法都是迭代器 iter
转换为迭代器next
进行迭代操作,当所有数据迭代完毕后,再使用 next
迭代,会抛出异常 StopIteration
。for
循环容器取值的都是可迭代的容器就是将多个元素在一起的单元,并且,是可以迭代的,比如列表,字典,元组,字符串
1 | # 将列表转换为一个迭代器 |
是一种特殊的迭代器,具备迭代器所有的特性。但其相比与迭代器,占用的内存更少
他本质上是一个函数,只不过函数的return
改为了yield
语句,正常的for
循环语句,会不停的遍历容器的对象,然后返回(如果有return的话),当我们用yield
取而代之
每当函数执行时遇到yield
时,他会记住此时的一个位置并挂起,等到使用__next__操作时,才由上一次挂起的位置继续执行。生成器不仅“记住”了它的数据状态,生成还记住了程序执行的位置
python 中定义生成器,一共有两种方式,一种是生成器表达式,另一种是生成器函数。
生成器表达式的语法其实就是把列表推导式的中括号改成小括号,如下:
1 | gen_ =(item for item in range(2)) |
在函数中使用 yield
关键字可以定义一个生成器函数
1 | def func(): |
1 | from collections import Iterable |
OWASP TOP 10
的漏洞之一了,他是一个开源的程序,主要用于识别项目依赖项并检查是否存在已知的,公开披露的漏洞,目前支持Java
、.NET
、Ruby
、Node.js
、Python
等语言。jar
依赖包进行扫描。他的简单工作原理是依靠强大的库,与被扫jar依赖包进行比对,输出jar
包详情。所以该工具只能扫描出已经公布的,无法扫描0day
Dependency-Check
工作的方式是通过分析器对文件进行扫描搜集信息,搜集到的信息被叫做迹象。vendor
(供应商),product
(产品)和version
(版本)。例如,jarAnalyzer
将从jar文件包中的Mainfest
、pom.xml
和包名进行信息搜集,然后把各种搜集到的源放到一个或者多个迹象表里。CPE
条目(NVD
美国国家通用数据库、CVE数据索引)进行匹配,分析器匹配到了就会给个标志发送到报告。Dependency-Check
目前不使用hash
识别文件,因为第三方依赖从源码中的hash值构建通常不会匹配官方发布版本的hash
。后续版本中可能会增加一些hash
来匹配一些常用的第三方库,例如Spring
, Struts
等。本地环境:win10 x64
打开官网,点击command Line下载文件,并解压
1 | D:\app\dependency-check-8.2.1-release\dependency-check\bin> |
1 | --advancedHelp Print the advanced help message. |
- CVE
- CVSS评分标准: 漏洞的最终得分最大为10,最小为0。得分7
10的漏洞通常被认为比较严重,得分在46.9之间的是中级漏洞,0~3.9的则是低级漏洞。
1 | dependency-check.bat --disableRetireJS --disableNodeJS -s D:\project\checkjar -o D:\project\report |
1 | D:\project\report\dependency-check-report.html |
log4j-core-2.16.0.jar
发现两个中等漏洞JDBC Appender
和JNDI LDAP
数据源URI
时,Apache Log4j2
版本2.0-beta7
至2.17.0
(不包括安全修复版本2.3.2和2.12.4
)容易受到远程代码执行(RCE
)攻击,如果攻击者控制了目标LDAP
服务器。这个问题通过将JNDI
数据源名称限制为java
协议在Log4j2
版本2.17.1,2.12.4
和2.3.2
中得到修复NVD
库搭建到本地,这样就会更加的方便,我们可以在本地搭建一个NVD
库来提高更新效率,具体可以参考这里cveUrlModified
和cveUrlModified
指定本地NVD
库1 | dependency-check.bat |
Dependency-check-maven
非常易于使用,可以作为独立插件使用,也可以作为maven site
的一部分使用。该插件需要使用Maven 3.1
或更高版本,第一次执行时,可能需要20分钟或更长时间,因为它会从NIST
托管的国家漏洞数据库下载漏洞数据到本地备份库。第一次批量下载后,只要插件每七天至少执行一次,本地漏洞库就会自动更新,更新只需几秒钟。pom
文件中增加maven
配置即可。用法一 在target目录中创建dependency-check-report.html
1 | <plugin> |
用法二 在maven site中创建聚合性的报告
1 | <plugin> |
用法三 设置当风险指数(CVSS)大于等于8时(CVSS分数为0-10)则项目编译失败
1 | <plugin> |
用法四 仅更新NVD(漏洞库)数据,而不执行检查
1 | <plugin> |
更多配置信息,可以根据实际情况在官网查找:参考链接
Jenkins中需要安装插件:Static Analysis Utilities
和Dependency-Check
该插件具有执行依赖关系分析和构建后查看检查结果的功能。
执行依赖分析配置:
查看检查分析结果配置:
与代码质量管理平台SonarQube 7.x
以上的版本集成
将插件(jar文件)复制到$SONAR_INSTALL_DIR/extensions/plugins
并重新启动SonarQube
。
但需要添加以下配置:
1 | sonar.dependencyCheck.reportPath = ${WORKSPACE}/dependency-check-report.xml |
1 | sonar.dependencyCheck.severity.blocker = 9.0 |
本机环境,python3.7 ,win10 64
新建一个空的后缀名文件sample.db
代码
1 | import time |
1 | import pymysql |
django安装pip install Django
创建项目及应用
1 | # 创建应用 |
1 | # pysql\pysql\setting.py |
1 | #pysql\myapi\model.py |
1 | python manage.py makemigrations # 让model生效 |
1 | # pysql/myapi/views.py |
1 | # pysql/myapi/urls.py |
把myapi应用的路由url引用到pysql项目中
1 | #pysql/pysql/urls.py |
1 | D:\project\pysql>python manage.py runserver |
1 |
|
1 | D:\app\Python37\python.exe D:/project/pysql/test1.py |
1 | # pysql/pysql/setting.py |
db.sqlite3
1 | python manage.py makemigrations # 让model生效 |
1 | D:\project\pysql>python manage.py runserver |
1 | import requests |
本文来自这里
mitmproxy 相比Charles、fiddler的优点在于,它可以命令行方式或脚本的方式进行mock mitmproxy不仅可以像Charles那样抓包,还可以对请求数据进行二次开发,进入高度二次定制
1 | pip install mitmproxy |
mitmproxy
、mitmdump
、mitmweb
三个命令,由于 mitmproxy
命令不支持在 windows 系统中运行(这没关系,不用担心),我们可以拿 mitmdump
测试一下安装是否成功,执行:1 | C:\Users\Administrator>mitmdump --version |
mitmproxy
用 mitmproxy
、mitmdump
、mitmweb
这三个命令中的任意一个即可,这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同。原文中介绍了HTTP
,TCP
,Websocket
的生命周期,因为用http
比较多,只需要用到 http_connect
、request
、response
三个事件就能完成大多数需求了。
1 | mitmweb |
1 | "C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe " --proxy-server=127.0.0.1:8080 --ignore-certificate-errors |
新增三个代码文件分别为:
1 | # counter.py |
1 | import mitmproxy.http |
1 | import counter |
1 | mitmweb -s addons.py |
Selenium需要通过WebDriver操作浏览器;Playwright通过开发者工具与浏览器交互,安装简洁,不需要安装各种Driver。
Playwright几乎支持所有语言,且不依赖于各种Driver,通过调用内置浏览器所以启动速度更快。
Selenium基于HTTP协议(单向通讯),Playwright基于Websocket(双向通讯)可自动获取浏览器实际情况。
比如使用selenium时,操作元素需要对每个元素进行智能查询等待等,而Playwright为自动等待:
Playwright速度比selenium快很多,还支持异步方式
支持使用API的方式发送请求
1 | #升级pip |
1 | python -m playwright codegen |
1 | from playwright.sync_api import Playwright, sync_playwright, expect |
通过以上代码可以了解到:
playwright支持同步和异步两种使用方法
不需要为每个浏览器下载webdriver
相比selenium多了一层context抽象
支持无头浏览器,且较为推荐(headless默认值为True)
可以使用传统定位方式(CSS,XPATH等),也有自定义的新的定位方式(如文字定位)
没有使用selenium的先定位元素,再进行操作的方式,而是在操作方法中传入了元素定位,定位和操作同时进行(其实也playwright也提供了单独的定位方法,作为可选)
很多方法使用了with的上下文语法
当然更多的人愿意在Pycharm中手写用例
PlayWright的核心概念包括:
1 | from playwright.sync_api import sync_playwright |
一个BrowserContex就像是一个独立的匿名模式会话(session),非常轻量,但是又完全隔离。
(译者注:每个browser实例可有多个BrowserContex,且完全隔离。比如可以在两个BrowserContext中登录两个不同的账号,也可以在两个 context 中使用不同的代理。 )
context创建:
1 | browser = playwright.chromium.launch() |
1 | from playwright.sync_api import sync_playwright |
API:
1 | page = context.new_page() |
iframe
HTML标签,这些frame可以在内部操作实现访问。1 | # 通过name属性获取frame |
API:
playwright可以通过 CSS selector, XPath selector, HTML 属性(比如 id
, data-test-id)或者是文本内容
定位元素。
除了xpath selector外,所有selector默认都是指向shadow DOM,如果要指向常规DOM,可使用*:light。不过通常不需要。
1 | # Using data-test-id= selector engine |
详细:
Element selectors | Playwright Python
playwright在执行操作之前对元素执行一系列可操作性检查,以确保这些行动按预期运行。它会自动等待(auto-wait)所有相关检查通过,然后才执行请求的操作。如果所需的检查未在给定的范围内通过timeout,则操作将失败并显示TimeoutError
如 page.click(selector, **kwargs) 和 page.fill(selector, value, **kwargs) 这样的操作会执行auto-wait ,等待元素变成可见(visible)和 可操作( actionable)。例如,click将会:
等待selectorx选定元素出现在 DOM 中
待它变得可见(visible):有非空的边界框且没有 visibility:hidden
等待它停止移动:例如,等待 css 过渡(css transition)完成
将元素滚动到视图中
等待它在动作点接收点事件:例如,等待元素不被其他元素遮挡
如果在上述任何检查期间元素被分离,则重试
1 | # Playwright waits for #search element to be in the DOM |
window
和 document,
可用于 evaluate。
1 | href = page.evaluate('() => document.location.href') |
1 | result = page.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8]) |
1 | import pytest |
page.request.ge
t可以直接发送请求1 | import pytest |
1 | # 批量运行用例 |
1 | def find_el(page, el, timeout=10000): |
httpd.exe -l
会看见 mpm_winnt.c windows
默认执行 mpm_winnt_module
方式 (暂未找到修改成其他方式的方法)
1.httpd.conf
文件去掉 Include conf/extra/httpd-mpm.conf
前面的#
2.修改extra/httpd-mpm.conf
最下面 或 查找 mpm_winnt_module
修改ThreadsPerChild
和 MaxRequestsPerChild
1 | #每个子进程建立的线程数 |
根据自己网站并发数量设置:
ThreadsPerChild
设置 网站平均在线人数MaxRequestsPerChild
设置最高在线人数的值ps -ef | grep httpd | wc -l
查看当前 httpd进程数
apachectl -l
会看见 prefork.c Linux默认执行 mpm_prefork_module
httpd.conf
文件去掉 Include conf/extra/httpd-mpm.conf
前面的#
修改extra/httpd-mpm.conf
最上面 或 查找 mpm_prefork_module
1 | StartServers 5 #默认启动线程数 |