防止SQL注入

时间:2011-01-20 16:14:59

标签: php sql security sql-injection

我正在开发一个网站,我正在尝试保护连接部分。

我使用addslashes上的$login函数来停止SQL注入,但有些朋友告诉我安全性不够。但是,他们没有告诉我如何利用此漏洞。

我怎么能/你能破坏这段代码? 我该如何保护它?

<?php

    if ( isset($_POST) && (!empty($_POST['login'])) && (!empty($_POST['password'])) )
    {
        extract($_POST);
        $sql = "SELECT pseudo, sex, city, pwd FROM auth WHERE pseudo = '".addslashes($login)."'";
        $req = mysql_query($sql) or die('Erreur SQL');
        if (mysql_num_rows($req) > 0)
        {
            $data = mysql_fetch_assoc($req);
            if ($password == $data['pwd'])
            {
                $loginOK = true;
            }
        }
    }
    ?>

6 个答案:

答案 0 :(得分:14)

您应该使用mysql_real_escape_string来转义查询中的字符串输入参数。使用类型转换来清理数字参数和白名单以清理标识符。

在引用的PHP页面中,有一个以登录表单注入SQL的示例。

更好的解决方案是使用预准备语句,您可以使用PDOmysqli来执行此操作。

答案 1 :(得分:5)

您以明文存储密码!如果我看到一个,这是一个重大的安全问题。该怎么办:至少使用密码的(每用户)盐渍哈希,如图所示。 here

答案 2 :(得分:2)

使用:

mysql_real_escape_string($inputToClean);

答案 3 :(得分:2)

还有另一个巨大的安全漏洞 - extract。它可以避免输入几个字符,但会打开太多无法提及的漏洞,因为它会覆盖任何全局变量。

如果发布此内容会怎样?

$_POST {
    'login' => 'Admin',
    'loginOK' => 1
}

猜猜看,$ loginOK现在== 1,我将以管理员身份登录。

稍后为自己省去很多悲伤,只使用你想要使用的变量,而不是依赖extract的可怕黑客。

答案 4 :(得分:2)

除了使用addslashes()之外,这些是本代码中的一些随机问题:

  • isset($_POST)始终为TRUE,除非您从命令行运行它。您可以删除它。
  • empty()非常棘手。例如,如果$password = '0'empty($password) TRUE
  • 您可以执行此操作:if( isset($_POST['login']) && $_POST['login']!='' ){}
  • extract($_POST)是一个巨大的漏洞:任何人都可以从外部设置代码中的变量。
  • $password == $data['pwd']表示您将纯文本密码存储在数据库中。那是一种可怕的做法。谷歌的“盐渍密码”。
  • 您也可以$loginOK = $password == $data['pwd'];。你明白为什么吗? ; - )

答案 5 :(得分:1)

而不是addslashes您应该使用mysql_real_escape_string