第三十一章 使用 CSP 进行基于标签的开发 - 转义和引用HTTP输出
转义和引用HTTP
输出
要创建HTML中使用的特殊字符的文字显示,必须使用转义序列。 例如,要在HTML
中显示>
(右尖括号)字符(它在HTML中具有特殊含义),必须使用字符序列:
>对其进行转义。
CSP文档的不同部分可能使用不同的转义规则(例如
HTML和
JavaScript`)。
%CSP.Page
提供了许多转义和引用方法:
- 转义方法接受一个字符串作为输入,并返回一个所有特殊字符都替换为适当转义序列的字符串。
- 引用方法接受一个字符串作为输入并返回一个带引号的字符串(即带有适当的括引号)。 加引号的字符串还将所有特殊字符替换为转义序列。
- 对于每个转义方法,都有一个相应的反转义方法,它将转义序列替换为纯文本。
使用EscapeHTML
转义HTML
%CSP.Page
可以用相应的HTML转义序列替换字符。
#(..EscapeHTML(x))# 复制代码
如果x
的值<mytag>
,则向HTTP
客户端发送以下转义文本:
<mytag> 复制代码
同样,当你发送HTML
属性的值时,转义是必要的:
<input type="BUTTON" value="#(..EscapeHTML(value))#"> 复制代码
如果value
的值是<ABC>
,这将导致以下文本被发送到HTTP客户端,其中左右两个尖括号被替换为它们的等效字符序列:<
并且>
分别是:
<input type="BUTTON" value="<ABC>"> 复制代码
将""
(引号)放在#()#
指令的两边,使生成的HTML
属性值带引号。
当从数据库向HTTP
客户端发送输出时,对其进行转义是一个很好的做法。例如,考虑以下将用户名写入网页的表达式(假设user
是对具有name
属性的对象的引用):
User name: #(user.Name)# 复制代码
如果应用程序允许用户将他们的名字输入到数据库中,会发现一个恶意用户可能会输入一个包含HTML
命令的名字。如果将下面的内容写到一个没有HTML
转义序列的HTTP
客户端,该页面可能会出现意外的行为。
Set user.Name = "<input type=button onclick=alert('Ha!');>" 复制代码
用EscapeURL
转义URL
参数
URL
字符串中的参数值也可以转义。URL
使用一组不同于HTML
的转义序列。%CSP.Page
在一个类EscapeURL
方法中用相应的转义序列替换所有特殊的URL
参数值处理字符。
例如,如果CSP
文件使用服务器端变量x
的值作为URL
参数值,则x
中的任何字符都可以通过以下表达式进行转义:
<a href="page2?ZOOM=#(..EscapeURL(x))#">Link</A> 复制代码
如果x
的值是100%
,那么下面的文本被发送到HTTP
客户端。%
字符被转义为%25
。
<a href="page2?ZOOM=100%25">Link</A> 复制代码
用QuoteJS
转义JavaScript
%CSP.Page
类中的提供#(. .QuoteJS(x))#
字符串,用它们对应的JavaScript
转义序列替换所有特殊字符。
例如,假设一个CSP
文件定义了一个客户端JavaScript
函数,该函数在警报框中显示一条消息,该消息由服务器端变量x
的值指定。x
的值被转换成一个JavaScript
加引号的字符串:
<script language="JavaScript"> function showMessage() { alert(#(..QuoteJS(x))#); } </script> 复制代码
如果x
的值是“Don't press this button!”
,然后将以下文本发送到HTTP
客户端:
<script language="JavaScript"> function showMessage() { alert('Don\'t press this button!'); } </script>