当我使用fortify进行扫描时,我遇到了像#34;经常被误用的漏洞:身份验证"在下面的代码。为此我们有任何解决方法来避免这个问题。
我已经看过相关的帖子,但无法获得解决方案。使用ESAPI我已经为主机名和ipadress提供了正则表达式,但它不起作用。
addr.getHostAddress()
java.net.InetAddress.getByName(nameServiceHost);
java.net.InetAddress.getLocalHost().getCanonicalHostName()
localhost.getHostName()
请建议我解决这个问题。
答案 0 :(得分:1)
所有其他答案都尝试通过不使用内置API,而是使用命令行或其他方式提供解决方法。但是,他们错过了实际问题,不是问题所在的API,而是DNS可用于身份验证的假设。
攻击者可以spoof,即伪造为有效呼叫者的DNS响应。他们还可以使用IP address spoofing成为有效的呼叫者,而不会攻击DNS。
TL; DR不使用DNS或主叫方IP作为身份验证源。而是将SSL / TLS与进行加密连接,然后可以使用Basic-Authentication,Oauth2甚至更好的client-certificates aka mTLS。
答案 1 :(得分:0)
对于我的情况,我已经重写了这样的代码
public static String getIPAddress(String hostname) {
Process process;
String ipAddress = null;
String localIpAddress = null;
String[] commandArray;
if(System.getProperty("os.name").startsWith("Windows")) {
commandArray = new String[] {"cmd", "/c", "ping "+hostname+ " -4 | findstr Pinging"}; // For Windows
} else {
commandArray = new String[] { "bash", "-c", "host "+hostname}; // For Linux and OSX
}
try {
process = Runtime.getRuntime().exec(commandArray);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
String[] output;
// Reading the output of a command executed.
while ((localIpAddress = stdInput.readLine()) != null) {
if(System.getProperty("os.name").startsWith("Windows")) {
output = localIpAddress.split(" ");
ipAddress = output[2].replace("[", "").replace("]", "").trim();
} else {
output = localIpAddress.split("has address");
ipAddress = output[1];
}
}
} catch (IOException e) {
org.owasp.esapi.reference.Log4JLogFactory.getInstance().getLogger(" com.util.esapi.InetAddressWrapper.getIPAddress() << "+e+" >>");
}
return ipAddress;
}
答案 2 :(得分:0)
尝试使用InetSocketAddress包装器,尤其是Elasticsearch Transport Client:
new InetSocketAddress(hostname, port)
答案 3 :(得分:-1)
您可以验证请求是否来自可信主机
String ip = request.getRemoteAddr();
InetAddress addr = InetAddress.getByName(ip);
if (addr.getCanonicalHostName().endsWith("trustme.com")) {
trusted = true;
}