说实话,我认为这些函数的作者要么不知道XSS和SQL注入是什么,或者使用的函数到底是做什么的.
仅举两个奇怪之处:
使用stripslashes
after 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具有字符引用"
.并且不仅仅使用这些功能中的一个将允许打破上下文.
说实话,我认为这些函数的作者要么不知道XSS和SQL注入是什么,或者使用的函数到底是做什么的.
仅举两个奇怪之处:
使用stripslashes
after 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具有字符引用"
.并且不仅仅使用这些功能中的一个将允许打破上下文.
确实如此,但这种逃避水平可能并不适合所有情况.如果要将HTML存储在数据库中该怎么办?
最佳实践规定,您应该在显示它们时将其转义,而不是在接收值时转义.这允许您考虑显示来自数据库的HTML和来自数据库的非HTML,并且无论如何它确实是这种代码在逻辑上属于的地方.
清理传出HTML的另一个优点是可以发现新的攻击媒介,在这种情况下,对传入的HTML进行清理将不会对数据库中已有的值执行任何操作,而传出的清理将追溯应用而无需执行任何特殊操作
此外,请注意,strip_tags
在您的第一个函数可能没有任何影响,如果所有<
和>
已成为<
和>
.