Предотвращение инъекций PHP и MySQL - PullRequest
1 голос
/ 17 июня 2011

Я провел довольно много исследований и подготовок с моим кодом, чтобы попытаться предотвратить инъекции SQL, но я хотел обсудить то, в чем я не совсем уверен.

Я понимаю, что mysqli_real_escape_string не экранирует символы _ (подчеркивание) и% (проценты).Если я не использую какие-либо предложения LIKE в своих операторах SQL, это подвергает меня риску?

Ниже приведен пример, о котором мне интересно поговорить.Вот скрипт входа в систему, который я использую.Я хочу убедиться, что я не открываю себя для любых уязвимостей инъекции здесь.Ваше понимание и отзывы будут с благодарностью.

// Initiate login process if the mode is set to login
if ($_REQUEST['mode'] == "login") {

    // Open shared database connection
    $cxn = connectDb();

    // Escape characters to help prevent a SQL injection attack
    $username = mysqli_real_escape_string($cxn, $_POST['user']);

    // Convert submitted password to hashed value using 
    // custom password hashing function
    $password = custompwhash($_POST['pass']);

    // Execute SQL statement to determine if the credentials provided 
    // match a valid user
    $sql = "SELECT count(*) as countOK FROM user_def WHERE ".
            "username = '$username' AND password = '$password'";
    $result = mysqli_query($cxn,$sql);
    $row = mysqli_fetch_array($result);
    extract($row);

    // If the username value submitted is null, throw and error
    if ($username == "") {
        die2("Please enter your username and try again.<br />");
        failedloginalert($username);
    }

    // If the password value submitted is null, throw and error
    else if ($password == "") {
        die2("Please enter your password and try again.<br />");
        failedloginalert($username);
    }

    // If the credenetials provided match a valid user in the database, 
    // initate login
    else if ($countOK == '1') {    
        $sql2 = "INSERT INTO `user_activity` (`username`, `time`, `ip`)".
                " VALUES ('$username', NOW(), '{$_SERVER['REMOTE_ADDR']}')";
        $result2 = mysqli_query($cxn,$sql2);
        $_SESSION['auth'] = 1;
        $_SESSION['username'] = $username;

        // If the user does not need to be directed to a specific page, direct to home.php
        if (empty($_GET['page'])) {
            die2("<span style='color:#000;'>You have successfully logged in. <br /><br />
            Please click <a href=\"/admin/home.php\">here</a> if you are not automatically redirected.</span>
            <meta http-equiv='refresh' content='0;url=home.php'/>");
            die();
        }

        // Otherwise, if the user does need to be directed to a specific page, direct to the requested page
        else {
            $loginredirectpage = $_GET['page'];
            die2("<span style='color:#000;'>You have successfully logged in. <br /><br />
            Please click <a href=\"/admin/home.php\">here</a> if you are not automatically redirected.</span>
            <meta http-equiv='refresh' content='0;url=".$loginredirectpage."'/>");
            die();
        }
    }

    // Since the credenetials provided do not match a valid user in the database, throw an error
    else { 
        die2("The username or password you entered is invalid. Please try again. <br/><br/>If the problem persists, <a href=\"/user/resetpassword.php\" class=\"red\">reset your password</a>.");
        failedloginalert($username); 
    }
}

Ответы [ 2 ]

5 голосов
/ 17 июня 2011

Начните использовать PDO и Подготовленные операторы , и ваши проблемы с внедрением SQL исчезнут.

2 голосов
/ 17 июня 2011

Если я не использую какие-либо предложения LIKE в своих операторах SQL, это открывает для меня какой-либо риск?

Нет, это не так.= просто дает вам более точный ответ, чем LIKE

Внедрение SQL больше связано со знаком кавычки ' ", так как метод пытается добавить в строку запроса.Поэтому я бы сказал, что % и _ не создадут никакой угрозы безопасности, если вы отфильтруете все возможные кавычки.В этом случае mysqli_real_escape_string() может помочь.

PDO - это уровень абстракции, который помогает вам более эффективно работать с базами данных.Это может помочь вам с SQL-инъекцией, но я не рекомендую использовать его, если вы не создаете что-то большое, что требует большого взаимодействия с базой данных.

Итак, в заключение я хочу сказать, что ваш код выглядит хорошо (:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...