java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "".

ubuntu 18.04 .5 升级到 ubuntu 20.04.2 之后,发现 Tomcat 9.0.31 长时间没办法启动,观察日志,发现如下错误信息:

这个是由于在升级系统的时候,选择保留老版本的配置文件,这样就导致,如果 Tomcat 配置了通过 AJP 方式与Apache通信的情况下,会报告上面的错误信息。

新增 secretRequired 的目的是为了解决 AJP  端口暴露在公网的情况下,存在 AJP File Read/Inclusion in Apache Tomcat (CVE-2020-1938) and Undertow (CVE-2020-1745) 漏洞,由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。

连接方必须在连接的时候,传入正确的 secretRequired 才能与 Tomcat 通信,相当于通信需要的密码了。

网上很多人都是直接设置

来解决问题的,也就是设置 secretRequired 为空字符,但是这样会导致攻击方不需要传递密码就可以通信了,因此诱发远程攻击漏洞。

正确的做法其实是不允许远程用户直接通过 Tomcat AJP 协议通信,也就是在设置绑定的 IP 地址为本地地址 127.0.0.1。如下:

参考链接


Android中的@SmallTest,@MediumTest和@LargeTest注解的目的是什么?

Android中的@SmallTest,@MediumTest和@LargeTest注解的目的是什么?

例如:

参考下图:

继续阅读Android中的@SmallTest,@MediumTest和@LargeTest注解的目的是什么?

Robolectric 3.x编写屏幕分辨率/多语言/资源文件相关测试用例

在编写 Android 测试用例的时候,有时候我们需要涉及到屏幕分辨率相关测试用例。

比如不同分辨率得到不同的像素数值,可以参考如下:

比如不同语言得到不同的字符串,可以参考如下:

其他相关的测试参数,参考 Device Configuration

注意需要在 build.gradle 中增加资源包含信息,否则在测试的时候会找不到指定的资源文件,默认只测试代码,被测试的资源文件不打包进入应用。

参考如下:

参考链接


代码高亮插件Crayon Syntax Highlighter在PHP7.4报错解决办法

在新版的WordPress中,系统已经多次提示升级PHP,考虑到新版本更高效更安全,所以决定升级。

可是,升级完成后,网站出现大量报错,报错信息如下:

继续阅读代码高亮插件Crayon Syntax Highlighter在PHP7.4报错解决办法

Android单元测试--使用DummyActivity

在编写Android测试用例的时候,有时候我们需要测试与Activity相关的功能,同时又没办法直接调用被测试代码中的Activity的时候,我们需要创建DummyActivity的方式来进行。

我们希望这个DummyActivity只在测试代码中存在,相关的资源也只存在于测试代码里面使用,不侵入主代码。

可以参考如下布局进行项目的处理。

上述代码同样适用于Android资源文件相关的测试逻辑。

只是需要注意的是,当引入资源的时候,我们需要使用 {module_package}.test.R 的方式进行引入,否则代码中会提示找不到资源文件。

参考链接


Intel官方温度监控软件:Intel Power Gadget

Intel Power Gadget是Intel官方出的一款软件,可供用户查看、记录CPU和GPU的信息,比如温度、耗电、频率、使用率等。

下载地址:https://software.intel.com/en-us/articles/intel-power-gadget

Intel Power Gadget支持macOS、Windows和Linux,但是最新版的已经不支持Windows 7系统,可以下载3.0.7版本。

intel-power-gadget.dmg

继续阅读Intel官方温度监控软件:Intel Power Gadget

测试Activity的onSaveInstanceState/onRestoreInstanceState

最近遇到一个应用崩溃问题,这个问题是由于在 ActivityonSaveInstanceState 中进行了数据的保存,然后在 onRestoreInstanceState 进行解析的时候出现崩溃。

实际测试的时候,发现当内存充足的时候,非常难稳定的诱发 ActivityonSaveInstanceState 事件。

早期的版本,可以通过 ActivityManagerNative.getDefault().setAlwaysFinish 来强制系统在 Activity 切换到后台之后,立即触发 onSaveInstanceState

参考代码如下:

但是遗憾的是,新系统比如 Android 8 等系统上,在真机环境中已经没办法通过上述的方法进行诱发了。系统会直接抛出异常,或者设置无效。

真机环境,可以尝试在 开发人员选项 中设置开启 “不保留活动” 按钮,如下图所示:

继续阅读测试Activity的onSaveInstanceState/onRestoreInstanceState

Android获取导航栏/状态栏/键盘的高度和状态

最近 Android 11 系统兼容性测试的时候,发现界面适配异常(标题栏沉浸式部分),已经无法通过网上流行的,通过反射方法获取状态栏的高度了。

于是翻了一下以前公共库里的代码,发现是使用如下代码获取状态栏高度的:

其实从 Android 9 开始,就已经对通过反射调用非公开 API 的方式进行警告了。

Android 11以前的系统,只是给出警告, Android 11直接抛出了调用异常。

于是搜索一下,发现网上已经更改成如下方法了:

仔细观察两个方法,会发现,其实两者都是获取了系统里的状态栏使用的某个资源的高度信息,然后作为状态栏的高度信息

另外,网上流传的另一段代码

不能解决小屏模式下的显示问题,在小屏模式下得到的偏移并不是正确的状态栏高度

这样就引发一个问题,那就是如果非官方的系统UI,比如小米,华为等自定义的UI,不使用这个资源文件,或者根本就没有这个资源文件,那么获取到的高度信息不就是不正确的了吗?

继续阅读Android获取导航栏/状态栏/键盘的高度和状态

动态Java代码注入(JDK/Android)

JDK下使用javax.tools.JavaCompiler进行动态代码的生成,编译,执行。

在本文中,我们将研究如何将Java代码动态加载到正在运行的jvm中。 该代码可能是全新的,或者我们可能想更改程序中某些现有代码的功能。

(在开始之前,您可能想知道为什么到底有人会这样做。显而易见的示例是规则引擎之类的东西。规则引擎希望为用户提供添加或更改规则的能力,而不必重新启动规则。您可以通过将DSL脚本作为规则注入,由规则引擎调用此方法,这种方法的真正问题是必须对DSL脚本进行解释,使其运行起来非常缓慢。然后可以像程序中的任何其他代码一样编译和运行该程序,效率将提高几个数量级。

我们将要使用的库是Chronicle开源库Java-Runtime-Compiler 。

从下面的代码中您将看到,该库的使用极其简单-实际上,它实际上只需要几行。 创建一个CachedCompiler,然后调用loadFromJava。 (有关实际最简单的用例,请参见此处的文档。)

下面列出的程序执行以下操作:

  1. 创建一个线程,该线程每秒调用一次Strategy。
  2. 加载将两个数字相加的策略
  3. 等待3秒
  4. 加载从另一个数中减去一个数的策略

这是完整的代码清单:

这是输出:

请注意,在每次加载策略时,在代码中我们都创建了一个新的ClassLoader和一个CachedCompiler。 这样做的原因是,ClassLoader一次只能加载一个特定类的一个实例。

如果仅使用该库来加载新代码,则可以这样做,而无需创建ClassLoader(即使用默认的ClassLoader)和CachedCompiler。

Android下使用由于无法使用javax.tools.JavaCompiler,因此使用 linkedin/dexmaker 进行动态代码的生成,编译,执行。

参考链接


[翻译]OWASP 安卓测试指南(v1.2 - 14 May 2020)节选