以下是在Codeigniter中XSS清理数据的方法:
global_xss_filtering
设置为TRUE
xss_clean()
xss_clean
作为验证规则TRUE
$this->input->post('something', TRUE)
可以在一个数据上使用全部或多个吗?
例如,即使数据已被$this->input->post('something', TRUE)
和global_xss_filtering
验证规则清除,我仍然可以使用xss_clean
吗?
答案 0 :(得分:8)
这不会伤到你,但绝对没有意义。
最终,你将达到全局XSS过滤器繁琐的程度。由于无法在没有大量攻击的情况下对每个控制器禁用它,并且无法访问原始$_REQUEST
数据,因此您需要全局禁用它。当您想要处理单个可信数据或非HTML输出且必须保持完整的数据时,就会发生这种情况。
将其用作表单验证规则是毫无意义的,也可能具有破坏性。想象一下,如果您每次键入<script>
时,该网站会被[removed]
替换为什么,将来无法将其恢复。再举一个例子,如果用户在他的密码中使用了一些“XSS”内容怎么办?您的应用程序将最终以静默方式更改输入。
只需在需要的地方使用XSS过滤器:在HTML输出上,可以执行javascript的地方。
答案 1 :(得分:4)
是。假设,您的输入为“A”。然后,假设您运行xss_clean以获取XSS安全内容:
B = xss_clean(A)
现在,让我说我再做一次以获得C:
C = css_clean(B)
现在,如果B
和C
不同,则必须表示B
有一些xss不安全的内容。这显然意味着xss_clean
因为没有正确清除A
而被打破。所以只要你假设函数返回xss-safe内容,你就可以了。
如果函数修改了xss-safe内容,那么可以做出的一个论点是什么?好吧,这会很糟糕,但仍然意味着功能被破坏了,但事实并非如此(仅仅根据我的经验说,因为没有看到它表现得像这样)。
我看到的唯一缺点是额外的处理开销,但是做两次就可以了(一次使用全局过滤,一次明确地执行,以防万一有人关闭全局过滤),并且非常好安全保障的间接费用。
另外,如果我可以添加,codeigniters xss clean并不真正解析HTML并删除标签和内容。它只是将<
和>
转换为<
和>
。所以考虑到这一点,我没有看到任何可能出错的东西。
答案 2 :(得分:0)
就我而言,使用xss_clean甚至一次都很糟糕。此例程尝试通过删除部件或更换部件来清理数据。它是有损的,并且不能保证在多次运行时返回相同的内容。它也很难预测,也不会总是采取适当的行动。考虑到它尝试对字符串进行清理所做的事情,在输入上使用它会产生巨大的性能损失。即使是最微小的输入(如a = b)也会导致xss_clean的一系列活动。
我想说你永远不应该使用xss_clean,但实际上我不能这么说。该系统适用于不熟悉如何安全管理用户内容的缺乏经验的开发人员。我是一位经验丰富的开发人员,所以我可以说我正在研究的任何项目都不应该使用xss_clean。事实上,对于使用较简单的缺乏经验的开发人员而言,腐败问题将不那么成问题,并且最终它可能会使他们的代码更安全,即使他们应该使自己的代码更安全,而不是依赖快速肮脏和廉价的黑客。另一方面,xss_clean并不能保证您的代码完全安全,并且可以通过给出错误的安全感来使事情变得更糟。建议你真正学习,以确保你完全理解你的代码所做的一切,这样你才能真正做到安全。 xss_clean不会补偿代码错误,它会补偿编码器错误。
理想情况下,xss_clean只想在输出上完成(并且希望用htmlentities等替换)但是大多数人都不会为此烦恼,因为它们只是通过过滤所有输入来破坏数据纯度而不是过滤输出(可输入一次但输出十次)。同样,一个没有纪律的开发人员可能不会在这十个输出案例中输入xss_clean。
但实际上,唯一真正合适的方法是在视图中显示页面上的所有内容时对其进行正确编码。先占编码的问题在于您存储可能编码不正确的数据,如果输入数据,您可以对数据进行双重编码,然后输出到表单中,然后再次输入。如果你想到像编辑框这样的东西,你可能会遇到一些严重的数据增长问题。并非所有卫生设施都会删除内容例如,如果您添加了抽头,则会添加内容。如果每次运行addslashes时内容都有斜杠,则会添加一个新的斜杠,使其增长。虽然您的数据很有可能最终嵌入到HTML中,但您也无法真正知道数据最终会在何处。突然之间,您得到了一个适用于以前数据的新要求,而且,由于您在存储之前对传入数据进行了应用和有损过滤,因此您已经搞砸了。在这种情况下,有损可能意味着您的工作在破坏数据库中的所有用户数据之后。您的数据通常是Web应用程序最有价值的东西。这是先发制人编码的一个大问题。如果您总是知道您的数据是纯粹的并且可以根据已经存在的情况逃脱它,则更容易使用,但如果您的数据可能处于任何状态,那么这可能是非常有问题的。过滤也可能导致一些偶然的逻辑中断。由于卫生处理可以删除内容,例如,可以使两个不匹配的字符串匹配。
输入中xss_clean的许多问题与magic_quotes的问题相同或相似: http://en.wikipedia.org/wiki/Magic_quotes
总结:您不应该使用它,而是阻止用户输入上的错误数据并在输出时正确转义。如果要清理用户数据,应该在客户端(浏览器,表单验证)中进行,以便用户可以看到它。你永远不应该有无形的数据更改。如果你必须运行xss_clean。你应该只在输出上运行一次。如果您要使用它来验证输入,请使用$ posted_data!== xss_clean($ posted_data)然后拒绝。