我有一个其网址为
的其他网络服务http://localhost/rest/authenticate?username=username&password=pa+ssw1&rd%
在密码参数中有3个特殊字符。
+
字符读为空格&
字符删除所有字符。例如 - 我的密码就像这个"passw&rd"
一样,它会像"passw"
%
字符未读取正确的密码,其读取空值。我的API就是这样......
@Path("/authenticate")
public class AuthenticateService {
private ILiteWebServiceFacade liteWebServiceFacade = ServiceLocator.locateService(ILiteWebServiceFacade.class);
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response authenticate(@FormParam("username") String username,
@FormParam("password") String password)
throws RestException {
AuthenticateResponse res = new AuthenticateResponse();
try {
res = liteWebServiceFacade.mobAuthenticate(username, password);
} catch (RestApplicationException e) {
res.setError(e.getErrorMessage().getErrorCode(), e.getErrorMessage().getErrorMessageKey());
}
return Response.ok(res).build();
}
}
你能建议我如何阅读所有这些特殊的角色吗?
答案 0 :(得分:0)
首先,我建议您不要在网址中发送用户名和密码等敏感数据。您应该在请求正文中发送。
一种简单的方法是在javascript中对前端进行Base64编码,在java中对后端进行解码。
FrontEnd :所有Chrome版本,Firefox 1.0及更高版本,Internet Explorer 10及以上版本
var string = 'pa+ssw1&rd%';
// Encode the String
var encodedString = btoa(string);
console.log(encodedString); // Outputs: cGErc3N3MSZyZCU=
// Decode the String
var decodedString = atob(encodedString);
console.log(decodedString); // Outputs: pa+ssw1&rd%
后端:
对于Java 8及更高版本:
import java.util.Base64;
byte[] decoded = Base64.getDecoder().decode(password);
decodedpassword = new String(decoded, "utf-8");
For< Java 8
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.StringUtils;
public String decode1(String s) {
return StringUtils.newStringUtf8(Base64.decodeBase64(s));
}
public String decode2(String s) {
return new String(Base64.decodeBase64(s), "utf-8");
}
Maven / sbt repo:commons-codec,commons-codec,1.8。
答案 1 :(得分:0)
所有的拳头,不要在URL中发送密码 - 这只是非常糟糕的安全性,因为查询参数可以记录在Apache或NGINX日志中,并且经常暴露在外。
其次,如果您使用的是HTTP,请了解某些字符需要转义。
%2B +
%20 {space}
%26 &
您必须确保您的代码实际上正在解码字符串,但根据您的框架,它可能会自动执行(例如Spring),或者您可能需要添加快速标注来解码。
如果您更改了URI编码的行为,则会更改HTTP规范,这将使消费您API的任何人都难以了解正在发生的事情 - 特别是如果您抓住&符号,因为任何URI编码都将被破坏为您的API。
请参阅RFC:统一资源标识符(URI):通用语法https://tools.ietf.org/html/rfc3986