Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用OWASP ESAPI时是否需要启用规范化?_Java_Security_Owasp_Esapi - Fatal编程技术网

Java 使用OWASP ESAPI时是否需要启用规范化?

Java 使用OWASP ESAPI时是否需要启用规范化?,java,security,owasp,esapi,Java,Security,Owasp,Esapi,我们正在向应用程序添加ESAPI 2.x(owasp java安全库) 这种改变很容易,但很重复。我们正在向所有输入参数添加验证,以确保它们组成的所有字符都在白名单中 就是这样: Validator instance = ESAPI.validator(); Assert.assertTrue(instance.isValidInput("test", "xxx@gmail.com", "Email", 100, false)); 然后在validation.properties文件中设置电子

我们正在向应用程序添加ESAPI 2.x(owasp java安全库)

这种改变很容易,但很重复。我们正在向所有输入参数添加验证,以确保它们组成的所有字符都在白名单中

就是这样:

Validator instance = ESAPI.validator();
Assert.assertTrue(instance.isValidInput("test", "xxx@gmail.com", "Email", 100, false));
然后在validation.properties文件中设置电子邮件模式,如下所示:

Validator.Email=^[A-Za-z0-9._%'-]+@[A-Za-z0-9.-]+\\.[a-zA-Z]{2,4}$
轻松点


我们不编码输出,因为在输入验证之后,数据变得可信

我可以在ESAPI中看到,它有一个标志来规范化输入字符串。我知道规范化是“去编码”,所以任何编码的字符串都会转换为纯文本

问题是。为什么我们需要规范化

任何人都可以展示一个使用规范化可以防止的攻击示例吗??(爪哇语)


谢谢大家!

数据规范化还涉及将数据导出为其基本形式。因此,如果我们采用不同的场景,其中涉及文件路径(相对/symlink)及其关联目录权限,我们需要首先规范化路径,然后验证其他路径,这将允许某人通过传递目标可接受的数据,在未经许可的情况下浏览这些文件。

以下是一个(数千个可能的示例中的一个):

以这个简单的XSS输入为例:

<script>alert('XSS');</script>
//Now we URI encode it:
%3Cscript%3Ealert(%27XSS%27)%3B%3C%2Fscript%3E

//Now we URI encode it again:

%253Cscript%253Ealert(%2527XSS%2527)%253B%253C%252Fscript%253E
这是一个肮脏的事实:Javascript、XML、JSON和HTML不是“常规语言”,它们是不确定的。这实际上意味着,从数学上讲,编写一个正则表达式来拒绝将HTML或Javascript插入应用程序的所有尝试是不可能的。看看我在上面贴的XSS过滤器规避备忘单

您的应用程序是否使用jquery?以下输入错误:

$=''|'',_=$+!"",__=_+_,___=__+_,($)[_$=($$=(_$=""+{})[__+__+_])+_$[_]+(""+_$[-__])[_]+(""+!_)[___]+($_=(_$=""+!$)[$])+_$[_]+_$[__]+$$+$_+(""+{})[_]+_$[_]][_$]((_$=""+!_)[_]+_$[__]+_$[__+__]+(_$=""+!$)[_]+_$[$]+"("+_+")")()
因此,在输出给用户时,您必须对所有数据进行编码,这意味着如果要将数据块首先输入到javascript函数中,然后显示为HTML,则需要对javascript进行编码,然后是HTML。如果将其输出到HTML数据字段(如默认输入框),则将其编码为HTML属性

实际上,在防止XSS方面,输出编码比输入过滤更重要。(如果我必须选择一个…)


您希望在web开发中遵循的模式是,任何来自外部世界的输入都被视为恶意的。您可以在任何时候向动态解释器进行编码

“我们不会对输出进行编码,因为在输入验证之后,数据会变得可信。”Nooooooo!!!您必须始终转义输出。源可能在输入之外的某个地方。这与正确性和安全性同样重要——1:如果数据的来源是用户,则数据永远不会被信任。看:我要说的是,这个问题不值得否定!至少它引起了一些讨论,所以看起来这是一件值得问的事情。顺便说一句,数据总是来自用户。当它被正确验证时,它确实变得可信。事实上,这就是OWASP本身告诉我们的:使用白名单。你是对的。此外,Adobe在其安全指南(XSSAPI库)中告诉我们:“允许所有输入-编码所有输出”。这个策略的优点是开发者很容易记住,也很容易检查。缺点是给新手打上标记,而且显然是新的规则阻止我改变投票。XSS过滤是合适的,但只能作为另一层防御。让攻击者为自己的午餐工作没什么错!非常感谢您的评论!请注意,我们使用的不是如您所说绝对不可能获得的黑名单,而是非常严格的白名单,基本上只允许字母(a..Za..z)和数字(0..9)以及一些符号,如u和-。请记住,在Java正则表达式中,
[a-Za-z0-9]+
将允许unicode字符通过。如果您不相信我,请尝试
String foo=“\uff12”并查看它是否经过。如果您想阻止Java可以处理的全部内容,您需要regex
“[\\p{Alnum}]{0-some_limit}”
您应该使用默认情况下使用validation.properties中列出的“SafeString”正则表达式的
ESAPI.validator
,尽管我认为它使用的正则表达式是[\\p{L}\\p{N}+”
效率稍低。轻微调整:
“[\\p{Alnum}]{0-1024}”
“[\\p{L}\\p{N}]{0-1024}”
请注意,tString foo=“\uff12”仅由java编译器进行解释。当它是一个参数时,不会对其进行解释。
$=''|'',_=$+!"",__=_+_,___=__+_,($)[_$=($$=(_$=""+{})[__+__+_])+_$[_]+(""+_$[-__])[_]+(""+!_)[___]+($_=(_$=""+!$)[$])+_$[_]+_$[__]+$$+$_+(""+{})[_]+_$[_]][_$]((_$=""+!_)[_]+_$[__]+_$[__+__]+(_$=""+!$)[_]+_$[$]+"("+_+")")()