Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как избавиться от косой черты? Откуда она взялась?
 
 автор: tavila2009   (07.02.2010 в 12:55)   письмо автору
 
 

Из формы получаю текст так:
$letter = mysql_escape_string($_POST["letter"]);
Ввожу в базу такой текст
это пример введенного текста "Чего в супе не хватает".

Из базы читаю так:
$letter=htmlspecialchars($cat['letter']);
$letter = str_replace("\r\n"," <br>",$letter);


И получаю такой результат?
это пример введенного текста \" Чего в супе не хватает \" .

Появились две косые. Как от них избавиться?

  Ответить  
 
 автор: t3ma   (07.02.2010 в 12:59)   письмо автору
 
   для: tavila2009   (07.02.2010 в 12:55)
 

убрать строчку $letter=htmlspecialchars($cat['letter']);
зачем использовать htmlspecialchars() при выводе из базы ?

  Ответить  
 
 автор: tavila2009   (07.02.2010 в 13:14)   письмо автору
 
   для: t3ma   (07.02.2010 в 12:59)
 

Но ведь таков порядок извлечения из базы. Я всегда так пишу.

  Ответить  
 
 автор: tavila2009   (07.02.2010 в 13:19)   письмо автору
 
   для: t3ma   (07.02.2010 в 12:59)
 

Сейчас посмотрела что в базе. Эти косые черты есть уже в базе. Значит надо заносить в базу как-то не так. Как? Подскажите пожалуйста.

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 13:25)   письмо автору
 
   для: tavila2009   (07.02.2010 в 13:19)
 

<?  
  
function stripslashes_deep($data)    
    {    
        if(
is_array($data))     
            
$data array_map("stripslashes_deep"$data);     
        else   
            
$data stripslashes($data);     
        return 
$data;
    }

    if(
get_magic_quotes_gpc()) 
    { 
        
$_GET stripslashes_deep($_GET);  
        
$_POST stripslashes_deep($_POST);  
        
$_COOKIE stripslashes_deep($_COOKIE); 
    }

  Ответить  
 
 автор: neadekvat   (07.02.2010 в 13:24)   письмо автору
 
   для: tavila2009   (07.02.2010 в 12:55)
 

У вас магические кавычки включены скорее всего + вы еще функцией экранирования пользуетесь (mysql_escape_string() ).

При добавлении делайте так:
<?php
if (!get_magic_quotes_gpc()) { // если маг.кавычки выключены
$letter mysql_real_escape_string($_POST["letter"]);
} else {
$letter $_POST["letter"];
}


http://php.su/security/?magicquotes

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 13:26)   письмо автору
 
   для: neadekvat   (07.02.2010 в 13:24)
 

не надо так делать.

  Ответить  
 
 автор: neadekvat   (07.02.2010 в 13:34)   письмо автору
 
   для: Николай2357   (07.02.2010 в 13:26)
 

Но почему - объяснять особо никто не хочет. Все только функцию, типа вашей дают.

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 13:45)   письмо автору
 
   для: neadekvat   (07.02.2010 в 13:34)
 

Объяснений на форуме стопицот штук уже. Право, лень... Но если хотите, извольте.
1. Функция mysql_real_escape_string() работает только при активном открытом соединении с сервером MySQL, а это не факт.
2. Вы безапеляционно обработали ей данные, которые могут понадобиться не только в запросах, а значит исказили их. Попробуйте вернуть переменную $letter в элемент формы.
3. Преславутая инициализация переменных. Вы рискуете получить нотис в случае отсутствия элемента массива POST

  Ответить  
 
 автор: neadekvat   (07.02.2010 в 13:53)   письмо автору
 
   для: Николай2357   (07.02.2010 в 13:45)
 

1. Уж если мне нужно экранировать что-то - значит недалеко запросы к бд. А к бд подключаюсь я прежде всего, еще в конфиге, который подключается в самое начало любого скрипта.
2. Если мне надо вычислить длину или проверить на запрещенные символы - то это я делаю сразу, а уж потом экранирую. В форму к пользователю же выводит его исходные, POST['что-то'] значения.
3. В соседней теме вы сами указали, как нужно делать, чтобы даже при отсутствующих элементах массива не получить нотайс.

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 14:06)   письмо автору
 
   для: neadekvat   (07.02.2010 в 13:53)
 

