Java 从查询字符串解码JSP中的SAMLResponse
我有一个简单的JSP页面来显示解码后的SAML响应,该响应必须作为查询字符串接收。代码如下:Java 从查询字符串解码JSP中的SAMLResponse,java,xml,jsp,saml,Java,Xml,Jsp,Saml,我有一个简单的JSP页面来显示解码后的SAML响应,该响应必须作为查询字符串接收。代码如下: <%@ page contentType="text/xml" %> <%@ page language="java" import="java.io.*" %> <%@ page language="java" import="java.util.*" %> <
<%@ page contentType="text/xml" %>
<%@ page language="java" import="java.io.*" %>
<%@ page language="java" import="java.util.*" %>
<%@ page language="java" import="java.util.zip.*" %>
<%@ page language="java" import="javax.xml.parsers.*" %>
<%@ page language="java" import="org.w3c.dom.*" %>
<%@ page language="java" import="org.xml.sax.*" %>
<%@ page language="java" import="javax.xml.transform.*" %>
<%@ page language="java" import="javax.xml.transform.dom.*" %>
<%@ page language="java" import="javax.xml.transform.stream.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%!
private static Document convertStringToXMLDocument(String xmlString) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xmlString)));
return doc;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
%>
<%
String responseMessage = (String) request.getParameter("SAMLResponse");
responseMessage = responseMessage.replaceAll("\\s", "").trim();
byte[] base64DecodedResponse = Base64.getMimeDecoder().decode(responseMessage);
String outputString = new String(base64DecodedResponse);
Document doc = convertStringToXMLDocument(outputString);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
Source source = new DOMSource(doc);
StringWriter writer = new StringWriter();
Result res = new StreamResult(writer);
transformer.transform(source, res);
String SAMLString = writer.toString();
%>
<c:set var="SAMLResponse" value='<%= SAMLString %>' />
<c:out value='${SAMLResponse}' escapeXml="false" />
问题是,当收到的SAML非常长时,页面似乎不再工作,我无法正确解码它。我想指出,如果我创建了以下内容:
String responseMessage = "<long encoded SAML here>";
字符串响应消息=”;
我继续计算,JSP页面显示了预期结果。这是否与浏览器剪切的查询字符串或以非字符串格式接收的查询字符串有关?
谢谢我不会回答“我该如何解决这个问题”。相反,我将指出您迄今为止所做的工作中的一些安全问题。将响应放在查询参数中就是将身份验证令牌放在可以访问URL的所有内容中。这是很糟糕的安全性,大多数商业系统不支持将响应作为查询参数发送。我想说的另一件事是,在你的代码中,没有任何地方对响应进行签名验证,这是一个巨大的问题。嗨,首先,这不是生产代码,它只是一个家庭作业的测试。其次,
request.getParameter(“SAMLResponse”)
也用于检索POST数据,所以这没什么大不了的。你对如何解决这个问题有什么想法吗?或者你只是想给出一些安全提示?是不是每个浏览器都会出现这种情况?就一个?既然您说您的代码可以与表单POST一起工作,那么当查询参数不工作时,这会成功吗?您是否有用于调试的代码,比如回显接收到的查询参数以确保您获得了全部信息,或者如果浏览器将其切断?浏览器的调试器中是否出现任何错误?它发生在任何浏览器上,我看到SAML中带有一些空格,这就是为什么我使用replaceAll()
方法删除它们。浏览器调试器返回一个通用400错误。忘了说:即使使用POST方法,也会有相同的行为,但我在尝试解码时遇到此错误:输入字节数组有错误的4字节结尾单位我不会回答“如何修复此问题”。相反,我将指出您迄今为止所做的工作中的一些安全问题。将响应放在查询参数中就是将身份验证令牌放在可以访问URL的所有内容中。这是很糟糕的安全性,大多数商业系统不支持将响应作为查询参数发送。我想说的另一件事是,在你的代码中,没有任何地方对响应进行签名验证,这是一个巨大的问题。嗨,首先,这不是生产代码,它只是一个家庭作业的测试。其次,request.getParameter(“SAMLResponse”)
也用于检索POST数据,所以这没什么大不了的。你对如何解决这个问题有什么想法吗?或者你只是想给出一些安全提示?是不是每个浏览器都会出现这种情况?就一个?既然您说您的代码可以与表单POST一起工作,那么当查询参数不工作时,这会成功吗?您是否有用于调试的代码,比如回显接收到的查询参数以确保您获得了全部信息,或者如果浏览器将其切断?浏览器的调试器中是否出现任何错误?它发生在任何浏览器上,我看到SAML中带有一些空格,这就是为什么我使用replaceAll()
方法删除它们。浏览器调试器返回一个通用的400错误。忘了说:即使使用POST方法也有相同的行为,但我在尝试解码时遇到此错误:输入字节数组有错误的4字节结束单位