没有服务器参与的XSS - 这是危险的吗?

时间:2009-02-27 11:47:53

标签: javascript security xss

我们一直在讨论javascript中的仅客户端解决方案,它为站点访问者提供了注释页面以进行打印的方法,以及它在XSS或类似攻击向量方面的可利用性。

理由:选择要显示的数据有一个可能很长的过程。为了记录所采取的步骤,提供了一个 textarea (不包含表单),用户可以编写不应该传输到服务器的任意文本。初始文本是静态的,例如一小段说明如何使用此字段,以便攻击者没有(明显的)可能为此textarea构建包含恶意javascript的URL。

用户更改此文本后,会打印页面(及其注释)。一旦用户离开页面,便会丢失注释。

如果“散文错误太多”,这里有一些示例代码:

<span id="descriptionHeader">Description of the result</span>
<div id="description">
  <textarea id="descriptionEditor" rows="15" cols="80" type="text"
            ondblclick="replaceDescription()">
Edit this text to add a detailed description to this page.
Double click to this editing area to finish editing.
If you want to edit the text again, do a double click to the
description header.
You may use html (e.g. <br>) for formatting.
   </textarea>
 </div>
 <script type="text/javascript">
    var header = getElem("descriptionHeader");
    var editor = getElem("descriptionEditor");
    var description = getElem("description");

    function empty() {
    }

    function editDescription() {
        header.ondblclick = empty;
        editor.value = description.innerHTML;
        description.innerHTML = "";
        description.appendChild(editor);
    }

    function replaceDescription() {
        header.ondblclick = editDescription;
        description.removeChild(editor);
        description.innerHTML = editor.value;
    }
</script>

再次:

  • 文本从不在服务器端处理,只有静态描述(“如何使用”)从服务器发送到客户端,永远不会从客户端发送到服务器。
  • 用户可以随意添加javascript元素并利用他们自己的地狱。
  • 我想不出这会造成安全风险的情况,但是会有一种不安的感觉......

注意:问题不在于此解决方案的优雅程度,也不是任何可以更直接地编辑内联编辑的库,而是纯粹关于可以想象的安全风险 - 如果有的话。

3 个答案:

答案 0 :(得分:2)

社交工程攻击是可能的:要求用户(通过聊天或其他方式)复制粘贴应该是漂亮模板的内容以添加到页面中。

用户看起来可能不像要求密码;但是除了作为有针对性的攻击之外它不会起作用,因为如果在论坛这样的公共场所发布它可能会被标记得非常快。


我没有看到任何自动攻击,因为客户端和服务器之间没有数据来回传递。 所有攻击都是客户端攻击,除社交之外任何可以修改DOM或在页面上调用javascript的客户端攻击都不需要这样做来进行XSS。


请注意,如果社交工程clickjacking需要使用,通过在您的网站上使用多个iframe,将您的网站放在iframe下面,攻击者可以隐藏表单就是您的网站上的那个网站,但他们仍然需要欺骗用户将javascript代码复制粘贴到输入文本框中。


为了在不丢失HTML功能的情况下保护输入,您可以通过将代码(例如stackoverflow one)移植到javascript来过滤HTML(或者很好地询问实时预览中使用的javascript版本的许可证)。 / p>

答案 1 :(得分:2)

  

description.innerHTML = editor.value;

虽然通过键入合适的&lt; script&gt;确实相对不太可能说服用户妥协自己。标签,是否真的有必要允许他们输入HTML?如何简单地逃避价值:

function escapeMultiline(s) {
    return s.split('&').join('&amp;').split('<').join('&lt;').split('\n').join('<br />');
};

description.innerHTML= escapeMultiline(editor.value);

然后用户可以愉快地键入&lt;字符和换行符,不会被误解为HTML。

(当然,在回来的路上也有类似的去逃避。)

答案 2 :(得分:0)

不知道整个申请。我认为有可能攻击你的系统。如果他们可以从其他页面看到一些有效的js /其他调用,他们可以在此页面中注入该代码以尝试更改后端数据。如上所述,可能取决于您构建系统的方式。

/阿尔贝托