我不擅长jsp,但我想知道当其他所有字符串都显示良好时会出现什么问题:
JSP文件在联系人(MS Exchange)中按名称查询人员信息。查询返回该人的完整信息;并打印出姓氏,姓氏。带撇号的姓氏(例如:O'reilly)根本不显示。
什么是可能的解决方案?
提前致谢
P.S。我知道提问的方式不合适,但我需要以前遇到此类问题的人提供的信息。
答案 0 :(得分:0)
您需要按PreparedStatement
而不是Statement
执行SQL查询,否则您的SQL查询会中断(并且也容易SQL injections)。
想象一下以下查询:
SELECT foo FROM tbl WHERE name = 'O'Reilly'
这会产生SQL语法错误。如果您检查了服务器日志,您应该已经看过了。当您使用servlet而不是JSP来执行任务时,您应该已经在屏幕上看到过这个。使用PreparedStatement
,查询将按如下方式进行清理:
SELECT foo FROM tbl WHERE name = 'O\'Reilly'
这样SQL就可以理解这个查询并且可以毫无问题地执行它。
另一方面,您还需要对结果进行HTML转义,否则它将容易XSS attacks。
想象一下以下显示:
<input type='text' value='${name}'>
如果${name}
为O'Reilly
,那么HTML将最终成为
<input type='text' value='O'Reilly'>
你只会看到O
。如果名称为'><script>alert('xss')</script><input type='text' value='
,会发生什么?要解决此问题,请使用JSTL fn:escapeXml
显示输入:
<input type='text' value='${fn:escapeXml(name)}'>
(顺便提一下,建议使用双引号而不是单引号,上面只是一个例子)
那就是说,你在技术上也不应该在JSP文件中这样做。原始Java代码属于Java类,而不是JSP文件。 JSP是一种视图技术,仅用于视图部分。