jQuery ajax 和 htmlentities,在文本字段上使用 .val()

Posted

技术标签:

【中文标题】jQuery ajax 和 htmlentities,在文本字段上使用 .val()【英文标题】:jQuery ajax and htmlentities, using .val() on a textfield 【发布时间】:2013-08-22 02:31:32 【问题描述】:

我正在使用 jQuery ajax 调用来设置文本区域的值。

如果我使用 phphtmlentities() 然后使用 jquerys $(textarea).val() 它不会显示字符而是显示实体。

没有 htmlentities() 一切看起来都很好。使用 val() 时没有 XSS,但如果在没有 jquery 的情况下访问脚本,则当然容易受到攻击。

会发生什么?

.load() 有效,但我不能使用它。 load() 只是在我使用 BBcodefunctions 后中断(DOM 不会更新 textarea,在 Firebug 中一切看起来都应该如此)

使用 val() 后,html() 中断。

为什么?

jQuery 代码:

$.ajax( 
  type: 'GET', 
  encoding:"UTF-8", 
  dataType:"html",  
  contentType: "text/plain; 
  charset=UTF-8", 
  url: "/quote.php?id=1",
  context: document.body 
).done(function(data)  $('textarea').val(data); ); 

PHP 代码:

htmlentities($nonEncodedRawText, ENT_QUOTES, 'UTF-8')

文本框中的结果:

</textarea><script type="text/javascript">

直接访问的结果:

</textarea><script type="text/javascript">

【问题讨论】:

使用此功能后aktuell.de.selfhtml.org/artikel/javascript/bbcode/#beispielJquerys .html() 方法中断。它做了它应该做的事情并为元素设置文本,但 dom 没有更新,新内容仍然不可见,而旧内容仍然存在。 Firebug 显示了更改。为什么? 【参考方案1】:

你试过用 htmlspecialchars() 代替 htmlentities 吗?

这是另一个有类似问题的页面:Escaping output safely for both html and input fields

【讨论】:

htmlspecialchars 不会改变什么。将所有内容加载到临时 div 并通过 div.html() = 相同的结果获取。【参考方案2】:

现在,使用 val() 或 value = 时似乎没有简单的方法来显示 >

.html() 可以工作,但只要 .val() 或 value = 被调用 .html() 就会中断。

我能找到的唯一解决方案是将整个 textarea 替换为:

$('textarea').replaceWith('<textarea>'+data+'</textarea>')

重写 bbcode 函数也不起作用,因为 .html().length 似乎与 .val().length 不同。而 .val().length 将 > 作为其实体 & g t ; .html().length 只计算 > 这会导致错误的标签放置等。

【讨论】:

以上是关于jQuery ajax 和 htmlentities,在文本字段上使用 .val()的主要内容,如果未能解决你的问题,请参考以下文章

PHP htmlentities 和 htmlspecialchars的区别

153-PHP htmlentities函数

htmlentities() 和 mysql_real_escape_string() 是不是足以清理 PHP 中的用户输入? [复制]

textarea 上的 nl2br 和 htmlentities

如何反转htmlentities()?

有啥 绕过 htmlentities 进行 xss 攻击的方法吗