在 URL 中发送敏感数据是一个非常糟糕的主意。 永远不要这样做。 请求的 URL 由服务器和代理记录。如果浏览器请求 URL,则 URL 会转到浏览器历史记录。 这是一个安全漏洞。
你不应该做的事情
找出下面两个你绝对不能使用的不好的方法。
如果你的端点是这样的:
@Path("/myapi")
public class MyResource() {
@GET
@Path("/{user}/{pass}/{url}")
@Produces(MediaType.APPLICATION_JSON)
public String foo(@PathParam("user") String user,
@PathParam("pass") String pass,
@PathParam("url") String url) {
...
}
}
请求会是这样的:
GET /myAPP/webapi/myapi/some%40email.com/jsjjsd/https%3A%2F%2Flogin.salesforce.com%2Fservices%2FSoap%2Fu%2F37.0 HTTP/1.1
Host: localhost:8080
Accept: application/json
如果你的端点是这样的:
@Path("/myapi")
public class MyResource() {
@GET
@Produces(MediaType.APPLICATION_JSON)
public String foo(@QueryParam("user") String user,
@QueryParam("pass") String pass,
@QueryParam("url") String url) {
...
}
}
请求会是这样的:
GET /myAPP/webapi/myapi?user=some%40email.com&pass=jsjjsd&url=https%3A%2F%2Flogin.salesforce.com%2Fservices%2FSoap%2Fu%2F37.0 HTTP/1.1
Host: localhost:8080
Accept: application/json
请注意参数值是 URL 编码的。如需进一步参考,请查看此answer。
你应该怎么做
当通过网络发送敏感数据时,强烈建议使用 HTTPS。 HTTPS 将保护您免受中间人攻击。对于证书颁发机构,您可以考虑Let's Encrypt。它声称是免费、自动化和开放的。
您应该使用POST 在请求负载中发送它们,而不是在 URL 中发送这些参数。例如,请求有效负载可以是 JSON。使用 JAX-RS 后,您可以使用 JSON 提供程序,例如 Jackson。
为此,请定义一个如下所示的 bean:
public class Credentials implements Serializable {
private String user;
private String pass;
private String url;
// Getters and setters omitted
}
并在您的资源方法中使用它:
@Path("/myapi")
public class MyResource() {
@POST
@Consumer(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String foo(Credentials credentials) {
...
}
}
请求会是这样的:
POST /myAPP/webapi/myapi HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Accept: application/json
{
"user": "some@email.com",
"pass": "jsjjsd",
"url": "https://login.salesforce.com/services/Soap/u/37.0"
}