移动安全
Activity是安卓系统中负责与用户交互的核心组件。可以理解为App里的每一个可视化页面都是一个Activity。 123456public class MyActivity extends AppCompatActivity{ protected void onCreate(@Nullable Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContenView(R.layout.activity_main); //加载视图文件 }} AndroidManifest.xml是配置文件,使用Activity组件时需要在AndroidManifest.xml里进行注册。 android:exported="true"表示允许外部引用该组件。 12345678910<activity android:label="@string/app_name" android:n...
Oauth认证漏洞
举个例子:我用微信登录了一个技术论坛,这个论坛会跳到微信的授权页面,并申请访问我的账户信息(昵称、头像等),然后提示我是否允许授权,同意后,微信会生成一个授权码(Code)给网站,网站用授权码向微信换取访问令牌(Token),再通过令牌获取授权的信息,然后用它来创建或绑定论坛账户。 分类:授权码授权、隐式授权等 思路一:某些网站要求扫码登陆,但不需要手机验证点击确认,是否可生成一个恶意的二维码钓鱼页面。 授权码授权第一步:客户端向授权服务器发送授权请求 client_id表示客户端在授权服务器的ID;redirect_uri表示授权完成后,授权服务器回调客户端的地址;response_type表示授权类型;scope表示客户端要访问的用户数据是哪些类型;state表示随机值,防止csrf。 第二步:用户扫描二维码登录后,会跳到授权页面,显示客户端需要请求哪些信息,并提示是否允许授权。 第三步:允许授权后,重定向到回调地址,并通过URL片段返回访问令牌。 思路二:有些网站没有设置随机值,可进行csrf攻击。让受害者网站绑定攻击者的账号。 思路三:将redirect_uri的地...
反射
1234567891011121314151617181920.java 源码(带泛型) ↓【编译阶段】javac ✔ 类型检查(泛型安全) ✔ 类型擦除(类型参数 → 上界/Object) ✔ 插入必要的强制类型转换 ✔ 生成桥方法(如需要) ✔ 在 class 文件中记录泛型签名(Signature) ↓.class 字节码 ✔ 运行时类型:已擦除(无泛型参与执行) ✔ 元数据:包含泛型签名(仅供反射/工具读取) ↓【类加载】JVM 加载 class ↓在方法区(元空间)存储类结构信息 ↓在堆中创建对应的 Class 对象(类的元信息入口) ↓【运行时】通过 Class 创建对象(new) 反射是以Class对象为入口,访问JVM中保存的类结构信息(字段、方法、构造器、泛型等),并进行操作(调用/创建/修改)。 Class类只有私有构造函数,因此对应Class对象只能有JVM创建和加载。 Class类对象的获取Field表示Class对象所表示的类的成员变量,通过它可以在运行时动态修改成员变量的属性...
泛型
1234567891011package org.example;public class fanxingDemo { Demo<String> demo=new Demo<>("小白");}class Demo<T>{ private T name; public Demo(T name){ this.name=name; }} T必须是任意非基础类型:任何类类型,任何接口类型,任何数组类型或甚至另一个类型变量。 最常用的类型参数名称是: E - 元素(由 Java 集合框架广泛使用) K - Key N - Number T - Type V - Value S,U,V etc. - 2nd, 3rd, 4th types 12345678910111213141516171819202122232425package org.example;public class fanxingDemo { pub...
集合
Collection主要接口方法: int size() boolean inEmpty() boolean contains(Object element) boolean add(E element) boolean remove(Object element) Interator<E> iterator() boolean containsAll(Collection<?> c) boolean addAll(Collection<? extends E> c) boolean removeAll(Collection<?> c) boolean retainAll(Collection<?> c) void clear() Object[] toArray() <T> T[] toArray(T[] a) 12345678910111213141516171819package org.example;import java.io.PrintStream;import java.util.Arra...
类加载机制
java程序在运行前需要先编译成class文件,java类初始化的时候会调用java.lang.ClassLoader加载类字节码,ClassLoader会调用JVM的native方法来定义一个java.lang.Class实例。 一切的java类都必须经过JVM加载后才能运行。在JVM类加载器中最顶层的是Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(拓展类加载器)、App ClassLoader(系统类加载器)。 App ClassLoader是默认的类加载器。 ClassLoader类有如下核心方法: loadClass(加载指定类) findClass(查找指定类) findLoadedClass(查找JVM已经加载的类) defineClass(定义一个类) resolveClass(链接指定类) 常用的类动态加载方式1234567891011121314151617package one;public class One { public static void main(String[] a...
异常
异常是一种class,Throwable是异常体系的根,继承于Object。Throwable有两个体系:Error和Exception。 Error表示严重的错误,程序对此一般无能为力,如:OutOfMemoryError(内存耗尽)、NoClassDefFoundError(无法加载某个Class)、StackOverflowError(栈溢出)等。 Exception则是运行时的错误,可以被捕获并处理。分为两类:RuntimeException及子类、非RuntimeException(包含IOException、ReflectiveOperationException等等)。 一些异常是程序逻辑如:NumberFormatException(数据类型的格式错误)、FileNotFoundException(未找到文件)、SocketException(读取网络失败)等。 java规定必须捕获的异常包括Exception及其子类,但不包含RuntimeException及其子类。这类异常称为Checked Exception。 123456789101112131415...
代码审计
sql注入order by注入 #{}:预编译处理,MyBatis会将其转换为参数化查询 ${}:直接字符串替换 由于order by子句后通常跟随列名而不是值,使用预编译语句会导致语法错误,开发者不得不使用字符串拼接方式构建。
MyBatis语法
JDBC存在的问题 数据库连接创建、释放频繁造成系统资源浪费 sql语句在代码中硬编码,不宜维护 MyBatis是一个持久层框架,对jdbc的操作数据库的过程进行封装。通过 xml 或注解的方式将要执行的各种 statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过 java 对象和 statement 中的 sql 进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射成 java 对象并返回。 selectmapper都会有一个namespace,避免多个mapper冲突,而且这个namespace不可以重复。 id表示查询方法的唯一标识符,resultType定义返回值的类型,即调用sql的完整类名。 12345678910111213<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis...
fuzz
查询接口: 新增接口:
