1

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

如果我使用 php 的 htmlentities() 然后使用 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">
4

2 回答 2

0

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

这是另一个有类似问题的页面:为 html 和输入字段安全地转义输出

于 2013-08-20T06:34:18.697 回答
0

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

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

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

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

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

于 2013-08-20T10:25:55.803 回答