1. Дело не в том даже, далеко они или нет, запросы эти. А в том, что в самом запросе не видно, обработаны данные или нет. И к тому же. это у Вас коннект в конфиге, не факт что так же у топикстартера.
2. Не путайте валидацию с обработкой. Это совершенно разные вещи. Абсолютно не связанные между собой.
3. Я - да. Указал. Но у Вас этого нет.

  Ответить  
 
 автор: neadekvat   (07.02.2010 в 14:09)   письмо автору
 
   для: Николай2357   (07.02.2010 в 14:06)
 

Тут я с вами согласен. Согласен именно после этого поста.
Но просто так заявлять, что "так делать не надо" - тоже..не надо.. Вымораживают такие заявления, ведь понятно, что последуют вопросы, а у кого-то вообще претензии.

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 14:18)   письмо автору
 
   для: neadekvat   (07.02.2010 в 14:09)
 

Прошу простить великодушно. Иногда правда очень лень, потому что на этой теме только совсем ленивый не плясал.)

  Ответить  
 
 автор: neadekvat   (07.02.2010 в 14:21)   письмо автору
 
   для: Николай2357   (07.02.2010 в 14:18)
 

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

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 14:32)   письмо автору
 
   для: neadekvat   (07.02.2010 в 14:21)
 

То - да. Вот вполне авторитетный источник. Там вообще все по взрослому.)

  Ответить  
 
 автор: Trianon   (07.02.2010 в 14:43)   письмо автору
 
   для: Николай2357   (07.02.2010 в 14:32)
 

По взрослому там было бы, если б был поставлен запрет на случайное повторное применение функции.
Увы, совсем по-взрослому его не сделать, т.к. из скрипта значение get_magic_quotes_gpc менять запрещено.

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 14:51)   письмо автору
 
   для: Trianon   (07.02.2010 в 14:43)
 

Подождем 6.0
Не за горами вроде)

  Ответить  
 
 автор: Trianon   (07.02.2010 в 15:15)   письмо автору
 
   для: Николай2357   (07.02.2010 в 14:51)
 

ну, если только. :)

  Ответить  
 
 автор: neadekvat   (07.02.2010 в 15:20)   письмо автору
 
   для: Николай2357   (07.02.2010 в 14:32)
 

Пусть так.
Но я вообще предпочитаю использовать .htaccess (конечно, прежде уточняя, можно ли его использовать на хостинге).

  Ответить  
 
 автор: tavila2009   (07.02.2010 в 13:35)   письмо автору
 
   для: Николай2357   (07.02.2010 в 13:26)
 

Спасибо большое! Получилось. Как же я про stripslashes забыла.!!! Бестолочь!
Я вот так сделала :

$letter=htmlspecialchars($cat['letter']);
$letter = stripslashes($letter);
$letter = str_replace("\r\n"," <br>",$letter);

Теперь всё чисто и красиво! Вот! Волшебник! Факт на лицо! )))

  Ответить  
 
 автор: Trianon   (07.02.2010 в 13:41)   письмо автору
 
   для: tavila2009   (07.02.2010 в 13:35)
 

Николай сейчас краснеет.

  Ответить  
 
 автор: tavila2009   (07.02.2010 в 13:44)   письмо автору
 
   для: Trianon   (07.02.2010 в 13:41)
 

опять я что-то не то сморозила! Ну я как всегда! Больше не буду. "Виноват исправлюсь"

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 13:47)   письмо автору
 
   для: Trianon   (07.02.2010 в 13:41)
 

Неправда Ваша. )) Я не советовал никаких
<?
$letter
=htmlspecialchars($cat['letter']);
$letter stripslashes($letter);
$letter str_replace("\r\n"," <br>",$letter);

Но если меня поняли привратно, то да. Пунц проявился.

  Ответить  
 
 автор: Trianon   (07.02.2010 в 13:52)   письмо автору
 
   для: Николай2357   (07.02.2010 в 13:47)
 

