当前位置:  开发笔记 > 编程语言 > 正文

这两种功能是否过度杀菌?

如何解决《这两种功能是否过度杀菌?》经验,为你挑选了2个好方法。

说实话,我认为这些函数的作者要么不知道XSS和SQL注入是什么,或者使用的函数到底是做什么的.

仅举两个奇怪之处:

使用stripslashesafter mysql_real_escape_string删除添加的斜杠mysql_real_escape_string.

htmlentities替换聊天<>用于strip_tags识别标签的聊天.

此外:通常,再次保护XSS的功能不适合再次保护SQL注入,反之亦然.因为每种语言和语境都有自己需要处理的特殊字符.

我的建议是了解代码注入的原因和方式,以及如何防范它.了解您正在使用的语言,尤其是特殊字符以及如何逃避这些语言.


编辑    这里有一些(可能是奇怪的)示例:想象一下,您允许您的用户输入一些值,这些值应该用作您在onclick属性值中的某些JavaScript代码中使用的URI中的路径段.因此语言上下文如下所示:

HTML属性值

JavaScript字符串

URI路径段

并使其更有趣:您将此输入值存储在数据库中.

现在要将此输入值正确地存储到数据库中,您只需要对要将该值插入数据库语言(即SQL)的上下文使用正确的编码; 其余的并不重要(还).由于您要将其插入到SQL字符串声明中,因此上下文特殊字符是允许您更改该上下文的字符.至于字符串声明这些字符(尤其是)的",'以及\需要的字符转义.但正如已经说过的那样,准备好的语句可以帮助您完成所有工作,因此请使用它

既然您拥有数据库中的值,我们希望正确输出它们.在这里,我们从最里面到最外层的上下文,并在每个上下文中应用适当的编码:

对于URI路径段上下文,我们需要转义(至少)所有允许我们更改该上下文的字符; 在这种情况下/(保留当前路径段)?,和#(都保留URI路径上下文).我们可以用rawurlencode它.

对于JavaScript字符串背景下,我们需要照顾的",'\.我们可以用json_encode它(如果有的话).

对于HTML属性值,我们需要照顾&,",',和<.我们可以用htmlspecialchars它.

一切都在一起:

'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'

现在,如果$row['user-input']"bar/baz"输出为:

… onclick="window.open("http://example.com/"%22bar%2Fbaz%22"")" …

但是在这些背景下使用所有这些功能并不是一种矫枉过正.因为虽然上下文可能具有相似的特殊字符,但它们具有不同的转义序列.URI具有所谓的百分比编码,JavaScript具有转义序列\",HTML具有字符引用".并且不仅仅使用这些功能中的一个将允许打破上下文.



1> Gumbo..:

说实话,我认为这些函数的作者要么不知道XSS和SQL注入是什么,或者使用的函数到底是做什么的.

仅举两个奇怪之处:

使用stripslashesafter mysql_real_escape_string删除添加的斜杠mysql_real_escape_string.

htmlentities替换聊天<>用于strip_tags识别标签的聊天.

此外:通常,再次保护XSS的功能不适合再次保护SQL注入,反之亦然.因为每种语言和语境都有自己需要处理的特殊字符.

我的建议是了解代码注入的原因和方式,以及如何防范它.了解您正在使用的语言,尤其是特殊字符以及如何逃避这些语言.


编辑    这里有一些(可能是奇怪的)示例:想象一下,您允许您的用户输入一些值,这些值应该用作您在onclick属性值中的某些JavaScript代码中使用的URI中的路径段.因此语言上下文如下所示:

HTML属性值

JavaScript字符串

URI路径段

并使其更有趣:您将此输入值存储在数据库中.

现在要将此输入值正确地存储到数据库中,您只需要对要将该值插入数据库语言(即SQL)的上下文使用正确的编码; 其余的并不重要(还).由于您要将其插入到SQL字符串声明中,因此上下文特殊字符是允许您更改该上下文的字符.至于字符串声明这些字符(尤其是)的",'以及\需要的字符转义.但正如已经说过的那样,准备好的语句可以帮助您完成所有工作,因此请使用它

既然您拥有数据库中的值,我们希望正确输出它们.在这里,我们从最里面到最外层的上下文,并在每个上下文中应用适当的编码:

对于URI路径段上下文,我们需要转义(至少)所有允许我们更改该上下文的字符; 在这种情况下/(保留当前路径段)?,和#(都保留URI路径上下文).我们可以用rawurlencode它.

对于JavaScript字符串背景下,我们需要照顾的",'\.我们可以用json_encode它(如果有的话).

对于HTML属性值,我们需要照顾&,",',和<.我们可以用htmlspecialchars它.

一切都在一起:

'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'

现在,如果$row['user-input']"bar/baz"输出为:

… onclick="window.open("http://example.com/"%22bar%2Fbaz%22"")" …

但是在这些背景下使用所有这些功能并不是一种矫枉过正.因为虽然上下文可能具有相似的特殊字符,但它们具有不同的转义序列.URI具有所谓的百分比编码,JavaScript具有转义序列\",HTML具有字符引用".并且不仅仅使用这些功能中的一个将允许打破上下文.



2> Matchu..:

确实如此,但这种逃避水平可能并不适合所有情况.如果要将HTML存储在数据库中该怎么办?

最佳实践规定,您应该在显示它们时将其转义,而不是在接收值时转义.这允许您考虑显示来自数据库的HTML和来自数据库的非HTML,并且无论如何它确实是这种代码在逻辑上属于的地方.

清理传出HTML的另一个优点是可以发现新的攻击媒介,在这种情况下,对传入的HTML进行清理将不会对数据库中已有的值执行任何操作,而传出的清理将追溯应用而无需执行任何特殊操作

此外,请注意,strip_tags在您的第一个函数可能没有任何影响,如果所有<>已成为<>.


清理传出HTML的另一个优点是可以发现新的攻击媒介,在这种情况下,对传入的HTML进行清理将不会对数据库中已存在的值执行任何操作,而传出的清理将追溯应用而无需执行任何特殊操作.
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有