【问题标题】:How to escape-html in JSP before saving to database?保存到数据库之前如何在 JSP 中转义 html?
【发布时间】:2009-04-27 10:21:09
【问题描述】:

我目前正在学习 JSP 和 Java,并写了一个(非常)简单的留言簿来开始使用 JSP。但我想确保没有人可以使用 CSS,所以我需要先剥离 HTML 代码,然后再将其保存到我的 mySQL 数据库中。我已经在这里搜索并找到了“

  PreparedStatement pStmt = conn.prepareStatement("INSERT INTO test VALUES (ID, ?, ?)");

  pStmt.setString(1, request.getParameter("sender"));
  pStmt.setString(2, request.getParameter("text"));
  pStmt.executeUpdate();

那么正确的方法是什么?

【问题讨论】:

    标签: java database jsp escaping


    【解决方案1】:

    简答:看看org.apache.commons.lang.StringEscapeUtils.escapeHtml()

    更详细的答案:转义 HTML 是演示代码的工作,而不是数据库代码。如果出于某种原因,您想在非 Web 环境(例如经典 GUI)中的某个时间点显示数据怎么办?您必须取消转义整个内容,否则它将显示全部垃圾。

    只需按原样保存数据,并确保在显示它之前从用户那里获得的所有内容都转义(好吧,也许不是以数字形式存储的数字,但你明白了)。

    如果您使用 AJAX,您可以更进一步,只在 JavaScript 中转义您的字符串(或使用 innerText)。

    【讨论】:

    • 谢谢,这正是我想要的。另外,我会尝试在前端实现转义,而不是在数据库中。
    【解决方案2】:

    通常的做法是相反的。我们保存textarea 中的所有内容,并在显示时使用<c:out> 标签的escapeXML 属性。这样所有的 CSS、HTML 标签都将被视为简单的文本。

    【讨论】:

      【解决方案3】:

      您还可以使用 JSTL 函数:fn:escapeXml()。

       <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
       ...   
       <input type="hidden" name="htmlCode" value="${fn:escapeXml(htmlCode)}"/>
      

      【讨论】:

        【解决方案4】:

        出于安全目的,您需要转义 HTML,例如以防止诸如跨站脚本攻击 (XSS) 之类的事情。

        在 Google/Stack Overflow 上搜索跨站点脚本以获取更多详细信息。

        将有几个开源的 Servet 过滤器可以为您完成这项工作。

        例如请参阅here 了解说明

        【讨论】:

        【解决方案5】:

        您也可以使用 JSTL 核心库。

        c:out 默认开启了 escapeXml。

        例子:

        <c:out value="${tp.title}" />
        
        <c:out value="${product.listPrice}" escapeXml="false" /> //if you want turn off
        

        这种方法让您可以按照其他人的建议在表示层中进行转义。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-11
          • 1970-01-01
          • 1970-01-01
          • 2011-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多