web开发
变量安全
变量覆盖安全:
$GLOBALS:这种全局变量用于在PHP脚本中的任意位置访问全局变量
数据接收安全:
$_REQUEST:$_REQUEST 用于收集 HTML 表单提交的数据。
$_POST:广泛用于收集提交method=”post” 的HTML表单后的表单数据。
$_GET:收集URL中的发送的数据。也可用于提交表单数据(method=”get”)
$_ENV:是一个包含服务器端环境变量的数组。
$_SERVER:这种超全局变量保存关于报头、路径和脚本位置的信息。
文件上传安全:
$_FILES:文件上传且处理包含通过POST方法上传给当前脚本的文件内容。
身份验证安全:
$_COOKIE:是一个关联数组,包含通过cookie传递给当前脚本的内容。
本地客户端浏览器存储
$_SESSION:是一个关联数组,包含当前脚本中的所有session内容。
目标服务端存储,存储记录的数据
身份验证-Cookie使用
生成cookie的原理图过程:见图
1、客户端向服务器发送HTTP请求。
2、服务器检查请求头中是否包含cookie信息。
3、如果请求头中包含cookie信息,则服务器使用该cookie来识别客户端,否则服务器将生成一个新的cookie。
4、服务器在响应头中设置cookie信息并将其发送回客户端。
5、客户端接收响应并将cookie保存在本地。
6、当客户端发送下一次HTTP请求时,它会将cookie信息附加到请求头中。
7、服务器收到请求并检查cookie的有效性。
8、如果cookie有效,则服务器响应请求。否则,服务器可能会要求客户端重新登录。
$_COOKIE:是一个关联数组,包含通过cookie传递给当前脚本的内容。
setcookie(): 设置一个cookie并发送到客户端浏览器。
unset(): 用于删除指定的cookie。
身份验证-Session使用
1、客户端向服务器发送HTTP请求。
2、服务器为客户端生成一个唯一的session ID,并将其存储在服务器端的存储器中(如文件、数据库等)。
3、服务器将生成的session ID作为一个cookie发送给客户端。
4、客户端将session ID保存为一个cookie,通常是在本地浏览器中存储。
5、当客户端在发送下一次HTTP请求时,它会将该cookie信息附加到请求头中,以便服务器可以通过该session ID来识别客户端。
6、服务器使用session ID来检索存储在服务器端存储器中的与该客户端相关的session数据,从而在客户端和服务器之间共享数据。
session_start(): 启动会话,用于开始或恢复一个已经存在的会话。
$_SESSION:是一个关联数组,包含当前脚本中的所有session内容。
session_destroy(): 销毁当前会话中的所有数据。
session_unset(): 释放当前会话中的所有变量。
Session存储路径:PHP.INI中session.save_path设置路径
唯一性判断-Token使用
1、生成Token并将其存储在Session
2、生成Token并将其绑定在Cookie触发
3、尝试登录表单中带入Token验证逻辑
4、思考Token安全特性
具体安全知识点:
-Cookie和Session都是用来在Web应用程序中跟踪用户状态的机制
1、存储位置不同:
Cookie是存储在客户端(浏览器)上的,而Session是存储在服务器端的。
2、安全性不同:
Cookie存储在客户端上,可能会被黑客利用窃取信息,而Session存储在服务器上,更加安全。
3、存储容量不同:
Cookie的存储容量有限,一般为4KB,而Session的存储容量理论上没有限制,取决于服务器的硬件和配置。
4、生命周期不同:
Cookie可以设置过期时间,即便关闭浏览器或者重新打开电脑,Cookie仍然存在,直到过期或者被删除。而Session一般默认在浏览器关闭后就会过期。
5、访问方式不同:
Cookie可以通过JavaScript访问,而Session只能在服务器端进行访问。
6、使用场景不同:
Cookie一般用于存储小型的数据,如用户的用户名和密码等信息。而Session一般用于存储大型的数据,如购物车、登录状态等信息。
总之,Cookie和Session都有各自的优缺点,选择使用哪一种方式,取决于具体的应用场景和需求。一般来说,如果需要存储敏感信息或者数据较大,建议使用Session;如果只需要存储少量的数据,并且需要在客户端进行访问,可以选择使用Cookie。
在Web应用程序中,使用token和不使用的主要差异在于身份验证和安全性。
1.身份验证:采用token机制的Web应用程序,用户在登录成功后会收到一个token,这个token可以在每次请求时发送给服务器进行身份验证。而不采用token机制的Web应用程序,一般会使用session机制来保存用户登录状态,服务器会在用户登录成功后创建一个session,之后的每个请求都需要在HTTP头中附带这个session ID,以便服务器能够验证用户身份。
2、安全性:采用token机制的Web应用程序,在服务器上不会存储用户的登录状态,只需要存储token即可。因此,即使token被盗取,黑客也无法获得用户的密码或者其他敏感信息。而不采用token机制的Web应用程序,一般会在服务器上存储用户的登录状态,因此如果服务器被黑客攻击,黑客可能会获得用户的敏感信息。
3、跨域访问:采用token机制的Web应用程序,在跨域访问时,可以使用HTTP头中的Authorization字段来传递token信息,方便实现跨域访问。而不采用token机制的Web应用程序,在跨域访问时,需使用cookie或session来传递用户身份信息,比较麻烦。
类型比较缺陷
1、== 和 ===
两个等号==是弱比较,使用==进行对比的时候,php解析器就会做隐式类型转换,如果两个值的类型不相等就会把两个值的类型转为同一类型进行对比。
2、MD5对比缺陷
进行hash加密出来的字符串如存在0e开头进行弱比较的话会直接判定为true
QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
3 函数strcmp类型比较缺陷
低版本的strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,正是利用这点进行绕过
4、函数Bool类型比较缺陷
在使用 json_decode() 函数或 unserialize() 函数时,部分结构被解释成 bool 类型,也会造成缺陷,运行结果超出研发人员的预期
5、函数switch 类型比较缺陷
当在switch中使用case判断数字时,switch会将参数转换为int类型计算
6、函数in_array数组比较缺陷
当使用in_array()或array_search()函数时,如果第三个参数没有设置为true,则in_array()或array_search()将使用松散比较来判断
7、===数组比较缺陷
注意此时遇到的是 “===” ,不过也不是代表无从下手。在md5()函数传入数组时会报错返回NULL,当变量都导致报错返回NULL时就能使使得条件成立。
模版引擎
在开始介绍Smarty之前先了解一下模板引擎,模板引擎是为了让前端界(html)与程序代码(php)分离而产生的一种解决方案,简单来说就是html文件里再也不用写php代码了。Smarty的原理是变量替换原则,我们只需在html文件写好Smarty的标签即可,例{name},然后调用Smarty的方法传递变量参数即可。
模版使用案例:
Php模版框架:Smarty、Twig,codeeval等
python模版框架:jinja2、mako、tornad、Django等
Java模版框架:Thymeleaf、jade、velocity、FreeMarker等
JavaScript模版框架:doT,Nunjucks,Pug,Marko,EJS,Dust等
文件安全
文件遍历上传下载删除编辑包含等
$_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保存到服务器上。它是一个包含上传文件信息的数组,包括文件名、类型、大小、临时文件名等信息。
$_FILES[“表单值”][“name”] 获取上传文件原始名称
$_FILES[“表单值”][“type”] 获取上传文件MIME类型
$_FILES[“表单值”][“size”] 获取上传文件字节单位大小
$_FILES[“表单值”][“tmp_name”] 获取上传的临时副本文件名
$_FILES[“表单值”][“error”] 获取上传时发生的错误代码
move_uploaded_file() 将上传的文件移动到指定位置的函数
文件显示:
1.打开目录读取文件列表
2.递归循环读取文件列表
3.判断是文件还是文件夹
4.PHP.INI目录访问控制
is_dir() 函数用于检查指定的路径是否是一个目录
opendir() 函数用于打开指定的目录,返回句柄,用来读取目录的文件和子目录
readdir() 函数用于从打开的目录句柄中读取目录中的文件和子目录
open_basedir:PHP.INI中的设置用来控制脚本程序访问目录
scandir() 函数返回指定目录中的文件和目录列表,以数组形式返回
ini_set(‘open_basedir’,DIR); 设置配置文件中,只能访问本目录
文件删除:
unlink() 文件删除函数
调用命令删除:system shell_exec exec等
文件下载:
修改HTTP头实现文件读取解析下载:
header(“Content-Type: application/octet-stream”);
header(“Content-Disposition: attachment; filename="“ . $file . “"“);
header(“Content-Length: “ . filesize($file));
readfile($file);
文件读取:
1、file_get_contents() 读取文件内容
2、fopen() fread() 文件打开读入
文件包含:
include、require、include_once、require_once等
修复方案
安全模式 safe_mode 命令执行函数会被禁用
*路径访问 open_basedir 限制文件操作安全(遍历等)
*禁用函数 disable_function 升级版安全模式,自定义限制函数
*魔术引号转义 magic_quotes_gpc 同理下面的sql过滤第一个函数
数据库访问次数 max_connections 防止数据库爆破
禁用远程执行 allow_url_include allow_url_fopen远程包含开关等
*安全会话管理 session.cookie_httponly session.cookie_secure
防止跨站脚本攻击(XSS)和中间人攻击(MITM)
引用-全局文件
1、关键内容检测(黑白名单)
文件上传,SQL注入,XSS跨站等
演示:文件上传,SQL注入,XSS跨站
2、模仿流量检测(基于规则或AI算法)
演示:Python Flask+PHP Curl+训练大模型
客户端请求数据 -> 中间件搭建平台 -> 服务器代码文件处理
客户端请求数据 -> WAF或流量监控 (规则,AI模型算法)-> 正常数据 -> 中间件搭建平台 -> 服务器代码文件处理
客户端请求数据 -> WAF或流量监控 (规则,AI模型算法)-> 异常数据 -> 截止
代码-内置函数
检测:数据的类型差异,数据的固定内容
gettype()获取变量的类型
is_float()检测变量是否是浮点型
is_bool()检测变量是否是布尔型
is_int()检测变量是否是整数
is_null()检测变量是否为NULL
is_numeric()检测变量是否为数字或数字字符串
is_object()检测变量是否是一个对象
is_resource()检测变量是否为资源类型
is_scalar()检测变量是否是一个标量
is_string()检测变量是否是字符串
is_array()检测变量是否是数组
filter_var()使用特定的过滤器过滤一个变量
FILTER_SANITIZE_STRING 过滤器可以过滤HTML标签和特殊字符
FILTER_SANITIZE_NUMBER_INT 过滤器可过滤非整数字符
FILTER_SANITIZE_URL 过滤器用于过滤URL中的非法字符
FILTER_VALIDATE_EMAIL 过滤器来验证电子邮件地址的有效性
演示:filter_var() is_numeric() is_string()等
1、SQL注入过滤:
Addslashes()返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号()、双引号(”)、反斜线()与NULL字符)。
stripslashes()反引用一个引用字符串,如果magic_quotes_sybase项开启,反斜线将被去除,但是两个反斜线将会被替换成一个。
addcslashes()返回字符串,该字符串在属于参数charlist列表中的字符前都加上了反斜线。
stripcslashes()返回反转义后的字符串。可识别类似C语言的\n,r,…八进制以及十六进制的描述。
mysql_escape_string()此函数并不转义%和_。作用和mysql real escape_string()基本一样
mysql_real_escape_string()调用mysql库的函数在以下字符前添加反斜杠:x00、\n、\r、\、x1a
PHP魔术引号当打开时,所有的’(单引号),”(双引号),(反斜线)和NULL字符都会被自动加上一个反斜线进行转义。这和addslashes()作用完全相同。
预编译机制
演示:魔术引号,addslashes(),预编译等
2、XSS跨站过滤:
htmlspecialchars()函数把预定义的字符转换为HTML实体。
strip_tags()函数剥去字符串中的HTML、XML以及PHP的标签。
演示:htmlspecialchars() strip_tags()
3、命令执行过滤
escapeshellcmd()确保用户只执行一个命令用户可以指定不限数量的参数用户不能执行不同的命令
escapeshellarg()确保用户只传递一个参数给命令用户不能指定更多的参数一个用户不能执行不同的命令
4、其他漏洞过滤
可参考AI答案或参数类型过滤等
JavaScrip
JavaScript被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。嵌入动态文本于HTML页面;对浏览器事件做出响应,读写HTML元素,在数据被提交到服务器之前验证数据;检测访客的浏览器信息;控制用户凭据,包括创建和修改等
DOM (Document Object Model)文档对象模型:
1、访问文档:可以动态获取和修改页面上的内容
2、修改文档结构:可以添加、删除、移动或替换元素
3、处理事件:为页面元素绑定和响应交互事件(如点击、悬停等)
BOM (Browser Object Model)浏览器对象模型:
1、使用Window对象对浏览器打开关闭返回新建进行操作。
2、使用Screen对象窗口的screen属性包含有关客户端显示屏的信息。
3、使用Navigator对象指浏览器对象,包含浏览器的信息。
4、使用Location对象Location对象包含有关当前URL的信息
5、使用History对象包含用户访问过的URL,经常使用于页面跳转。
6、使用Document对象指文档对象,既属于BOM对象,也属于DOM对象
Node.js
简单的说 Node.js 就是运行在服务端的 JavaScript。
Webpack
Webpack 是一个强大的模块打包工具,它主要用于将 JavaScript 代码和其他资源(如 CSS、图片、字体等)打包成浏览器能够高效加载的文件
Webpack 是现代前端开发中不可或缺的工具,特别是对于构建复杂的、模块化的应用程序。它的优势在于模块化处理、资源管理、性能优化、代码分割和插件扩展,使得构建和部署变得更加高效和灵活。如果你的应用程序规模较大,或者涉及到多个资源文件,使用Webpack打包将带来显著的性能和开发体验提升。
简单来说,webpack具备以下功能:
1、支持js模块化
2、处理css兼容性
3、将多个html/css/js文件压缩合并
源码泄漏:
1、mode配置
production(生产),development(开发),开发模式下会存在泄漏
还原:浏览器webpack://
2、devtool配置
参考:开发安全典型漏洞之webpack源码泄露及防护
在使用webpack打包部署代码时,如果参数devtool配置不当,将会在部署代码文件中生成对应匹配的soucemap文件(源码映射),如果将参数devtool配置为“source-map”、“cheap-source-map”、“hidden-source-map”、“nosources-source-map”、“cheap-module-source-map”等值时,打包后将生成单独的map文件。
识别项目:https://github.com/SunHuawei/SourceDetector
Vue
Vue 是一款用于构建用户界面的 JavaScript 框架
MVC框架
MVC(Model-View-Controller)是一种常见的软件设计模式,用于将应用程序的逻辑分离成三个独立的组件:
模型(Model):模型是应用程序的数据和业务逻辑的表示。它负责处理数据的读取、存储和操作,以及业务规则的处理。模型通常是独立于用户界面的,可以在不同的视图和控制器之间共享和重用。
视图(View):视图是用户界面的呈现部分,负责展示数据给用户,并接收用户的输入。视图通常是根据模型的数据进行渲染和更新的,它可以是Web页面、图形界面或命令行界面等。
控制器(Controller):控制器是模型和视图之间的协调者,负责接收用户的输入并根据输入调用相应的模型逻辑。控制器将用户的请求转发给模型进行处理,并将处理结果传递给视图进行展示。控制器还可以处理视图的事件和状态变化。
Servlet
Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
处理接受和回显
●HttpServletRequest是ServletRequest的子接口
getParameter(name) — String 通过name获得值
getParameterValues — String[ ] 通过name获得多值
●HttpServletResponse是ServletResponse的子接口
setCharacterEncoding() 设置编码格式
setContentType() 设置解析语言
getWriter() 获得一个PrintWriter字符输出流输出数据
PrintWriter 接受符合类型数据
过滤器-Filter
Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的 response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
监听器-Listen
监听ServletContext、HttpSession、ServletRequest等域对象创建和销毁事件
监听域对象的属性发生修改的事件
监听在事件发生前、发生后做一些必要的处理
反射
Java提供了一套反射API,该API由Class类与java.lang.reflect类库组成。该类库包含了Field、Method、Constructor等类。对成员变量,成员方法和构造方法的信息进行的编程操作可以理解为反射机制。
Java-反射-Class对象类获取
1、根据类名:类名.class
Class userClass = User.class;
2、根据对象:对象.getClass()
User user = new User();
Class aClass = user.getClass();
3、根据全限定类名:Class.forName(“全路径类名”)
Class aClass1 = Class.forName(“com.example.reflectdemo.User”);
4、通过类加载器获得Class对象://ClassLoader.getSystemClassLoader().loadClass(“全路径类名”);
ClassLoader clsload=ClassLoader.getSystemClassLoader();
Class aClass2 = clsload.loadClass(“com.example.reflectdemo.User”);
Java-反射-Field成员变量类获取
Class aClass = Class.forName(“com.example.reflectdemo.User”);
获取公共成员变量对象
Field[] fields=aClass.getFields();
for(Field f:fields){
System.out.println(f);
}
获取所有成员变量对象
Field[] fields=aClass.getDeclaredFields();
for(Field f:fields){
System.out.println(f);
}
获取公共,私有单个成员变量对象
Field field=aClass.getField(“age”);
Field field=aClass.getDeclaredField(“gender”);
System.out.println(field);
城边变量值获取和赋值
User u = new User();
Field field=aClass.getField(“age”);
field.set(u,30);
Object a=field.get(u);
System.out.println(a);
Java-反射-Method成员方法类获取
Class aClass = Class.forName(“com.example.reflectdemo.User”);
返回所有公共成员方法对象的数组,包括继承的
Method[] methods = aClass.getMethods();
for (Method me:methods){
System.out.println(me);
}
返回所有成员方法对象的数组,不包括继承的
Method[] methods = aClass.getDeclaredMethods();
for (Method me:methods){
System.out.println(me);
}
返回单个公共成员方法对象
Method methods = aClass.getMethod(“getName”);
System.out.println(methods);
Method methods = aClass.getMethod(“setName”, String.class);
System.out.println(methods);
返回单个成员方法对象
Method methods = aClass.getDeclaredMethod(“UserInfo”, String.class, int.class, String.class);
System.out.println(methods);
运行方法invoke
Method methods = aClass.getDeclaredMethod(“UserInfo”, String.class, int.class, String.class);
User u = new User();
私有需要开启临时
methods.setAccessible(true);
methods.invoke(u,”xiaodi”,18,”man”);
Java-反射-Constructor构造方法类获取
Class aClass = Class.forName(“com.example.reflectdemo.User”);
返回所有公共构造方法对象的数组
Constructor[] constructors = aClass.getConstructors();
for(Constructor con:constructors){
System.out.println(con);
}
返回所有构造方法对象的数组
Constructor[] constructors = aClass.getDeclaredConstructors();
for(Constructor con:constructors){
System.out.println(con);
}
返回单个公共构造方法对象
Constructor con1=aClass.getConstructor();
Constructor con1=aClass.getConstructor(String.class);
System.out.println(con1);
返回单个构造方法对象
Constructor con2=aClass.getDeclaredConstructor(int.class);
Constructor con2=aClass.getDeclaredConstructor(String.class,int.class, String.class);
System.out.println(con2);
Constructor con2=aClass.getDeclaredConstructor(int.class);
con2.setAccessible(true);
User uu=(User) con2.newInstance(“xiaodi”,30,”man”);
System.out.println(uu);
反序列化
JAVA内置的writeObject()/readObject()内置原生写法分析:
writeObject():主要用于将 Java 对象序列化为字节流并写入输出流
readObject():主要用于从输入流中读取字节序列反序列化为 Java 对象
FileInputStream:其主要作用是从文件读取字节数据
FileOutputStream:其主要作用是将字节数据写入文件
ObjectInputStream:用于从输入流中读取对象,实现对象的反序列化操作
ObjectOutputStream:用于将对象并写入输出流的类,实现对象的序列化操作
利用看下面:
• 看序列化的对象有没有重写readObject方法(危险代码)
• 看序列化的对象有没有被输出就会调用toString方法(危险代码)
• 其他类的readObject或toString方法(反序列化类可控)
利用链
利用链也叫”gadget chains”,我们通常称为gadget:
1、共同条件:实现Serializable或者Externalizable接口,最好是jdk自带或者JAVA常用组件里有
2、入口类source:(重写readObject 调用常见函数 参数类型宽泛 最好jdk自带)
3、调用链gadget chain:相同方法名、相同类型
4、执行类sink:RCE SSRF 写文件等等
应用知识:
1、序列化方法:
JSON.toJSONString(),返回字符串;
JSON.toJSONBytes(),返回byte数组;
2、反序列化方法:
JSON.parseObject(),返回JsonObject;
JSON.parse(),返回Object;
JSON.parseArray(), 返回JSONArray;
将JSON对象转换为java对象:JSON.toJavaObject();
将JSON对象写入write流:JSON.writeJSONString();
3、常用:
JSON.toJSONString(),JSON.parse(),JSON.parseObject()
使用引出安全:
1、序列化固定类后:
parse方法在调用时会调用set方法
parseObject在调用时会调用set和get方法
2、反序列化指定类后:
parseObject在调用时会调用set方法
JNSI
协议 | 作用 |
---|---|
LDAP | 轻量级目录访问协议,约定了 Client 与 Server 之间的信息交互格式、使用的端口号、认证方式等内容 |
RMI | JAVA 远程方法协议,该协议用于远程调用应用程序编程接口,使客户机上运行的程序可以调用远程服务器上的对象 |
DNS | 域名服务 |
CORBA | 公共对象请求代理体系结构 |
JNDI全称为 Java Naming and DirectoryInterface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。
RMI:远程方法调用注册表
LDAP:轻量级目录访问协议
调用检索
Java为了将Object对象存储在Naming或Directory服务下,提供了Naming Reference功能,对象可以通过绑定Reference存储在Naming或Directory服务下,比如RMI、LDAP等。javax.naming.InitialContext.lookup()
在RMI服务中调用了InitialContext.lookup()的类有:
org.springframework.transaction.jta.JtaTransactionManager.readObject()
com.sun.rowset.JdbcRowSetImpl.execute()
javax.management.remote.rmi.RMIConnector.connect()
org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(String sfJNDIName)
在LDAP服务中调用了InitialContext.lookup()的类有:
InitialDirContext.lookup()
Spring LdapTemplate.lookup()
LdapTemplate.lookupContext()
JNDI注入手工
bind:将名称绑定到对象中;
lookup:通过名字检索执行的对象;
Reference类表示对存在于命名/目录系统以外的对象的引用。
Reference参数:
className:远程加载时所使用的类名;
classFactory:加载的class中需要实例化类的名称;
classFactoryLocation:远程加载类的地址,提供classes数据的地址可以是file/ftp/http等协议;
FastJson
一个阿里巴巴开发的Java库,提供了Java对象与JSON相互转换。
1、序列化方法:
JSON.toJSONString(),返回字符串;
JSON.toJSONBytes(),返回byte数组;
2、反序列化方法:
JSON.parseObject(),返回JsonObject;
JSON.parse(),返回Object;
JSON.parseArray(), 返回JSONArray;
将JSON对象转换为java对象:JSON.toJavaObject();
将JSON对象写入write流:JSON.writeJSONString();
3、常用:
JSON.toJSONString(),JSON.parse(),JSON.parseObject()
开发框架-SpringBoot
参考:https://springdoc.cn/spring-boot/
1、路由映射
@RequestMapping @GetMapping等
2、参数传递
@RequestParam
3、数据响应
@RestController @Controller
@RestController注解相当于@ResponseBody+@Controller合作用。
SpringBoot-监控依赖-Actuator
SpringBoot Actuator模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP跟踪等,帮助我们监控和管理Spring Boot应用。
安全问题:heapdump泄漏
SpringBoot-接口依赖-Swagger
Swagger是当下比较流行的实时接口文文档生成工具。接口文档是当前前后端分离项目中必不可少的工具,在前后端开发之前,后端要先出接口文档,前端根据接口文档来进行项目的开发,双方开发结束后在进行联调测试。
身份验证-JWT技术
JWT(JSON Web Token)是由服务端用加密算法对信息签名来保证其完整性和不可伪造;Token里可以包含所有必要信息,这样服务端就无需保存任何关于用户或会话的信息;
JWT用于身份认证、会话维持等。由三部分组成,header、payload与signature
身份验证-Spring Security
Spring Security安全框架,是Spring Boot底层安全模块默认的技术选型,可以实现强大的Web安全控制。
WebSecurityConfigurerAdapter:自定义Security策略
AuthenticationManagerBuilder:自定义认证策略
@EnableWebSecurity:开启WebSecurity模式
“认证”和”授权”(访问控制)
“认证”(Authentication)
“授权”(Authorization)
这个概念是通用的,而不是只在 Spring Security 中存在。
SnakeYaml反序列化
SnakeYaml是Java中解析yaml的库,而yaml是一种人类可读的数据序列化语言,通常用于编写配置文件等。
Yaml.load():入参是一个字符串或者一个文件,经过反序列化之后返回一个Java对象;
Yaml.dump():序列化将一个Java对象转化为yaml文件形式;