前言:这可能是一个巨大的菜鸟错误,我团队中的所有开发人员都对 Java 101 有点模糊,所以如果我们不担心任何事情,请告诉我。[具体来说,担心在 permgen 中缓存的字符串文字]
我们有一个简单的登录页面,基本上如下所示:
//支持 Bean“LoginBean”
String username;
String password;
//getter/setter pairs
//JSF
<h:form id="login">
<h:inputText value="#{loginBean.username} />
<h:inputSecret value="#{loginBean.password} />
<h:commandButton actionListener="#{loginBean.login} />
</h:form>
我在这里担心的是,传递的字符串文字可能会被缓存并打开潜在的安全漏洞。有没有办法进行设置,以便我们完全绕过字符串文字?如果这是一个 Swing 应用程序,我将使用 JPasswordField,它明确具有“char[] getPassword();”
或者在我想要的代码中:
String username;
char[] password;
感谢您的帮助,如果这是一个双重帖子,请随时打我,我似乎找不到它,但这似乎是一个核心问题。
我在这里担心的是,传递的字符串文字可能会被缓存并打开潜在的安全漏洞。
您的担忧仅部分有效。字符串文字实际上是作为 Java 类文件中的文字出现的。用户提供的密码不是字符串;相反,它是一个 String 对象,除非您调用,否则它不会被放置在永久代中String.intern()
.
现在假设您没有犯下调用的愚蠢行为String.intern()
,您对内存中密码的其他担忧应该得到解决。这已经是在 Java 中几乎不可能(由于垃圾收集器执行对象的复制),并且 JSF 生命周期使其不可能(通过要求为输入值构造 String 对象)。以下代码是我编写的,允许托管 bean 通过将字符串转换为 char[] 数组(反之亦然)来将密码存储为字符数组,但如果您已经意识到,它仅用于合规性检查那String
对象可能会在内存中停留一段时间:
@FacesConverter("Char[]Converter")
public class CharArrayConverter implements Converter
{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String newValue)
{
if(newValue == null)
{
return newValue;
}
return newValue.toCharArray();
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
if(value == null)
{
return null;
}
char[] inputValue;
try
{
inputValue = (char[]) value;
}
catch(ClassCastException ccex)
{
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Object was not present in the desired format", null);
throw new ConverterException(message);
}
return new String(inputValue);
}
}
该转换器在 Facelet 中的用途如下:
...
<p>
<h:outputLabel for="password" value="#{msg['Signup.password.label']}" />
<h:inputSecret id="password" value="#{userManager.signupRequest.password}" converter="Char[]Converter" />
</p>
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)