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

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

如果我使用 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">

【问题讨论】:

标签: jquery ajax textarea xss html-entities


【解决方案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 只计算 > 这会导致错误的标签放置等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2020-07-30
    • 1970-01-01
    • 2020-03-28
    • 2011-03-05
    • 2014-02-19
    • 2014-05-31
    • 2011-10-27
    相关资源
    最近更新 更多