А я не сказал, от стыда Вы краснеете, или от гнева.
Но от чего-то одного уж точно. Я бы покраснел.
Ошибся таки?

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 14:08)   письмо автору
 
   для: Trianon   (07.02.2010 в 13:52)
 

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

  Ответить  
 
 автор: neadekvat   (07.02.2010 в 13:42)   письмо автору
 
   для: tavila2009   (07.02.2010 в 13:35)
 

Неужели это хорошо, когда в базе данные с ненужными слешами хранятся?

  Ответить  
 
 автор: tavila2009   (07.02.2010 в 13:43)   письмо автору
 
   для: Николай2357   (07.02.2010 в 13:26)
 

А вот вопрос:
эти слэши попадают в базу. При выводе из базы они гасятся. А может как-то перед занесением в базу их надо гасить?

  Ответить  
 
 автор: Николай2357   (07.02.2010 в 13:49)   письмо автору
 
   для: tavila2009   (07.02.2010 в 13:43)
 

Эти слэши не попадут в базу, если Вы их туда сами не засунете.

  Ответить  
 
 автор: Тень&   (07.02.2010 в 17:55)
 
   для: tavila2009   (07.02.2010 в 13:43)
 

Единственно верный совет был в посте Николая2357 (07.02.2010 в 13:25). Его можно дополнить так:

<?php

if( version_compare(PHP_VERSION', '6.0.0', '<') && get_magic_quotes_gpc() )
{
        $_GET = stripslashes_deep($_GET);  
        $_POST = stripslashes_deep($_POST);  
        $_COOKIE = stripslashes_deep($_COOKIE);  
        $_REQUEST = stripslashes_deep($_REQUEST);  
}

?>

  Ответить  
 
 автор: Тень&   (07.02.2010 в 17:55)
 
   для: Тень&   (07.02.2010 в 17:55)
 

<?php

if( version_compare(PHP_VERSION'6.0.0''<') && get_magic_quotes_gpc() )
{
        
$_GET stripslashes_deep($_GET);  
        
$_POST stripslashes_deep($_POST);  
        
$_COOKIE stripslashes_deep($_COOKIE);  
        
$_REQUEST stripslashes_deep($_REQUEST);  
}


>_>

  Ответить  
 
 автор: Тень&   (07.02.2010 в 17:57)
 
   для: Тень&   (07.02.2010 в 17:55)
 

P.S. А то, что _уже_ занесено в базу сейчас (до внедрения этого кода), необходимо исправить.

  Ответить  
 
 автор: Trianon   (07.02.2010 в 18:06)   письмо автору
 
   для: Тень&   (07.02.2010 в 17:55)
 

Что за чушь?
Можно подумать, из 6-ки убрали get_magic_quotes_gpc()

  Ответить  
 
 автор: Тень&   (07.02.2010 в 18:27)
 
   для: Trianon   (07.02.2010 в 18:06)
 

Trianon смотрю поменялся. Другой стал.

Из шестрёки (одной из её версий, уж во всяком случае) скорее всего get_magic_quotes_gpc() и вынесут. In my humble opinion. Да и потом, это сигнал к тому, что это код можно будет сносить, если скрипт будет заявлен для версии >= 6.0.0.

Но я вообще-то основной целью поправки ставил добавление $_REQUEST в список обработки.

  Ответить  
 
 автор: Trianon   (07.02.2010 в 19:14)   письмо автору
 
   для: Тень&   (07.02.2010 в 18:27)
 

Декларация о намерениях по шестерке вообще (и по magiс quotes в частности) приводилась здесь довольно давно. Напомню.
Чтобы убрать сигнальный вариант function get_magic_quotes_gpc(){return 0;}, надо быть по уши деревянным обладать недюжинным уровнем наивности.
Портабельность же порвется к такой-то матери.

  Ответить  
 
 автор: Тень&   (07.02.2010 в 19:18)
 
   для: Trianon   (07.02.2010 в 19:14)
 

Хамить не надо. Я сказал в одной из версий. Вы уверены, что все версии 6.x.x будут обладать этой "заглушкой"? Мне просто неприятно оставлять голым эту функцию, чуши я тут не вижу.

  Ответить  
 
 автор: Тень&   (07.02.2010 в 19:22)
 
   для: Тень&   (07.02.2010 в 19:18)
 

Кстати, вполне вероятно, что будет выбрасываться ошибка уровня E_STRICT, IMHO

  Ответить  
 
 автор: Тень&   (07.02.2010 в 19:23)
 
   для: Тень&   (07.02.2010 в 19:22)
 

Или E_DEPRECATED :)

  Ответить  
 
 автор: Trianon   (07.02.2010 в 19:58)   письмо автору
 
   для: Тень&   (07.02.2010 в 19:23)
 

применение magic_quotes on в конфиге может быть (должно быть и более того - является) deprecated.
А разумная проверка, не включил ли какой-нибудь дилетант случайно этот режим в своем php - да с каких гвоздей это настоятельно не рекомендовано?

  Ответить  
 
 автор: Тень&   (07.02.2010 в 20:08)   письмо автору
 
   для: Trianon   (07.02.2010 в 19:58)
 

Мы говорим о PHP 6? Там нельзя включить magic_quotes_gpc.

P.S. Не замечаете сходства этого треда с этим: http://softtime.ru/forum/read.php?id_forum=6&id_theme=71704&page=1?

Там я придрался к тому, что Вам лень проверить список спец. символов PCRE. Но Вам так удобнее.

Тут Вы придрались к тому, что я поставил проверку версии. Мне тоже так удобнее -- я не имею представления, что разработчики PHP выдвинут в очередной раз. До сих пор вспоминаю милую ошибку уровня E_WARNING, кажется, из-за попытки записать в $_SESSION значение NULL.

Так не кажется ли Вам, что Вы придираетесь похуже меня? :)

  Ответить  
 
 автор: Trianon   (07.02.2010 в 20:33)   письмо автору
 
   для: Тень&   (07.02.2010 в 20:08)
 

