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

时间:2013-08-20 06:24:32

标签: jquery ajax textarea xss html-entities

我正在使用jQuery ajax调用来设置textarea的值。

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

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

会发生什么?

.load()有效,但我无法使用它。在我使用BBcode函数后,load()就会中断(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">

2 个答案:

答案 0 :(得分:0)

您是否尝试过htmlspecialchars()而不是htmlentities?

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

答案 1 :(得分:0)

现在,看起来没有简单的方法来显示&gt; &LT;使用val()或value =。

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

我能找到的唯一解决方案是用以下内容替换整个textarea:

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

重写bbcode函数也不会起作用,因为.html()。length似乎与.val()。length不同。而.val()。长度计数&gt;作为其实体&amp; g t; .html()。长度仅计数&gt;这会导致错误的标签展示位置等。