2015-06-01 8 views
0

У меня есть этот PHP PDO:Как безопасно вставить данные в MySQL с помощью PHP PDO

try {   
       $STH = $db->prepare("INSERT INTO racuni (napomene) VALUES (:12)"); 

       $STH->bindParam(':12', $_POST['napomena'], PDO::PARAM_STR); 



      } catch (PDOException $e) { 
       echo $e->getMessage(); 
      } 

и теперь, когда я пытаюсь добавить эти данные в MySQL:

<script>alert('heheheheheheh')</script> 

там нет струнного ускользает ? А в базе данных у меня есть те же данные: <script>alert('heheheheheheh')</script>

SO,

Что является лучшим, безопасный способ вставки данных в MySQL с помощью PHP PDO?

+1

PDO сам по себе безопасен. Поскольку он сам дезинфицирует значения –

+0

, но в базе данных mysql я получаю: поэтому, когда пользователю нужны эти данные, тогда скрипт был запущен – MonkeyBusiness

+0

@MonkeyBusiness: эта проблема не касается сохранения значений в MySQL. Нет никакой проблемы с сохранением этой строки в качестве значения в столбце. Когда вы вытаскиваете это значение из базы данных, вы, вероятно, захотите запустить это значение с помощью функции типа «htmlentities» при выводе на веб-страницу; точно так же, как вы уже делаете все потенциально «небезопасные» значения, которые вы размещаете на своей веб-странице. – spencer7593

ответ

1

При получении значений из даты вы должны обрабатывать эти значения, как если бы они были небезопасными, как если бы они могли включать специальные символы HTML или могли содержать javascript.

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

PHP предоставляет функцию htmlentities, чтобы сделать это, заменив специальные символы HTML подходящими заменами. В качестве примера:

$val = htmlentitites("<script>alert('heheheheheheh')</script>"); 

назначить бы что-то вроде этого, чтобы $val

&lt;script&gt;alert('heheheheheheh')&lt;/script&gt; 

(. Он может также заменить некоторые другие символы), но конечный результат, если вы поставите что строку из на веб-страница, то, что вы собираетесь «видеть», отображаемое на веб-странице, выглядит как исходная строка. Эта строка не будет интерпретироваться как javascript.

В нижней строке вы не можете предположить, что, поскольку строка возвращается из базы данных, она является «безопасной». Вы must относитесь к нему как потенциально небезопасно.


ли PDO "дезинфицировать" вход?

Одним словом, НЕТ. PDO не дезинфицирует значения в операторах SQL, чтобы удалить специальные символы HTML или другие потенциально опасные значения.

Что подготовил заявление с связывает заполнитель делает это убедиться, что значение поставляется в операторе получает передается в базу данных, без интерпретируются как SQL текст.

В качестве примера, используя PDO подготовил заявление с привязки заполнителем

$sql='INSERT INTO tab (col) VALUES (:val)'; 
$sth=$db->prepare($sql); 
$sth->bindParam(':val', $value); 
$sth->execute(); 

против включения значения в инструкцию SQL

$sql = "INSERT INTO tab (col) VALUES ('" ,. $value ."')"; 
$db->query($sql); 

Рассмотрим, что происходит в каждом случае, когда $value содержит эту строку

foo'); DROP TABLE tab; -- 

С первым образцом (подготовьте d с привязкой привязки), это строковое значение передается в базу данных и сохраняется в столбце.

Во втором примере, включающий это значение в тексте заявления SQL, мы получаем потенциально опасные заявления SQL представлены:

INSERT INTO tab (col) VALUES ('foo'); DROP TABLE tab; --') 

Это пример того, что SQL Injection уязвимости о. И это демонстрирует, почему с помощью подготовленных операторов с bind placeholders thwarts SQL Injection, он защищает от целого ряда гадостей, которые могут произойти, когда мы не рассматриваем значения как потенциально небезопасно.


$value Если содержит строку:

<script>alert('heheheheheheh')</script> 

с подготовленным заявлением и привязывать заполнителем, это значение, которое будет храниться в базе данных. Это просто строка. Он не будет интерпретироваться как часть инструкции SQL.

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

INSERT INTO tab (col) VALUES ("<script>alert('heheheheheheh')</script>") 

Или, если бы мы использовали функцию «побег строку»

INSERT INTO tab (col) VALUES ('<script>alert(''heheheheheheh'')</script>') 

Опять же, эта строка сохраняется в базе данных, потому что это допустимая строка. Неважно, есть ли в нем специальные символы HTML.


Нижняя линия PDO не дезинфицирует символы HTML в строках. Ваш код должен обрабатывать все значения, возвращаемые из базы данных, как если бы они были потенциально опасными, и запускать их через htmlentities или аналогичную функцию, чтобы «разоружить» значения от интерпретации, например. как javascript.

0

Использование подготовленных операторов лучше всего, что вы делаете (при условии, что вы выполняете инструкцию (не в вашем примере кода)). Подготовленные инструкции позволяют избежать значений SQL-запросов, а не межсайтовых скриптов.

Значение не изменяется в базе данных, что является хорошим (ИМО). Вы должны отфильтровать значения при выводе их при необходимости (например, htmlentities()).

Вы также можете связать Params в execute метода:

$STH = $db->prepare("INSERT INTO racuni (napomene) VALUES (?)"); 
$STH->execute(array($_POST['napomena'])); 
0

Прежде всего, нужно сказать, PDO бросать исключения, как показано ниже:

$pdo = new PDO("mysql:host={$dbhost};dbname={$dbname}", $dbuser, $dbpass); 
// add this: 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

Теперь оберните ваши операции с базами данных в try - catch блоке:

try 
{ 
    $statement = $pdo->prepare("INSERT INTO racuni (napomene) VALUES (:12)"); 

    $statement->bindParam(':12', $_POST['napomena'], PDO::PARAM_STR); 
    // etc. 

    $statement->execute(); 
} 
catch (PDOException $exception) 
{ 
    echo "PDO error :" . $exception->getMessage(); 
}