Почему эта вставка PDO DB с выключенным magic_quotes_gpc по-прежнему приводит к обратным косым чертам в db?

На сервере, который я использую (запущен php_fastcgi5), в корневом каталоге, содержащем эту директиву, есть файл .htaccess, чтобы отключить magic_quotes_gpc:

php_flag magic_quotes_gpc off

Вывод phpinfo () сообщает, что локальное значение для magic_quotes_gpc действительно отключено. (Однако основное значение "включено".)

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

<?php
$db = new PDO('mysql:host=example.com;dbname=my_database_name;charset=utf8', 'database_user', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$output = '<p>Post some text which includes some apostrophes:</p><form name="form" action="test.php" method="post"><input type="text" size="60" name="string" value="The server\'s not behaving as it\'s supposed to." /><br /><br /><input type="submit" value="Post" /></form><br />----------<br />';

if (isset($_POST['string'])) {
  $PostedString = $_POST['string'];
  $InsertQuery = $db->prepare("INSERT INTO `test` (string) VALUES (?)");
  $SuccessfulInsertion = $InsertQuery->execute(array($PostedString));
  if ($SuccessfulInsertion) {
    $ReadStatement = $db->prepare('SELECT * FROM `test` ORDER BY `id`');
    $ReadStatement->execute();
    $ReadStatement->setFetchMode(PDO::FETCH_ASSOC);
    while($row = $ReadStatement->fetch()) {
      $ThisString = $row['string'];
      $output .= '<p>'.$ThisString.'</p>'.$CR;
    }
  }
}
echo $output;
?>

Кто-нибудь знает, почему текст, вставленный в базу данных с использованием этого кода, по-прежнему приводит к записи db с косой чертой, добавленной перед апострофами?

Это потому, что PHP работает как php_fastcgi5 (т.е. директива .htaccess для отключения magic_quotes_gpc не работает из-за этого)? Если да, есть ли обходной путь? (У меня нет доступа к файлу php.ini.)


person John Doe    schedule 18.06.2012    source источник
comment
Если вы var_dump($_POST);, он сбежал оттуда? Если так ... на этом сервере происходит что-то подозрительное, если он по-прежнему заявляет, что magic_quotes_gpc выключен. Никаких автоматических добавлений или другого кода, который возился с данными до этого?   -  person Wrikken    schedule 18.06.2012
comment
Похоже, в вашем тексте есть обратная косая черта: value="The server\'s not behaving as it\'s supposed to."   -  person Marcus Adams    schedule 18.06.2012
comment
@Wrikken Да, выполнение var_dump($_POST); показывает, что на выходе есть обратная косая черта. Нет другого кода, кроме того, что я изложил выше.   -  person John Doe    schedule 18.06.2012
comment
@Marcus Adams Это только потому, что я использовал одинарные кавычки в PHP. Они не имеют ничего общего с обратными косыми чертами, которые выводятся в базу данных - они появляются только перед вводом любых апострофов. Если я оставлю текстовое поле пустым и введу текст с апострофами вручную, получится тот же результат.   -  person John Doe    schedule 18.06.2012
comment
@JohnDoe: значит, проблема не в этом коде, а раньше. Если phpinfo(); говорит, что нет волшебных кавычек и нет автоматического добавления ... что-то вставляет эти кавычки. Вы владелец сервера? Если нет, спросите владельца, установил / настроил ли он что-то, что может делать это.   -  person Wrikken    schedule 18.06.2012
comment
@Wrikken Да, это загадочно. phpinfo () сообщает, что локальное значение magic_quotes_gpc - Off (а главное значение - On), хотя есть проблема, обсуждаемая в сообщении, на которое я ссылался выше, который немного запутывает это. Я попросил поддержки у хостинг-компании, владеющей сервером, но они мне не помогли; они, кажется, не знают ответа. Как я уже упоминал, у меня было смутное воспоминание, что это может иметь какое-то отношение к тому, что PHP скомпилирован как php_fastcgi5, не разрешающий директиву .htaccess, хотя я не уверен в этом и не могу найти никакой ссылки на эту идею.   -  person John Doe    schedule 18.06.2012
comment
Если .htaccess не был прочитан, значение также будет off, и уязвимость (к счастью) только в cgi, а НЕ в fastcgi реализации. Однако причина выбора fastcgi вместо php в качестве модуля часто заключается в пользовательских настройках и владении для каждого клиента, другими словами, также с индивидуальным php.ini файлом для каждого клиента. Может ли это предоставить вам ваш хостинг-провайдер?   -  person Wrikken    schedule 18.06.2012
comment
Хм, теперь я прочитал, что значение будет off, когда оно будет единым ... Этот настраиваемый php.ini кажется подходящим вариантом.   -  person Wrikken    schedule 18.06.2012
comment
Хостинговая компания сообщает, что для (общего) сервера существует только один файл php.ini; это значение magic_quotes_gpc можно изменить только через файл .htaccess; что никто другой не сообщил об этой проблеме, которую я описываю. Так что не так с моим приведенным выше кодом?   -  person John Doe    schedule 19.06.2012


Ответы (1)


У меня такая же проблема.

Magic_quotes_gpc - local: Off - master: On

Но в $ _POST есть косые черты.

Также работает fastcgi. Интересно, проблема в fastcgi?

Нам пришлось отключить его с помощью -d magic_quotes_gpc = off.

person Zorfling    schedule 19.07.2012