我将一个findbugs探测器放在一起寻找在某些java代码中创建的任何HttpURLConnections。一个大项目有很多,不能再进行未加密的连接,所以我想通过findbugs报告它们。
我知道我可以使用以下内容来检查我使用的新java.net.URL实例" http://"
import edu.umd.cs.findbugs.bcel.OpcodeStackDetector;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;
public class UnencryptedHttpDetector extends OpcodeStackDetector {
private BugReporter bugReporter;
public UnencryptedHttpDetector(BugReporter bugReporter) {
this.bugReporter = bugReporter;
}
@Override
/***
* Look for instantiation of HttpUrlConnection
*/
public void sawOpcode(int seen) {
if ((seen == INVOKESPECIAL) && getClassConstantOperand().equals("java/net/URL")
&& getNameConstantOperand().equals("<init>")
){
OpcodeStack.Item top = stack.getStackItem(0);
//Object value = top.getConstant();
String value = top.getConstant().toString();
if(value.toLowerCase().startsWith("http://"))
{
bugReporter.reportBug(new BugInstance(this, "HTTP_INSECURE_CONNECTION", NORMAL_PRIORITY)
.addClassAndMethod(this).addSourceLine(this));
}
}
}
这将找到我的代码,但我该如何检查:
HttpURLConnection connection = (HttpURLConnection)new URL("http://www.google.com").openConnection();
具体而言,将网址创建投放到HttpURLConnection
?
记录,我可以看到我的堆栈深度为3.我可以检查此init的返回值吗?我不知道怎么做。
修改
我已经得到了它的一部分,但基本上我需要查看CHECKCAST并在我投射到HttpUrlConnection时抛出一些东西,或者实际检查变量声明。
我的新方法如下:
@Override
/***
* Look for instantiation of HttpUrlConnection
*/
public void sawOpcode(int seen) {
//Check Invoking URL with a http:// url
if ((seen == INVOKESPECIAL) && getClassConstantOperand().equals("java/net/URL")
&& getNameConstantOperand().equals("<init>")
){
OpcodeStack.Item top = stack.getStackItem(0);
String value = top.getConstant().toString();
if(value.toLowerCase().startsWith("http://"))
{
bugReporter.reportBug(new BugInstance(this, "HTTP_INSECURE_CONNECTION", NORMAL_PRIORITY)
.addClassAndMethod(this).addSourceLine(this));
}
}
//Check Casting URLConnection to HttpURLConnection
else if(seen == CHECKCAST && getClassConstantOperand().equals("java/net/HttpURLConnection"))
{
OpcodeStack.Item top = stack.getStackItem(0);
if(top.getSignature().equals("java/net/URLConnection"))
{
bugReporter.reportBug(new BugInstance(this, "HTTP_INSECURE_CONNECTION", NORMAL_PRIORITY)
.addClassAndMethod(this).addSourceLine(this));
}
}
}
这会检查URL(&#34; Http://....&#34;)并将URLConnection转换为HttpUrlConnection。我可以检查声明httpurlconnection吗?