【问题标题】:Is Explicit decoding required here?这里需要显式解码吗?
【发布时间】:2015-11-19 14:03:48
【问题描述】:

假设我在 HTML 中显示转义值,并在文本区域下使用以下代码:

     <c:out value="${person.name}" />

我的问题是我需要在服务器端手动解码这个值还是浏览器会自动解码?

【问题讨论】:

    标签: java html security browser decoding


    【解决方案1】:

    不,你不需要手动解码这个值。你只需要:

    1. 将您的 HTTP 响应内容类型编码指定为 UTF-8。准确地说,使用HttpServletResponse.setContentType ("text/html;charset=utf-8");
    2. 您的 JSP 应该在您的 JSP 中将内容类型编码设置为 UTF-8 .. 准确地说,在您的 JSP 中添加这个元标记,您应该可以使用 &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&gt;

    当你的 JSP 中有这个标签时,浏览器会理解这个页面的内容应该按照 UTF-8 编码规则呈现。

    如果不使用这些元标记或其他机制明确指定页面编码,则浏览器在页面呈现时使用与之关联的默认编码,您可能看不到预期的结果,尤其是来自 Unicode 的高级 BMP 块和补充块的字符多语言平面。 Check this on how to see the default encoding of browser


    概念

    服务器应在“响应流”中指定所需的编码方案,并且在 JSP/ASP/HTML 页面中应使用相同的编码方案。

    服务器端编码选项

    PHP header('Content-type: text/html; charset=utf-8');

    Perl print "Content-Type: text/html; charset=utf-8\n\n";

    Python 使用与 Perl 相同的解决方案(除了最后不需要分号)。

    Java Servlet resource.setContentType ("text/html;charset=utf-8");

    JSP &lt;%@ page contentType="text/html; charset=UTF-8" %&gt;

    ASP 和 ASP.Net &lt;%Response.charset="utf-8"%&gt;


    客户端编码选项

    在您的 HTML 页面中使用以下元标记 &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&gt;


    进一步阅读:

    【讨论】:

    • 我的问题实际上是,一旦我使用 c:out 转义浏览器上的数据,我是否需要在服务器端解码,即在我的 servlet 中?
    • c:out 是在浏览器中显示来自服务器的内容.. 这并不意味着将某些内容推送到服务器.. 所以,你所说的首先是不可能的.. 在无论如何,如果您想处理 HTTP 请求对象上的编码,请使用request.setCharacterEncoding("UTF-8"); ..阅读我在“进一步阅读”中提供的答案链接,以深入了解服务器和客户端编码细节..跨度>
    • 我了解c:out is to display something in browser which is coming from server .. ,但我要问的是,一旦某些输出在浏览器上显示为 c:out,现在表单将提交回服务器。现在我必须再次解码 servlet 中的代码吗?
    • 例如: - 我在输入 h&amp;amp;Agrawal 上使用 c:out,它会在浏览器上呈现为 h&amp;amp;Agrawal,尽管它只会在 html 中显示为 HAgrawal。我的问题是将 html 表单提交回服务器,在我的 servlet 中是否需要显式解码才能将 h&amp;amp;Agrwal 转换为 hAgrawal
    • 我已经开始我的回答,你不需要手动做。如果不会遇到任何问题(此外,你使用的是 ASCII 表 asciitable.com 中的字符,这总是安全的没有任何编码)但是如果您遇到任何问题,那么我也提供了解决方案..
    【解决方案2】:

    当我获得转义输入的 request.parameter(通过)&lt;c:out value="${person.name}" /&gt; 时,我得到转义值并将其存储在 db 中。例如:- &lt;script&gt;test&lt;/script&gt; is stored as &amp;lt;script&amp;gt;test&amp;lt;/script&amp;gt; 现在,当从数据库中获取值并显示在浏览器上时,它会正确呈现它,即 &amp;lt;script&amp;gt;test&amp;lt;/script&amp;gt; is displayed as &lt;script&gt;test&lt;/script&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多