我遵循WP的延迟转义原则,但我不确定在处理ajax请求时何时转义HTML特殊字符。
注意,据我所知,在使用jQuery将数据设置到元素时.text()
方法,或使用createTextNode()`方法,它会自动转义文本内容。所以这个问题不适用于使用这些方法。
将文本内容设置为具有innerHTML属性或jQuery的元素时。html()方法在ajax请求之后,是用js转义文本内容更好,还是用js转义服务器端的文本内容更好esc_html()
?
这里有两个例子,我不知道最好的是什么:
在发送到客户端之前退出服务器端:
// PHP
// Final stage of processing the ajax request (server side).
echo esc_html($text);
die();
//JS (jQuery)
// Final stage of a JS ajax request
success: function(response) {
$(\'.example\').html(\'<div class="example">\' + response + \'</div>\'); // The response is already escaped
}
或者在ajax请求成功后使用JS转义:
// PHP
// Final stage of processing the ajax request (server side).
echo $text;
die();
//JS (jQuery)
/**
* Example of my js html escape function
*/
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/\'/g, "'");
}
//Final stage of a JS ajax request
success: function(response) {
// Escape the untrusted data
$(\'.example\').html(\'<div class="example">\' + escapeHtml(response) + \'</div>\'); // The response needs to be escaped
}
感谢您的帮助。
最合适的回答,由SO网友:Mark Kaplun 整理而成
If it is not HTML, it does not need HTML escaping, if it is not JS, it does not need JS escaping.
所有转义都是基于上下文的。一般来说,您应该避免发送;“文本”;响应并重点发送以下数据:;“已转换”;直接通过domapi或jQuery提供的迂回方式进入相关的DOM结构。(换句话说,ajax响应应该针对机器,让终端机器将其转换为人类可读的内容)。
还有一些情况下,在响应中添加完整的HTML文本更方便。如果您朝这个方向走,转义应该与您在浏览器端如何处理它相关。jQuery的html()
需要有效的HTML,因此必须转义生成的HTML的文本部分。DOM API可能更宽容,因为它取决于上下文;“了解”;什么是HTML标记,什么是文本。
无论如何,我想不出任何一个例子,在其中,您必须在浏览器端进行转义。如果您陷入这种情况,您可能使用了错误的DOM/jQuery API。
直接对您的样本进行评论。第一个是错误的,因为如果文本包含HTML标记,您将逃避太多。