我正在尝试使用ESAPI编码器来识别和规范化URL编码的查询参数。它有点工作,但不是API似乎表明的方式。这是我的类,下面是它生成的输出:
CODE
package test.test;
import org.owasp.esapi.ESAPI;
import org.owasp.esapi.Validator;
import org.owasp.esapi.errors.EncodingException;
import org.owasp.esapi.errors.IntrusionException;
import org.owasp.esapi.errors.ValidationException;
public class ESAPITester {
public static void main(String argsp[]) throws ValidationException,
IntrusionException, EncodingException {
String searchString = "-/+=_ !$*?@";
String singleEncoded = ESAPI.encoder().encodeForURL(searchString);
String doubleEncoded = ESAPI.encoder().encodeForURL(singleEncoded);
Validator validator = ESAPI.validator();
System.out.println("Searched : " + searchString);
System.out.println("Single encoded : " + singleEncoded);
System.out.println("Double encoded : " + doubleEncoded);
System.out.println("Decode from URL : " + ESAPI.encoder().decodeFromURL(singleEncoded));
System.out.println("Canonicalized : " + ESAPI.encoder().canonicalize(singleEncoded));
System.out.println("Valid input : " + validator.getValidInput("http",
searchString, "HTTPParameterValue", 100, true, true));
System.out.println("Valid from Encoded : " + validator.getValidInput("http",
singleEncoded, "HTTPParameterValue", 100, true, true));
}
}
输出
Searched : -/+=_ !$*?@
Single encoded : -%2F%2B%3D_+%21%24*%3F%40
Double encoded : -%252F%252B%253D_%2B%2521%2524*%253F%2540
Decode from URL : -/ =_ !$*?@
Canonicalized : -/+=_+!$*?@
Valid input : -/+=_ !$*?@
log4j:WARN No appenders could be found for logger (IntrusionDetector).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" org.owasp.esapi.errors.ValidationException: http: Invalid input. Please conform to regex ^[\p{L}\p{N}.\-/+=_ !$*?@]{0,1000}$ with a maximum length of 100
at org.owasp.esapi.reference.validation.StringValidationRule.checkWhitelist(StringValidationRule.java:144)
at org.owasp.esapi.reference.validation.StringValidationRule.checkWhitelist(StringValidationRule.java:160)
at org.owasp.esapi.reference.validation.StringValidationRule.getValid(StringValidationRule.java:284)
at org.owasp.esapi.reference.DefaultValidator.getValidInput(DefaultValidator.java:214)
at test.test.ESAPITester.main(ESAPITester.java:25)
我的问题是:为什么getValidInput()不规范化URL编码的输入参数?我很好奇为什么canonicalize()方法这样做,但getValidInput()并且最终参数('canonicalize')设置为true则不然。
答案 0 :(得分:2)
所以问题就变成了:
为什么第二个validator.getValidInput()调用会抛出异常,何时 预期所做的只是规范化输入和验证 它与预期值匹配。换句话说,直接打电话给 canonicalize()有效,但对getValidInput()的调用失败。
这里有些不对劲。在您从OWASP源代码库获得的HTTPParameterValue
版本中,正则表达式为^[a-zA-Z0-9.\\-\\/+=@_ ]*$
有人操纵HTTPParameterValue
看起来更像SafeString
:^[\\s\\p{L}\\p{N}.]{0,1024}$
这是错误的。如果需要自定义更改,则不应更改默认ESAPI值,使用已建立的模式编写全新的validator.properties条目。
但是,您的测试仍然会失败,因为字符串解码为-/+=_ !$*?@
,而?
是http查询中的保留字符。
3.4。查询组件
查询组件是要解释的信息字符串 资源。
query = *uric
在查询组件中,字符“;”,“/”,“?”,“:”,“@”,
“&”,“=”,“+”,“,”和“$”是保留的。
根据您正在运行的正则表达式输入失败的原因,^[\\p{L}\\p{N}.\\-/+=_ !$*?@]{0,1000}$
,read the code.在第266行,您将看到受影响的方法。
以下是您要查看的内容:
public String getValid( String context, String input ) throws ValidationException
{
String data = null;
// checks on input itself
// check for empty/null
if(checkEmpty(context, input) == null)
return null;
if (validateInputAndCanonical)
{
//first validate pre-canonicalized data
// check length
checkLength(context, input);
// check whitelist patterns
checkWhitelist(context, input);
// check blacklist patterns
checkBlacklist(context, input);
// canonicalize
data = encoder.canonicalize( input );
} else {
//skip canonicalization
data = input;
}
// check for empty/null
if(checkEmpty(context, data, input) == null)
return null;
// check length
checkLength(context, data, input);
// check whitelist patterns
checkWhitelist(context, data, input);
// check blacklist patterns
checkBlacklist(context, data, input);
// validation passed
return data;
在尝试规范化输入之前,会对正则表达式进行检查。