Когда я экранирую все входные данные, иногда он оставляет косую черту (\) в строке и вставляет ее в базу данных. Почему это происходит и как я могу это решить? - PullRequest
0 голосов
/ 14 ноября 2011

Я обнаружил функцию полоски, но я бы предпочел найти место, где добавляю больше слешей, чем следовало бы. Мои функции используют mysql_real_escape_string один раз для каждой переменной, и я запрашиваю базу данных, используя «вставить в значения foo (bar, bar) ($ baz, $ baz)» может в этом проблема.

phpinfo дает

 magic_quotes_gpc           On  On 
 magic_quotes_runtime   Off Off
 magic_quotes_sybase            Off Off

static function insert($replyto,$memberid,$postid,$comment)
{
    $message=array();
    $lenmax=1000;
    $lenmin=5;

    $toolong="comment is too long.";
    $tooshort="comment is too short.";
    $notarget="replied comment is deleted";
    $nomember="you are not a member";
    $notpost="commented post is deleted";

    switch(true)
    {
    case strlen($comment)<$lenmin: $message[]= $tooshort; break;
    case strlen($comment)>$lenmax: $message[]=$toolong; break; 
    case $replyto!=NULL && !commentexists($replyto): $message[]=$notarget; break;
    case !memberexists($memberid): $message[]=$nomember; break;
    case !postexists($postid): $message[]=$nopost; break;
    case count($message)>0:return $message; break;
    }

    $replyto=mysql_real_escape_string($replyto);
    $memberid=mysql_real_escape_string($memberid);
    $postid=mysql_real_escape_string($postid);
    $comment=mysql_real_escape_string($comment);
    if($replyto==NULL)
    mysql_query("insert into fe_comment(memberid,postid,comment) values($memberid,$postid,'$comment')");
    else
    mysql_query("insert into fe_comment(replyto,memberid,postid,comment) values($replyto,$memberid,$postid,'$comment')");
}

В моей хостинговой компании есть magic_quotes_gpc, и у меня нет доступа к файлу php.ini. Я использую панель plesk для настройки.

php документация гласит

Пример использования stripslashes () - это когда PHP-директива magic_quotes_gpc включена (включена по умолчанию), и вы не вставляете эти данные в место (например, базу данных), которое требует экранирования. Например, если вы просто выводите данные прямо из формы HTML.

Мои запросы вставки вставляются с косыми чертами в базу данных, и моя версия php 5.2.3

документация также гласит

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

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

$comment=mysql_real_escape_string(stripslashes($comment));

но я думаю, что это не должно стать стандартом в моих кодах, потому что это не выглядит как "правильный путь", хотя и спасает день.

magic_quotes_gpc автоматически экранирует все и также не является надежным, потому что он устарел.

поэтому я создал файл .htaccess и скопировал его во все каталоги. У меня есть файл index.php, файлы .htaccess содержат только этот текст

php_flag magic_quotes_gpc Off

Я запустил phpinfo, и он все еще дает

magic_quotes_gpc On On
magic_quotes_runtime Off Off
magic_quotes_sybase Off Off

теперь мне нужен способ отключить магические кавычки gpc, и у меня нет доступа к файлу php.ini. Сейчас я ищу способы редактирования файлов .htaccess.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2011

Я думаю, что это не должно стать стандартом в моих кодах, потому что это не выглядит как "правильный путь"

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

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

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

Таким образом, было бы целесообразно помещать какой-либо код полоски в любой файл начальной загрузки, который будет запускаться при каждом вызове сценария.Код, который вы можете найти в многочисленных реализациях такого кода, просто Google для функции 'stripslashes_deep'.

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

Но есть и другая возможность их отключить: попробуйте создать файл php.ini в корне вашего приложения.

Однако в вашем коде есть серьезная ошибка.Фактически, это ничего не защищает.
Вы избегаете $memberid и $postid, но не цитируйте их! .Таким образом, нет никакой защиты вообще.Просто потому, что экранирование работает только при цитировании.

Пожалуйста, помните:

Побег не является синонимом безопасности!

Побег в одиночку ничем не может помочь.Существует целый набор правил, которым нужно следовать.

Недавно я написал достойное объяснение, поэтому я не буду повторяться: Замена функций mysql_ * на PDO и подготовленные операторы

0 голосов
/ 14 ноября 2011

Различные способы отключения магических кавычек представлены в документации php .В противном случае он предоставляет способ рекурсивного удаления косых черт из всех переменных вашего запроса.

...