Возможный дубликат:
Лучший способ остановить 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);
Это очень уязвимо для 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 в качестве вашего запроса!