zl程序教程

您现在的位置是:首页 >  其他

当前栏目

第三十一章 使用 CSP 进行基于标签的开发 - 转义和引用HTTP输出

输出HTTP开发 基于 进行 标签 引用 转义
2023-09-11 14:15:37 时间

第三十一章 使用 CSP 进行基于标签的开发 - 转义和引用HTTP输出

转义和引用HTTP输出

要创建HTML中使用的特殊字符的文字显示,必须使用转义序列。
例如,要在HTML中显示>(右尖括号)字符(它在HTML中具有特殊含义),必须使用字符序列:>对其进行转义。 CSP文档的不同部分可能使用不同的转义规则(例如HTMLJavaScript`)。

%CSP.Page 提供了许多转义和引用方法:

  • 转义方法接受一个字符串作为输入,并返回一个所有特殊字符都替换为适当转义序列的字符串。
  • 引用方法接受一个字符串作为输入并返回一个带引号的字符串(即带有适当的括引号)。
    加引号的字符串还将所有特殊字符替换为转义序列。
  • 对于每个转义方法,都有一个相应的反转义方法,它将转义序列替换为纯文本。

使用EscapeHTML转义HTML

%CSP.Page 可以用相应的HTML转义序列替换字符。

#(..EscapeHTML(x))#

如果x的值<mytag>,则向HTTP客户端发送以下转义文本:

&lt;mytag&gt;

同样,当你发送HTML属性的值时,转义是必要的:

<input type="BUTTON" value="#(..EscapeHTML(value))#">

如果value的值是<ABC>,这将导致以下文本被发送到HTTP客户端,其中左右两个尖括号被替换为它们的等效字符序列:<并且>分别是:

<input type="BUTTON" value="&lt;ABC&gt;">

""(引号)放在#()#指令的两边,使生成的HTML属性值带引号。

当从数据库向HTTP客户端发送输出时,对其进行转义是一个很好的做法。例如,考虑以下将用户名写入网页的表达式(假设user是对具有name属性的对象的引用):

User name: #(user.Name)#

如果应用程序允许用户将他们的名字输入到数据库中,会发现一个恶意用户可能会输入一个包含HTML命令的名字。如果将下面的内容写到一个没有HTML转义序列的HTTP客户端,该页面可能会出现意外的行为。

Set user.Name = "<input type=button οnclick=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>