Является ли это безопасным способом вставки данных формы в базу данных 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));
Ответы
Ответ 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
я предлагаю использовать подготовленные операторы.
Ответ 3
Используйте 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
как ваш запрос!