Подтвердить что ты не робот

Является ли это безопасным способом вставки данных формы в базу данных MySQL?

Возможный дубликат:
[Как я могу предотвратить внедрение SQL в PHP?] (Как я могу предотвратить внедрение SQL в PHP?)

Вот пример на w3schools.org:

HTML-форма:

<html>
    <body>
        <form action="insert.php" method="post">
            Firstname: <input type="text" name="firstname" />
            Lastname: <input type="text" name="lastname" />
            Age: <input type="text" name="age" />
            <input type="submit" />
        </form>
    </body>
</html>

Файл insert.php:

<?php
    $con = mysql_connect("localhost","peter","abc123");
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }

    mysql_select_db("my_db", $con);

    $sql="INSERT INTO Persons (FirstName, LastName, Age)
          VALUES
          ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";

    if (!mysql_query($sql,$con))
    {
        die('Error: ' . mysql_error());
    }
    echo "1 record added";

    mysql_close($con)
?>

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

Я посмотрел на Как я могу предотвратить внедрение SQL в PHP? , но я немного запутался, как это изменить:

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array(':column' => $unsafeValue));

Предполагая, что я использовал вышеупомянутую форму HTML и хотел вставить данные из поля 'firstname' в базу данных, должен ли он выглядеть так? Или я должен изменить column?

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array(':column' => $firstname));
4b9b3361

Ответ 1

Приведенный вами пример вставляет переменные записи в базу данных, не анализируя их на предмет злого ввода пользователя. Используйте приведение типов, функции экранирования/фильтрации, подготовленные операторы и т.д., Прежде чем использовать их для взаимодействия с вашей БД.

Общее правило - никогда не доверять пользовательскому вводу. КОГДА-ЛИБО!

Проверьте: лучший способ остановить SQL-инъекцию в PHP

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

$stmt = $db->prepare('INSERT INTO Persons (FirstName, LastName, Age) VALUES (:first_name, :last_name, :age)');

$stmt->execute(array(':first_name' => $first_name,':last_name' => $last_name, ':age' => $age));

Если вы просто хотите вставить один столбец в записи, как вы просили, синтаксис будет следующим:

$stmt = $db->prepare('INSERT INTO Persons (FirstName) VALUES (:first_name)');

$stmt->execute(':first_name', $first_name);

Ответ 2

NO.

Это очень уязвимо для атак SQL инъекций.

Вместо использования mysql_real_escape_string я предлагаю использовать подготовленные операторы.

Ответ 4

$magic_quotes_active = get_magic_quotes_gpc();
$real_escape_string_exists = function_exists('mysql_real_escape_string');

function escape_value($sql) {
    if ($real_escape_string_exists) {
        if($magic_quotes_active) {
            $sql = stripslashes($sql);
        }
        $sql = mysql_real_escape_string($sql);
    } else {
        if(!$magic_quotes_active) {
            $sql = addslashes($sql);
        }
    }
    return $sql;
}

Это считается очень безопасным способом вставить материал в базу данных. Используйте возвращенный $sql как ваш запрос!