【问题标题】:Is it secure to allow users add raw HTML text to QTextEdit?允许用户将原始 HTML 文本添加到 QTextEdit 是否安全?
【发布时间】:2014-07-17 14:27:15
【问题描述】:

我有一个嵌入了用户可以发布的小聊天窗口的应用程序。我正在使用这个函数将文本添加为​​ html:http://qt-project.org/doc/qt-4.8/qtextedit.html#html-prop,因为我使用了一些颜色格式,但我发现如果用户使用 html 标签,比如<b>,它们也在工作(这是有道理的)。

我当然可以对这些进行编码,但我正在测试它是否存在漏洞,但我找不到任何漏洞。当我创建一个链接时,它是不可点击的,图像和类似的元素只会显示一些图标。我可以安全地保留此选项,还是让用户在聊天中添加 html 代码有任何潜在风险?我不知道这个QTextEdit 是否能够处理所有 html 或只是一些基本的文本格式标记,在这种情况下,它会很好。

编辑:这里是支持的标签列表http://qt-project.org/doc/qt-4.8/richtext-html-subset.html 但是我不是专家来决定其中一些是否会有些危险

【问题讨论】:

    标签: html qt


    【解决方案1】:

    理论上它是安全的(因为有很多forbidden attributes(即它们支持非常小的HTML子集),许多聪明人考虑过安全问题等等),但实际上几乎不可能实现如此复杂系统没有安全问题。

    因此,允许用户的 HTML 在聊天窗口中进行可视化并不太危险。但是在关键应用程序(航空等)中允许用户的 HTML 听起来是个非常糟糕的主意。

    【讨论】:

      【解决方案2】:

      鉴于我无法确定所有这些标签是否都是安全的,我创建了这个简单的函数,它将对除可由用户指定的安全标签之外的所有实体进行编码:

      QString SafeHtml(QString text)
      {
          QString result;
          QStringList AllowedTags;
          AllowedTags << "b" << "big" << "font" << "i" << "u";
          // we split the text by starting element
          QStringList Part = text.split('<');
          bool FirstPart = true;
          foreach (QString part, Part)
          {
              // split removes the symbol we use to split by so we need to return it back there
              if (FirstPart)
                  FirstPart = false;
              else
                  part = "<" + part;
              // if there is no closing we don't want to render this tag
              if (!part.contains(">"))
              {
                  result += part.toHtmlEscaped();
                  continue;
              }
              // now we need to find what tag it is
              QString tag = part.mid(1, part.indexOf(">") - 1);
              if (tag.startsWith("/"))
                  tag = tag.mid(1);
              if (tag.contains(" "))
              {
                  // this is some composite tag
                  tag = tag.mid(0, tag.indexOf(" "));
              }
              if (!AllowedTags.contains(tag))
                  part = part.toHtmlEscaped();
              result += part;
          }
      
          return result;
      }
      

      虽然它不处理未关闭的 html 标签,所以如果有人只添加 &lt;b&gt; 它可能会将所有剩余的文本变为粗体等。

      【讨论】:

        【解决方案3】:

        只要您在服务器端处理任何不良数据,您应该可以接受。问题是事情何时到达服务器以及服务器将如何处理它。您必须进行设置以处理代码注入、sql 注入和跨域攻击。确保对恶意脚本进行错误检查。除此之外,很多不同的 cms 系统都使用这样的编辑器。

        【讨论】:

        • 这个问题与网络服务器和 CMS 无关。这个问题是关于 Qt 和使用 HTML 来设置小部件上的文本/背景/...的样式。
        • 原始问题中未指定。
        猜你喜欢
        • 2021-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多