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 调用来设置文本区域的值。
如果我使用 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">
【问题讨论】:
使用此功能后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的区别
htmlentities() 和 mysql_real_escape_string() 是不是足以清理 PHP 中的用户输入? [复制]