Правильно ли я вставляю данные (php + MySQLi)?

0

Является ли метод, который я использую для вставки данных с помощью MySQLi? Он работает, но достаточно ли он безопасен?

    $login = stripslashes($login);
    $login = htmlspecialchars($login);
    $password = stripslashes($password);
    $password = htmlspecialchars($password);

    $login = trim($login);
    $password = trim($password);


 $result2=mysqli_query($db,"INSERT INTO users (login,password) VALUES('$login','$password')");
  • 2
    Очистка входных данных - это хороший шаг, с использованием подготовленных утверждений она «безопаснее»: php.net/manual/en/mysqli.quickstart.prepared-statements.php
  • 2
    Используйте параметризованные операторы, как это предусмотрено подготовленными операторами. Тогда библиотека заботится о правильной обработке данных.
Показать ещё 1 комментарий
Теги:
security
mysqli

3 ответа

5
Лучший ответ

Всякий раз, когда вы взаимодействуете с базой данных внутри php вам нужно иметь в виду контрольный список:

  1. Настройте соединение правильно, например, убедитесь, что при использовании pdo установите режим ошибки в исключение и скажите ему не подражать подготовленным операторам. Для установки атрибутов подключения используйте следующий код:

    $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
  2. Используйте готовые инструкции и параметризованные запросы при извлечении данных.

Использование mysqli:

    $stment = $dbConnection->prepare('SELECT * FROM users WHERE name = ?');
    $stment->bind_param('s', $name);

    $stment->execute();

    $result = $stment->get_result();
    while ($row = $result->fetch_assoc()) {
        // do something with $row
    }

Использование PDO:

    $stment = $pdo->prepare('SELECT * FROM users WHERE name = :name');

    $stment->execute(array('name' => $name));

    foreach ($stment as $row) {
        // do something with $row
    }

Идея готовых запросов очень проста - запрос и данные отправляются на SQL-сервер отдельно. Когда мы отправляем запрос базы данных вместе с данными, данные могут использоваться для выполнения потенциально вредоносного запроса. Для получения дополнительной информации см. Этот ответ.

Если вы хотите динамически добавлять идентификаторы и ключевые слова синтаксиса, используйте белый список. В основном это проверка того, является ли пользовательский ввод ожидаемым, например:

$orders  = array("name","price","qty"); //field names
$key     = array_search($_GET['sort'],$orders)); // see if we have such a name
$orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :)
$query   = "SELECT * FROM 'table' ORDER BY $orderby"; //value is safe
  1. Отредактируйте ввод от пользователя перед вставкой/поиском базы данных с помощью таких функций, как mysqli_real_escape_string, если вы mysqli_real_escape_string то не используете подготовленные операторы.
  2. Убедитесь, что вы хорошо справляетесь с исключениями и ошибками.
0

Используйте PDO. Считается более безопасным, чем устаревший MySqli.

  • 0
    Как PDO более безопасен, чем MySQLi?
  • 0
    Ну, это было бы длительное обсуждение и, я думаю, привнесло бы субъективность в сферу этого вопроса. Смотрите ссылки, данные Дэвидом в комментариях к вопросу.
Показать ещё 6 комментариев
-2

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

function cleanInputs($data) {
    $clean_input = array();
    if (is_array($data)) {
        foreach($data as $k = > $v) {
            $clean_input[$k] = cleanInputs($v);
        }
    } else {
        if (get_magic_quotes_gpc()) {
            $data = trim(stripslashes($data));
        }
        $data = strip_tags($data);
        $clean_input = trim($data);
    }
    return $clean_input;
}

Все зависит от требования, которое вы можете даже модифицировать определение или логику соответственно.

  • 0
    Как именно это предотвращает инъекции SQL?
  • 0
    Во-первых, эта функция не делает строки безопасными для использования в запросах. Во-вторых, он удалит части строки, если строка содержит знак < , что дает очень неожиданные результаты.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню