- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在努力确保我的 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 对象的级别,但在验证方面,您总是要遍历每个项目并尝试可能是恶意的。
作为最后的说明,在编写代码时,请牢记这些原则,您的代码将更加清晰,您的思维过程将更加专注:
isValidInput()
方法,而是使用 getValidInput()
,因为它会为您调用 canonicalize,从而让您少调用一次。 关于Java Jersey REST 请求参数清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556861/
我已阅读 Jersey documentation ,并表示 Jersey 在读取实体后自动关闭连接(例如 response.readEntity(SomeObject.class)) 但是当抛出异常
Jersey vs Jersey (Standalone) vs Jersey with Grizzly vs Jersey with Tomcat - for REST services 有什么区别
如何通过 guice 使用非 Jersey 资源和 Jersey 资源? 我希望“/”由普通 servlet 处理。但我希望 Jersey 处理“/users”。 假设我有一个带@Path("/use
我正在尝试使用 Maven、Apache Tomcat 7.0、Eclipse IDE 创建一个基本的 RESTful 应用程序。我在 google 提供的一些示例代码中遇到了 jersey-serv
我已经从 Jersey 1.7 升级到 2.16,但 Jersey 似乎无法找到我的资源(请参阅下面的堆栈)。任何想法发生了什么?我尝试在扩展 ResourceConfig 的自定义应用程序类中初始化
我正在使用 com.yammer.dropwizard.config.Environment addProvider 方法在 Jersey 中注册提供程序。我也有一个自定义提供程序,它执行类似于 Dr
在 Jersey 1.x 中,您可以使用 ContainerRequest.getFormParameters()对表单数据进行请求过滤,但我在 Jersey 2.x 中看不到明显的等价物。我已经实现
我正在使用Jersey的集成Jackson处理将传入的JSON转换为POJO,例如: @POST @Consumes(MediaType.APPLICATION_JSON) public Respon
我正在尝试以编程方式创建 Jersey 资源(没有注释)。我有一个将 Name 和 id 作为输入参数的方法 raiseAlarm。我想从 JSON 输入中获取名称,并且我希望 id 来自路径参数。代
Dropwizard official documentation Jersey 客户端不可测试,有人有 dropwizard Jersey 客户端样本吗? 最佳答案 我发现在 Dropwizard
我一直在寻找解决这个问题的方法,但没有成功。我发现的最新帖子可以追溯到 2010 年。我正在使用带有嵌入式 grizzly 2.2.1 的 Jersey 1.12。 如果我理解正确,除非我将 Jers
我想开发一个 Web API,它将生成和使用 JSON 和 XML 数据。 我已经使用JAXB来支持XML,并且工作正常。现在我想添加 JSON 类型。我研究了不同的教程,所有教程都使用不同的依赖项,
如此处所述:http://wikis.sun.com/display/Jersey/WADL 我在 Tomcat 6 中使用 Jersey 1.4。 我已经尝试了所有可能的带有“/applicatio
我是jax-rs的新手,并且已经用jersey和glassfish构建了Web服务。 我需要的是一种方法,服务启动后即被称为。在这种方法中,我想加载自定义配置文件,设置一些属性,编写日志等等。 我尝试
当客户端请求 Not Acceptable MIME 类型时,如何防止 Jersey 在客户端发送 HTML 页面?我想使用 ExceptionMapper,但我不确定要捕获什么异常,或者这是否是处理
我试图在它的 JSON 被解码后拦截一个资源调用。通过阅读一些论坛和帖子,我发现我可以通过实现 来做到这一点。 org.glassfish.jersey.server.spi.internal.Res
我的 webapp 包含一个库,其中包含一个用 @javax.ws.rs.ext.Provider 注释的类。 .如果存在此类,我的 web 应用程序(在 EAR 中部署为 WAR)将无法启动并显示以
我想自定义404响应,即服务器(不是我)在找不到请求的资源时抛出(或自己抛出一个自定义的WebApplicationException,如果可以测试一个应用程序中是否存在请求的资源)?资源列表存储在某
我有一个受 Shibboleth(SSO 实现)保护的 Jersey API。 Shibboleth 将登录用户的 ID 放入请求属性中。在后端,我使用 Shiro 进行授权。 Shiro 希望了解登
我目前正在使用 Jersey 返回 JSON。我该如何返回 JSONP?例如我当前的RESTful方法是: @GET @Produces(MediaType.APPLICATION_JSON) pub
我是一名优秀的程序员,十分优秀!