2013-09-14 4 views
5

Я только начинаю с методов PDO, и теперь я застрял в небольшом вопросе. Если я создаю форму, чтобы вставить имя и фамилию в базу данных я могу вставить все типы специальных символов на код ниже:PDO UPDATE, похоже, не сохраняет кавычки?

try { 
    $db = new PDO('mysql:dbhost=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass); 
    $db -> exec("SET CHARACTER SET utf8"); 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 
$query = $db->prepare("INSERT INTO users(fname, lname) VALUES(:fname, :lname)"); 
$insert_array = array(
    ":fname" => $fname, 
    ":lname" => $lname 
); 
$query->execute($insert_array); 
$db = NULL; 

Я могу вставить ":;,-!"#¤%&&(%)?{][]}£$€{{{[email protected]@_--" без каких-либо проблем, даже вставить SQL-инъекции. Но когда я пытаюсь обновить базу данных с помощью аналогичного кода, он принимает все типы специальных символов, кроме кавычек. Почему это? Код, который я использую для обновления:

try { 
    $db = new PDO('mysql:dbhost=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass); 
    $db -> exec("SET CHARACTER SET utf8"); 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 
$query = $db->prepare("UPDATE users SET fname=:fname, lname=:lname WHERE userid=:userid"); 
$update_array = array(
    ":fname" => $fname, 
    ":lname" => $lname, 
    ":userid" => $_GET['userid'] 
); 
$query->execute($update_array); 
$db = NULL; 

Я благодарен за любую помощь, которую я могу получить.

- = SOLUTION = -

мне пришлось использовать htmlspecialchars() для "декодировать" строку. Например:

<form action="" method="post"> 
    First name<br><input type="text" name="fname" value="'.htmlspecialchars($user['fname']).'"> 
    Last name: <br><input type="text" name="lname" value="'.htmlspecialchars($user['lname']).'"> 
    <input type="submit"> 
</form> 

Теперь все виды специальных символов прекрасно работают. Спасибо всем за помощь, очень признательны! : D

+3

Этого не должно быть, параметризованные запросы должны допускать любые символы. Вы получаете сообщение об ошибке? – Barmar

+0

Нет, это просто сокращает все после первого котировочного знака. : S – Treps

+0

Интересно. Можете ли вы изменить в своем вопросе пример значений для второго скрипта, демонстрирующего это поведение? Надеюсь, мы сможем принять его, нет никаких триггеров, прикрепленных к этой таблице? – halfer

ответ

1

Умеренный Хан прав, я верю. Не обязательно в этом случае использовать себя (хотя это явная уязвимость, которую вы показываете здесь, и оставляете дверь открытой для таких атак), но вместо этого просто разбивая ваш html, насколько я могу судить.

Только эхо $user['fname'] и $user['lname'] значения raw - которые содержат двойные кавычки из предыдущего представления - вы непреднамеренно допускаете преждевременное закрытие значения атрибута элемента html при его рисовании, тем самым нарушая вашу HTML-форму. Удивительно, что он все равно подчиняется вообще. В своем браузере проверьте что-то вроде Firebug и просмотрите форму - вы должны увидеть, что вход странно сформирован и, возможно, некоторые дополнительные символы, нарисованные после него.

Всегда используйте htmlentities() или другие аналогичные функции вспомогательного помощника на значениях PHP, прежде чем их эхо их прямо в HTML. Всегда.

Пример:

<form action="" method="post"> 
    First name<br><input type="text" name="fname" value="<?php echo htmlentities($user['fname'], ENT_COMPAT, 'UTF-8'); ?>"> 
    Last name: <br><input type="text" name="lname" value="<?php echo htmlentities($user['lname'], ENT_COMPAT); ?>"> 
    <input type="submit"> 
</form> 

Edit: относительно вашего утверждения, что «И это работает, чтобы обновить с кавычками, если удалить кавычки в значении формы», который я беру, чтобы означать вы установили HTML элемент значения атрибутов, используя одиночные кавычки, а не двойные кавычки, он действительно не работает вообще.

Если пользователь представил значение с одинарными кавычками, он аналогичным образом нарушит ваш фиксированный пример, потому что одна кавычка в значении преждевременно закрывает объявление значения атрибута элемента HTML. Использование двойных кавычек для объявления значения атрибута элемента HTML лучше всего, но если вы решите использовать одинарные кавычки при создании элемента HTML, то в PHP используйте htmlentities($string, ENT_QUOTES).

Изучите руководство пользователя htmlentities, хотя убедитесь, что используете его правильно.

+1

Ahaa, спасибо помощнику. Это немного помогло: htmlentities ($ user ['username'], ENT_COMPAT). Теперь я могу вставить как ':: ', -!" # ¤% && (%)? {] []} £ $ € {{{$ @@ _-- "', но он отображается как '::;' , - "# ¤% && (%) {] []}  £ $ â ¬ {{{$ @@ _--?" '. Ты знаешь почему? – Treps

+0

@Treps: функция 'htmlentities' имеет строковый параметр для установки текстового кодирования. Попробуйте перейти в строку «UTF-8», так как это набор, который вы делали. –

+0

@Treps: Если это все еще не удается, ваш браузер может отправлять серверу другой набор символов, чем тот, который ожидает ваш сервер. Вы можете указать клиенту браузера на использование UTF8, установив что-то вроде этого тега HTML в свой заголовок страницы: ''. Это абсолютно не защищает от неправильного перевода. Это просто предложение клиенту использовать предпочтительную кодировку UTF8 при взаимодействии с документом HTML. Однако эта новая проблема является отдельным вопросом, и вы должны найти ответы в другом месте на SE. –

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