我在我的应用程序中看到了这段代码。有人可以帮我理解这有助于清理请求URL以防止CR / LF引起的任何攻击吗?
public static String validaterequestURL(String requestURL) throws EncodingException {
Encoder encoder = new DefaultEncoder(new ArrayList<String>());
//canonicalize
String clean = encoder.canonicalize(requestURL).trim();
clean = encoder.decodeFromrequestURL(clean);
int idxR = clean.indexOf('\r');
int idxN = clean.indexOf('\n');
if(idxN >= 0 || idxR>=0){
if(idxN>idxR){
clean = clean.substring(0,idxN-1);
}
else{
clean = clean.substring(0,idxR-1);
}
}
return clean;
}
我想特别了解以下几行如何运作?
int idxR = clean.indexOf('\r');
int idxN = clean.indexOf('\n');
if(idxN >= 0 || idxR>=0){
if(idxN>idxR){
clean = clean.substring(0,idxN-1);
}
else{
clean = clean.substring(0,idxR-1);
}
}
答案 0 :(得分:1)
如果存在\n
(换行/换行)或\r
(回车)字符,则相应的索引(其在字符串中的位置)将为> = 0。如果是这样,substring
操作将截断字符串,删除有问题的字符及其后的所有内容。
似乎设置了逻辑,因此如果找到 \n
和\r
{{1}}和{{1}},则只会删除两者中的较晚者(及其之后的任何内容) 。我不知道为什么作者认为这是个好主意;我原本期望截断是从前一个完成的。