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

Возможный дубликат:
Лучший способ остановить SQL Injection в 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) ?> 

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

EDIT: я посмотрел лучший способ остановить sql-injection в 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)); 

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

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

Проверьте: лучший способ остановить SQL Injection в 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); 

NO.

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

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

Используйте mysql_real_escape_string .

  $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 в качестве вашего запроса!