2012-06-28 4 views
1

Я начинаю очень простой сайт, который использует одну строчную форму для отправки в базу данных, а затем повторяет эхо-значение $comment переменной на странице. Я не знаю PDO, но я хочу узнать, действительно ли это нужно для чего-то такого простого.Я беспокоюсь о SQL-инъекциях. Это безопасно?

else 
mysql_query("INSERT INTO posts (postid, post_content) 
VALUES ('', '$comment <br />')"); 
} 
mysql_close($con); 

Над этим кодом у меня есть основные команды strpos, чтобы блокировать некоторые из вещей, которые я не хочу опубликовать.

Я буду испытывать любые проблемы с инъекциями по дороге от того, как я это делаю?

+4

начать изучать подготовленные заявления с помощью 'PDO', пока вы на нем – tradyblix

+0

PDO может выглядеть запугивающим в начале. Но делать базовые запросы - это в значительной степени такое же количество кодовых объявлений mysqli.Плюс, когда вам нужны/нужны более продвинутые функции, то есть там, где он сияет над mysqli. – Kris

ответ

3

Нет, это не безопасно, вам нужно использовать mysql_real_escape_string, чтобы избежать $comment.

Но PDO ничего сложного и сделать ваш код сильнее.

// create the connection. something like mysql_connect/mysql_error 
try { 
    $dbh = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

// create the prepared statement. 
$stmt = $dbh->prepare("INSERT INTO posts (postid, post_content) VALUES (?, ?)"); 
// execute it with parameters. 
$stmt->execute(array('', $comment.'<br>')); 
+1

+1 для демонстрации PDO и того, как легко использовать. – Herbert

3

Да, это опасно. Все, что нужно сделать, это поставить одну цитату, а затем код SQL, который они хотят после. Используйте $ comment = mysql_real_escape_string ($ comment) перед этим оператором, если вы хотите исправить его старым способом или использовать подготовленные заявления PDO как более новый способ. Вот простой пример из documentation:

<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?> 
+0

Я видел это и читал об этом раньше. Что такое mysql_real_escape_string(); делать? – CodingNoob

+0

Есть определенные символы (например, одиночная кавычка для одного), которые необходимо экранировать, чтобы они превратили все «в» или «» в зависимости от используемой версии экранирования. [документация] (http://php.net/manual/en/function.mysql-real-escape-string.php) – hackartist

0

Это восприимчивым к SQL инъекции, как ваш $ комментарий ввод от пользователя они могут также ввести некоторые команды SQL и ваш PHP код будет в конечном итоге выполнение такой же.

Учитывать значение $ comment значение 'TRUNCATE TABLE USERS;' Таблица USERS может быть любой, что может иметь решающее значение для вашего приложения.

В PHP Я считаю, что вы защищаете от SQL-инъекции, используя mysql_real_escape_string(). Прочитайте это.

См этот документ для деталей Абт SQL innjection: https://docs.google.com/document/d/1rO_LCBKJY0puvRhPhAfTD2iNVPfR4e9KiKDpDE2enMI/edit?pli=1

0

Связывание формы входных данных с запросом mysql является идеальным решением для SQL-инъекции. Для этого используйте метод binaParam.

0

Нет, судя только кодом, который вы разместили здесь, вы не защищены от инъекций SQL. Вот простой пример для $comment:

'), (null, (select concat(user(),':',password) s from mysql.user where concat(user,'@',host)=user() LIMIT 1) -- 

Это добавит еще одну строку, содержащую учетные данные текущего пользователя. С LOAD_FILE он также мог читать файлы из вашей файловой системы. Он может также записывать произвольные файлы в файловой системе:

' + (select '<?php echo "Hello, World!";' into dumpfile '/path/to/your/document_root/foobar.php')) -- 

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

Таким образом, вы обязательно должны protect yourself against SQL injections, в результате чего автоматическое экранирование с использованием подготовленных операторов или параметризованных операторов предпочтительнее, чем при ручном экранировании с использованием таких функций, как mysql_real_escape_string.

Смежные вопросы