1

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

基本原理:选择要显示的数据可能需要很长时间。为了记录所采取的步骤,提供了一个textarea(不包含form),用户可以编写不应该传输到服务器的任意文本。初始文本是静态的,例如一组简短的说明如何使用该字段,因此攻击者没有(明显的)可能为该文本区域构造一个包含恶意 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 元素并利用自己的地狱。
  • 我想不出这会带来安全风险的情况,但一种不安的感觉仍然存在……

注意:问题不在于此解决方案的优雅性或任何内联编辑更舒适的库,而纯粹是关于可想象的安全风险 - 如果有的话。

4

3 回答 3

2

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

与询问密码相比,它对用户来说可能看起来不那么可疑;但除非作为有针对性的攻击,否则它不会起作用,因为如果将其发布在像论坛这样的公共场所,它可能会很快被标记。


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


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


为了在不丢失 HTML 功能的情况下保护输入,您可以通过将诸如stackoverflow之类的代码移植到 javascript 来过滤 HTML(或者很好地要求获得实时预览中使用的 javascript 版本的许可证)。

于 2009-02-27T12:00:12.497 回答
2

description.innerHTML = editor.value;

虽然确实不太可能说服用户通过键入合适的 <script> 标签来妥协自己,但真的有必要让他们键入 HTML 吗?如何简单地转义值:

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

description.innerHTML= escapeMultiline(editor.value);

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

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

于 2009-02-27T12:13:01.267 回答
0

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

/阿尔贝托

于 2013-07-18T17:14:11.860 回答