显示查询结果时的字符问题

时间:2010-04-21 12:50:14

标签: sql jsp jdbc exchange-server

我不擅长jsp,但我想知道当其他所有字符串都显示良好时会出现什么问题:

JSP文件在联系人(MS Exchange)中按名称查询人员信息。查询返回该人的完整信息;并打印出姓氏,姓氏。带撇号的姓氏(例如:O'reilly)根本不显示。

什么是可能的解决方案?

提前致谢

P.S。我知道提问的方式不合适,但我需要以前遇到此类问题的人提供的信息。

1 个答案:

答案 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是一种视图技术,仅用于视图部分。