我之前使用PHP和AJAX编写了一个简单的聊天应用程序。在那里,一旦用户发送聊天,它首先进入php并从那里保存在数据库中。我在客户端使用AJAX定期查询数据库以获取新消息。那些我最终在展示的消息。
所以在我的客户端代码中,我有一个recMsg变量,我将其设置为
recMsg = recMsg + value['chattime'] + ' <@' + value['chatby'] + '> ' + value['chat'] + '\r\n';
其中value是具有值['chat']的数组,其中包含实际的聊天消息。
稍后我将文本区域设置如下
$('#received').val(recMsg + $('#received').val());
其中received是标签的id。 textarea的代码(当我在浏览器中查看源代码时)是
<textarea id="received" rows="15" cols="150"></textarea>
现在尝试xss攻击,我输入以下内容作为我的聊天
</textarea>
<script>
alert("Hi");
</script>
<textarea>
但它没有向我显示一个警告框,而是在textarea中显示完整的消息以及标签(它不会将任何标签视为特殊标签,只是将它们视为要显示的普通文本)。我尝试更改javascript,这样recMsg只是聊天消息,并尝试使用.innerHTML但没有成功。
所以我的问题是 1)攻击失败是因为我在渲染后改变了textarea的值吗?
2)是否可以以这种方式执行XSS。如何更改javascript代码以启用此攻击?
3)无关的问题 - 当我使用AJAX更改DOM元素时,如果我查看源代码,我看不到任何更改(例如,在我收到几个聊天后,textarea仍然是空的)。有这种情况的原因是什么?
感谢您的回复
答案 0 :(得分:4)
value
属性。浏览器会自动为您转义字符。想一想,当你在textarea上写字时,写</textarea>
并不会关闭它。通过javascript设置值是一样的。$('#received').val(recMsg + $('#received').val());
$('#received').html(recMsg + $('#received').html());
。这将更改textarea的innerHTML
属性。虽然我不确定它是否能正常工作。你必须尝试一下。F12
)。您将看到一个检查器,其中包含整个DOM树及其样式属性。