Мы говорим о PHP 6? Там нельзя включить magic_quotes_gpc.
Мы говорим о написании эффективного кода, в том числе учитывая PHP6?

В PHP6 нельзя включить magic_quotes_gpc, но можно убедиться, что они выключены.

>Так не кажется ли Вам, что Вы придираетесь похуже меня? :)
Э нет... передергиваете.
Мой ответный комментарий решал целевую задачу выполнения контекстной замены.
Побочным эффектом я сэкономил на анализе мануала.
Ваш же целиком и полностью был посвящен тому факту, что в PHP6 действуют отдельные правила.
Стоило бы поинтересоваться, насколько именно отдельные.
А что разработчики могут загнуть, я знаю.
После того, как прочел о том, как эти magic quotes появились (версия отца-основателя PHP) мне стало дурно.

Ну так что , стреляться теперь чтоли?

Впрочем, если Вам опять охота спорить ради процесса - я просто признаю. Вы правы. Ок?

  Ответить  
 
 автор: Тень&   (07.02.2010 в 20:39)   письмо автору
 
   для: Trianon   (07.02.2010 в 20:33)
 

> Ваш же целиком и полностью был посвящен тому факту, что в PHP6 действуют отдельные правила.

Я же сказал, что мой ответ был посвящен в основном тому, что Николай забыл $_REQUEST

P.S. Меня, как сноба, задевает это "что за чушь", поэтому не обижайтесь, что я Вас тут "троллю", как считаете Вы.

  Ответить  
 
 автор: Trianon   (07.02.2010 в 21:12)   письмо автору
 
   для: Тень&   (07.02.2010 в 20:39)
 

$_REQUEST не заметил по диагонали я.

  Ответить  
 
 автор: Trianon   (07.02.2010 в 19:55)   письмо автору
 
   для: Тень&   (07.02.2010 в 19:18)
 

Это по фактам. http://bugs.php.net/bug.php?id=42262

>Хамить не надо. Я сказал в одной из версий.
По одной из чьих версий?
Я не знал, что Вы входите в команду разработчиков.
Если не входите - данная фраза ни коим образом не должна была Вас задеть.
Если входите - я повторю её еще раз, но уже лично.

Это не хамство. Если ты берешься что-то делать для других людей, сперва научись это делать.
В противном случае они не постесняются сказать всё, что думают об авторе.

И таки я не понял Ваши слова про "оставлять голым функцию" . Правда, не понял.

  Ответить  
 
 автор: Тень&   (07.02.2010 в 20:05)   письмо автору
 
   для: Trianon   (07.02.2010 в 19:55)
 

