3

如何在防止 XSS、SQL 注入和相关攻击的同时允许将代码片段输入到 FCKeditor 或任何其他编辑器之类的编辑器中(就像 stackoverflow 一样)。

4

4 回答 4

3

这里的部分问题是您希望允许某些类型的 HTML,对吗?以链接为例。但是您只需要清理那些可能包含 XSS 攻击的 HTML 标记,例如脚本标记,甚至事件处理程序属性或 href 或其他以“javascript:”开头的属性。因此,您的问题的完整答案需要比“替换特殊字符”更复杂,因为这不允许链接。

防止 SQL 注入可能在某种程度上取决于您的平台选择。我首选的 Web 平台具有用于参数化查询的内置语法,这将主要防止 SQL 注入(称为 cfqueryparam)。如果您使用 PHP 和 MySQL,则有一个类似的本机 mysql_escape() 函数。(我不确定 PHP 函数在技术上会创建参数化查询,但到目前为止,它在防止 sql 注入尝试方面对我来说效果很好,因为我已经看到一些安全地存储在数据库中。)

在 XSS 保护方面,出于这种原因,我曾经使用正则表达式来清理输入,但后来因为在允许链接等内容同时删除危险代码方面存在困难,因此不再使用该方法。作为替代方案,我转向的是 XSLT。同样,您执行 XSL 转换的方式可能因您的平台而异。不久前,我为 ColdFusion Developer's Journal 写了一篇关于如何执行此操作的文章,其中包括您可以使用的样板 XSL 表,并展示了如何使用原生 XmlTransform() 函数使其与 CF 一起工作。

为此我选择迁移到 XSLT 的原因有两个。

首先验证输入是否是格式良好的 XML,从而消除了使用某些字符串连接技巧进行 XSS 攻击的可能性。

其次,使用 XSL 和 XPath 选择器比使用正则表达式更容易操作 XHTML 数据包,因为与为原始字符串操作设计的正则表达式相比,它们是专门为处理结构化 XML 文档而设计的。所以它更干净,更容易,我犯错误的可能性更小,如果我发现我犯了错误,更容易修复。

此外,当我测试它们时,我发现像 CKEditor(他删除了 F)这样的 WYSIWYG 编辑器保留了格式良好的 XML,因此您不必担心这是一个潜在问题。

于 2009-01-02T20:16:37.570 回答
2

相同的规则适用于保护: 过滤输入,转义输出。

在输入包含代码的情况下,过滤只是意味着字符串必须包含可打印的字符,并且可能您有长度限制。

将文本存储到数据库中时,要么使用查询参数,要么对字符串进行转义,以确保您没有创建 SQL 注入漏洞的字符。代码可能包含更多的符号和非字母字符,但是关于 SQL 注入,您必须注意的那些与普通文本相同。

不要试图复制正确的转义函数。大多数数据库库已经包含一个函数,该函数对所有需要转义的字符进行正确的转义(例如,这可能是特定于数据库的)。它还应该处理字符集的特殊问题。只需使用您的库提供的功能。

我不明白为什么人们说“使用存储过程!” 存储过程没有针对 SQL 注入提供特殊保护。如果您将未转义的值插入 SQL 字符串并执行结果,这很容易受到 SQL 注入的攻击。无论您是在应用程序代码中还是在存储过程中执行此操作都没有关系。

输出到 Web 演示文稿时,转义 HTML 特殊字符,就像处理任何文本一样。

于 2009-01-02T19:46:47.847 回答
1

防止 SQL 注入攻击的最佳方法是确保在进行数据库调用时使用参数化查询或存储过程。通常,我还建议执行一些基本的输入清理,但由于您需要接受用户的代码,这可能不是一个选项。

另一方面(在将用户的输入呈现到浏览器时),对数据进行 HTML 编码将导致任何恶意 JavaScript 等被呈现为文字文本,而不是在客户端的浏览器中执行。任何体面的 Web 应用服务器框架都应该具备这种能力。

于 2009-01-02T19:42:06.483 回答
0

我会说可以将所有 < 替换为 < 等(例如,在 PHP 上使用 htmlentities),然后选择带有某种白名单的安全标签。问题是白名单可能有点过于严格。

这是一个PHP示例

$code = getTheCodeSnippet();
$code = htmlentities($code);
$code = str_ireplace("&lt;br&gt;", "<br>", $code); //example to whitelist <br> tags
//One could also use Regular expressions for these tags

为防止 SQL 注入,您可以将所有 ' 和 \ 字符替换为“无害的”等价物,如 \' 和 \,以便以下 C 行

#include <stdio.h>//'); Some SQL command--

在数据库中不会有任何负面结果。

于 2009-01-02T19:45:28.270 回答