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

jpj*_*pjp 7 php mysql security xss

function sanitizeString($var)
{
    $var = stripslashes($var);
    $var = htmlentities($var);
    $var = strip_tags($var);
    return $var;
}

function sanitizeMySQL($var)
{
    $var = mysql_real_escape_string($var);
    $var = sanitizeString($var);
    return $var;
}
Run Code Online (Sandbox Code Playgroud)

我从一本书中得到了这两个函数,作者说通过使用这两个函数,我可以对XSS(第一个函数)和sql注入(第二个函数)更加安全.这些都是必要的吗?

另外,对于清理,我使用预准备语句来防止sql注入.

我会像这样使用它:

$variable = sanitizeString($_POST['user_input']);
$variable = sanitizeMySQL($_POST['user_input']);
Run Code Online (Sandbox Code Playgroud)

编辑:摆脱第一个函数的strip_tags,因为它没有做任何事情.使用这两个功能是否足以阻止大多数攻击并且对公共站点没问题?

Gum*_*mbo 10

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

仅举两个奇怪之处:

此外:通常,再次保护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'])).'")').'" …'
Run Code Online (Sandbox Code Playgroud)

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

… onclick="window.open(&quot;http://example.com/&quot;%22bar%2Fbaz%22&quot;&quot;)" …
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*chu 5

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

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

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

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

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