安全HTML表单接受的字符集?(Safe HTML form accept charset?)

2019-10-17 19:35发布

与get方法提交表单(我不能使用POST方法),当我面对一个参数编码的问题。 有些加重字符没有在URL中逃了出来,因为我的页面UTF8。 春季控制器检索坏字符,而不是。

我通过设置解决了这个问题, accept-charset="ISO-8859-1"我的表上,但现在,我不知道该字符集为所有服务器/浏览器组合的安全性。 是否有任何建议对我的形式和“得到”的网址?

Answer 1:

这是令人沮丧的(说得客气一点)使用Servlet。 标准的URL编码必须使用UTF-8还SERVLETS不仅默认为ISO-8859-1,但不提供任何方法来改变这种代码。

当然,你可以req.setRequestEncoding("UTF-8")你读任何东西之前,但由于某种原因敬虔这只会影响请求主体,而不是查询字符串参数。 没有什么在servlet请求接口指定用于查询字符串参数的编码。

使用ISO-8859-1在您的形式是一个黑客。 使用这种古老的编码会造成比解决肯定更多的问题。 特别是因为浏览器不支持ISO-8859-1,总是把它与Windows 1252。 而servlet的处理ISO-8859-1 ISO-8859-1,所以你会超越信仰,如果你这个去拧。

为了在例如Tomcat改变这种情况,你可以使用URIEncoding在你的属性<connector>元素:

<connector ... URIEncoding="UTF-8" ... />

如果不使用具有这些设置的一个容器,不能改变其设置或一些其他的问题,你仍然可以让它工作,因为ISO-8859-1解码保留了原始二进制的全部信息。

String correct = new String(request.getParameter("test").getBytes("ISO-8859-1"), "UTF-8")

所以我们可以说test=ä ,如果一切设置正确,浏览器编码作为test=%C3%A4 。 你的servlet将它错误地解码为ISO-8859-1,给你生成的字符串"ä" 。 如果你申请的修正,就可以得到ä回来:

System.out.println(new String("ä".getBytes("ISO-8859-1"), "UTF-8").equals("ä"));
//true


Answer 2:

nickdos是正确的。 这样做的另一种方法是使用元数据标签:

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">

同时请记住处理服务器上的响应时,代码也应该使用正确的(相同的)编码。

例:

使用stringParamer.getBytes("utf-8") instead of stringParamer.getBytes()

并使用Spring确保正确的编码,配置DispatcherServlet的配置文件(XYZ_-servlet.xml中)在信息转换器时,如:

<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
    <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8"/>
</bean>


Answer 3:

问题是URL总是得到编码为127-ASCII。 因为你的形式发回通过GET设置标准ASCII以外的其他字符值,你必须要在几个问题上:

  1. URL被限制在2048个字符,所以你的表单值可能会得到截断
  2. 如果用户输入您在窗体属性设置的ISO接受型以外的字符,他们不会被正确编码到URL。 这是因为编码的URL首先使用网页的编码后,当浏览器转换到一切127-ASCII。 任何特殊字符不能在ISO设定会被正确编码。
  3. 浏览器总是先使用页面编码或meta标签转换在URL中的字符。 但是,如果有一台服务器的HTTP头,该编码将覆盖你的meta标签的编码。 对于HTML5网页的默认编码为UTF-8。 但是,您使用的是ISO标准从而覆盖。 即便如此,你的浏览器完成所有的编码代替非ASCII字符,然后从页面编码或在您的案件形式的集编码十六进制数字“%”。 这随后被发送到服务器,以便看看你的网址,看看已发送。
  4. 当你的URL到服务器的,它有127个ASCII的,所以你需要先得到字符串为ASCII,然后解码回页面编码或你的情况表接受用于获取真实值的值。

我建议你删除的形式编码,使用网页更广泛的字符支持UTF-8的设置,并在这两个元标记低于以确保您发送回UTF-8编码的数据,其中包括所需的所有文字,很容易解码如由其他海报以上上述服务器上。

<meta charset="utf-8" />
<meta content="text/html; charset=utf-8" http-equiv="content-type" />


文章来源: Safe HTML form accept charset?