如何在阻止XSS,SQL注入和相关攻击的同时,允许将代码片段输入编辑器(如stackoverflow那样),如FCKeditor或任何其他编辑器。

有帮助吗?

解决方案

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

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

在XSS保护上,由于这种原因,我过去常常使用正则表达式来清理输入,但是由于难以同时允许链接之类的东西同时删除危险代码,因此不再使用该方法。我作为替代方案转移到XSLT。同样,您执行XSL转换的方式可能因您的平台而异。我前段时间写了关于如何做到这一点的一篇关于ColdFusion开发者期刊的文章,其中包括您可以使用的样板XSL表,并说明如何制作使用本机XmlTransform()函数与CF一起工作。

我选择转移到XSLT的原因有两个。

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

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

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

其他提示

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

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

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

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

我不明白为什么人们会说<!>使用存储过程!<!>存储过程没有提供针对SQL注入的特殊保护。如果将非转义值插入SQL字符串并执行结果,则易受SQL注入攻击。如果您在应用程序代码中执行此操作与在存储过程中执行它无关紧要。

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

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

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

我会说可以替换所有<!> lt;通过<!> amp; lt;等等(例如,在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注入,您可以用<!>“innofensive <!>”替换所有'和\字符;等价,如\'和\,以便以下C行

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top