>По одной из чьих версий?
>Я не знал, что Вы входите в команду разработчиков.

OK, я читал по диагонали эту фразу: "Чтобы убрать сигнальный вариант ..."

> И таки я не понял Ваши слова про "оставлять голым функцию" . Правда, не понял.

Оставлять вызов этой функции без предварительной проверки версии PHP.

  Ответить  
 
 автор: tavila2009   (07.02.2010 в 22:15)   письмо автору
 
   для: Trianon   (07.02.2010 в 19:55)
 

Почему-то вертится в голове фраза - "... рыцарь без страха и упрёка" ...
В наложении на Трианон получается всегда -
"Рыцарь без страха НО с УПРЁКОМ ..."
))))))))))))
без страха но с упрёком ....
с упрёком но без страха ...
без страха но с упрёком ....
с упрёком но без страха ...
без страха но с упрёком ....
с упрёком но без страха ...
без страха но с упрёком ....
с упрёком но без страха ...
без страха но с упрёком ....
с упрёком но без страха ...
- это уже вариации.
))))))))))))
))))))))))))
и т.д. бесконечный цикл
Ну всё, теперь забанят! Однозначно. ) Не надо меня банить. Я исправлюсь )

  Ответить  
 
 автор: Trianon   (07.02.2010 в 23:08)   письмо автору
 
   для: tavila2009   (07.02.2010 в 22:15)
 

Le Chevalier sans peur, sans reproche дословно переводится как бесстрашный, безупречный рыцарь.
Если есть упреки в мой адрес- в личную почту, пожалуйста.

  Ответить  
 
 автор: Рома   (08.02.2010 в 00:04)   письмо автору
 
   для: tavila2009   (07.02.2010 в 22:15)
 

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

  Ответить  
 
 автор: tavila2009   (08.02.2010 в 00:12)   письмо автору
 
   для: Рома   (08.02.2010 в 00:04)
 

Конечно наставляйте на путь истинный. Я за этим и пришла .
Да это шутка была. Какие там упрёки. Кроме благодарности от меня никаких упрёков. Я вообще очень доброжелательный человек. Это просто Тень с Трианоном взаимными упрёками обменялись - вот и возникла фраза.
"... Два отточенных клинка ..." У меня на сайте знакомств поэтэсса зарегистрировалась. Вообщем начиталась её стихов ... Под впечатлением ... :)))

Я вот так сделала и у меня всё получилось. Забыла слэши погасить.

$letter=htmlspecialchars($cat['letter']);
$letter = stripslashes($letter);
$letter = str_replace("\r\n"," <br>",$letter);

А сегодня Масленица! С праздником всех!!!!!
Масленичная неделя в этом году приходится на 8–14 февраля.

  Ответить  
 
 автор: Тень&   (08.02.2010 в 00:40)   письмо автору
 
   для: tavila2009   (08.02.2010 в 00:12)
 

> Забыла слэши погасить.

Не с той стороны Вы их гасите-то :(

  Ответить  
 
 автор: tavila2009   (08.02.2010 в 00:43)   письмо автору
 
   для: Тень&   (08.02.2010 в 00:40)
 

Я разберусь. сейчас всё перечитаю и разберусь. :)))) С праздником Вас!

  Ответить  
 
 автор: Рома   (08.02.2010 в 00:48)   письмо автору
 
   для: tavila2009   (08.02.2010 в 00:12)
 

>Я вот так сделала и у меня всё получилось.
>
>$letter=htmlspecialchars($cat['letter']);
>$letter = stripslashes($letter);

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

  Ответить  
 
 автор: tavila2009   (08.02.2010 в 01:16)   письмо автору
 
   для: Рома   (08.02.2010 в 00:48)
 

Мне не плевать. Это я Вам по секрету скажу. Поэтому это мой любимый форум. А "гад дядька Трианон" он же и не со мной вовсе "упрекался" а с Тенью. Да хорошо я к ним отношусь. Более чем.
И вот тому подтверждение. http://softtime.ru/forum/read.php?id_forum=2&id_theme=70749&page=4
Устали мы все похоже. Надо отдохнуть. Выспаться. Спокойной ночи. :))))
Всего Вам самого самого доброго.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования