gpt4 book ai didi

Java Jersey REST 请求参数清理

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:45:54 27 4
gpt4 key购买 nike

我正在努力确保我的 Jersey 请求参数经过清理。

处理Jersey GET请求时,是否需要过滤非String类型?
例如,如果提交的参数是一个整数,那么选项 1 (getIntData) 和选项 2 (getStringData) 都是黑客安全的吗? JSON PUT 请求怎么样,我的 ESAPI 实现是否足够,或者我是否需要在映射后验证每个数据参数?可以在映射之前对其进行验证吗?

Jersey 休息示例类:

public class RestExample {

//Option 1 Submit data as an Integer
//Jersey throws an internal server error if the type is not Integer
//Is that a valid way to validate the data?

//Integer Data, not filtered
@Path("/data/int/{data}/")
@GET
@Produces(MediaType.TEXT_HTML)
public Response getIntData(@PathParam("data") Integer data){
return Response.ok("You entered:" + data).build();
}

//Option 2 Submit data as a String, then validate it and cast it to an Integer

//String Data, filtered
@Path("/data/string/{data}/")
@GET
@Produces(MediaType.TEXT_HTML)
public Response getStringData(@PathParam("data") String data) {
data = ESAPI.encoder().canonicalize(data);
if (ESAPI.validator().isValidInteger("data", data, 0, 999999, false))
{
int intData = Integer.parseInt(data);
return Response.ok("You entered:" + intData).build();
}
return Response.status(404).entity("404 Not Found").build();
}

//JSON data, HTML encoded
@Path("/post/{requestid}")
@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON})
@Produces(MediaType.TEXT_HTML)
public Response postData(String json) {
json = ESAPI.encoder().canonicalize(json);
json = ESAPI.encoder().encodeForHTML(json);

//Is there a way to iterate through each JSON KeyValue and filter here?

ObjectMapper mapper = new ObjectMapper();
DataMap dm = new DataMap();
try {
dm = mapper.readValue(json, DataMap.class);
} catch (Exception e) {
e.printStackTrace();
}

//Do we need to validate each DataMap object value and is there a dynamic way to do it?
if (ESAPI.validator().isValidInput("strData", dm.strData, "HTTPParameterValue", 25, false, true))
{
//Is Integer validation needed or will the thrown exception be good enough?
return Response.ok("You entered:" + dm.strData + " and " + dm.intData).build();
}
return Response.status(404).entity("404 Not Found").build();
}
}

数据映射类:

public class DataMap {

public DataMap(){}

String strData;
Integer intData;
}

最佳答案

简短的回答是肯定的,尽管我将“过滤”解释为“验证”,因为再多的“过滤”也无法为您提供安全的数据。您仍然可以在 Java 中遇到整数溢出,虽然这些可能不会立即引起安全问题,但它们仍然可能使您的应用程序的某些部分处于计划外的状态,而黑客攻击就是以您可以控制的方式扰乱系统。

您在一个“问题”中包含了太多的问题,但我们开始吧:

首先,线条

json = ESAPI.encoder().canonicalize(json);
json = ESAPI.encoder().encodeForHTML(json);

没有做您认为他们正在做的事情。如果您的 JSON 在这里作为原始字符串传入,这两个调用将在整个字符串中应用大量规则,当您确实需要更精确地处理这些时,您似乎至少下意识地意识到了这一点在下一个问题中。

//Is there a way to iterate through each JSON KeyValue and filter here?

this question. 的部分副本

当您处于此处讨论的循环中时,您可以执行任何您想要的数据转换,但您真正应该考虑的是使用第一个链接中引用的 JSONObject 类。 Then you'll have JSON parsed into an object where you'll have better access to JSON key/value pairs.

//Do we need to validate each DataMap object value and is there a dynamic way to do it?

是的,我们验证来自用户的一切。假定所有用户都是受过训练的黑客,并且比您更聪明。但是,如果您在进行数据映射转换之前处理了过滤,则无需进行第二次。动态执行?

类似于:

JSONObject json = new JSONObject(s);
Iterator iterator = json.keys();

while( iterator.hasNext() ){
String data = iterator.next();
//filter and or business logic
}

^^该语法跳过了类型检查,但它应该可以让您到达需要去的地方。

/Is Integer validation needed or will the thrown exception be good enough?

我没有看到你在这些代码行中抛出异常的地方:

if (ESAPI.validator().isValidInput("strData", dm.strData, "HTTPParameterValue", 25, false, true)) 
{
//Is Integer validation needed or will the thrown exception be good enough?
return Response.ok("You entered:" + dm.strData + " and " + dm.intData).build();
}

首先,在 java 中我们有自动装箱,这意味着:

int foo = 555555;
String bar = "";
//the code
foo + bar;

将在任何 实例中转换为字符串。编译器会将 int 提升为 Integer,然后静默调用 Integer.toString() 方法。此外,在您的 Response.ok( String ); 调用中,这是您想要 encodeForHTML 或任何输出上下文的地方。编码方法始终用于向用户输出数据,而规范化则希望在接收 数据时调用。最后,在这段代码中,我们还有一个错误,您假设您正在处理 HTTPParameter。不是在代码的这一点上。您将在调用 request.getParameter("id"): 的实例中验证 http 参数,其中 id 不是像整个 JSON 那样的大数据 block 响应或整个 XML 响应。此时你应该验证诸如“SafeString”之类的东西

通常 Java 中有解析库,它们至少可以让您达到 Java 对象的级别,但在验证方面,您总是要遍历每个项目并尝试可能是恶意的。

作为最后的说明,在编写代码时,请牢记这些原则,您的代码将更加清晰,您的思维过程将更加专注:

  1. 用户输入永远不安全。 (是的,即使您已通过 XSS 过滤器运行它。)
  2. 每当接收数据时使用验证和规范化方法,并在将数据传输到不同上下文时使用编码方法,其中上下文定义为“Html 字段。Http 属性。Javascript 输入等...)
  3. 我建议不要使用 isValidInput() 方法,而是使用 getValidInput(),因为它会为您调用 canonicalize,从而让您少调用一次。
  4. 在任何时候将您的数据传递给另一种动态语言(例如 SQL、groovy、Perl 或 javascript)时进行编码。

关于Java Jersey REST 请求参数清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556861/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com