Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Обработка текста из формы онлайн-редактора кода

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: бэк-слеши и прочая фиготень
qte
Отправлено: 01 Сентября, 2011 - 09:55:41
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Сент. 2011  


Помог: 0 раз(а)




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

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

Но тут речь о коде, в котором файл нужно сохранить именно таким, какой он был введен в текстовом поле. То есть, одинарные и двойные кавычки после сохранения файла через пхп-скрипт должны остаться именно таковыми, а бэк-слеши в тексте кода - не должны стать двойными.

И с другой стороны - если в коде осмысленно используется конструкция типа \" или \' - то она должна остаться именно такой, а не заменяться на всякие бэк-слешнутые Улыбка

И, самое главное, что делать с \n? В смысле, если в коде используется \n как часть самого кода.
Ведь собственно переносы строк (в конце каждой строчки текста) мне тоже нужны, т.к. это дело переносится в файл, и если потом этот файл загрузить в текстовое поле, то без переносов не обойтись.

Если я сначала сделаю str_replace всех двойных бэк-слешей \\ на одинарные \, то в тексте появятся дополнительные переводы на новую строку, а мне они нужны при записи в файл (лучшего варианта записи я не придумал, чем если сначала разбить переданную переменную на строчки explode'ом по \n, а потом построчно вставлять в файл).

Если же я сначала разобью строку explode'ом, то всё равно конструкция \\n, переданная скрипту, воспримется как перевод на новую строку и поучаствует в разбиении.

Вот сам код который у меня сохраняет в файл:

PHP:
скопировать код в буфер обмена
  1.  
  2.  $fid = fopen($_REQUEST['f'], "w");
  3.  $tarray = explode("\n",$_REQUEST['t']);
  4.  for ($i=0;$i<count($tarray);$i++) {
  5.   $tarray[$i] = str_replace ("\'", "'", $tarray[$i]);
  6.   $tarray[$i] = str_replace ('\"', '"', $tarray[$i]);
  7.   fputs ($fid,$tarray[$i]."\n");
  8.  }
  9.  fclose($fid);
  10.  


А теперь представьте, что я через свой скрипт редактирую сам же этот код. Получится полная фигня с теми его частями где осмысленно используются конструкции \" \' \n

Как правильно обработать всю эту ерунду? Ведь даже вот тут на форуме эта задача решена - в сообщении можно использовать код без потери его смысла.
Также, возможно, кто-нибудь предложит более элегантный способ сохранить введенный текст в файл?
 
 Top
Мелкий Супермодератор
Отправлено: 01 Сентября, 2011 - 10:05:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




addslashes
(Добавление)
И stripslashes тоже пригодится.


-----
PostgreSQL DBA
 
 Top
qte
Отправлено: 01 Сентября, 2011 - 10:16:36
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Сент. 2011  


Помог: 0 раз(а)




Мелкий пишет:
addslashes
я знаю про существование этой функции. Вы, вероятно, не до конца дочитали моё сообщение Улыбка

addslashes экранирует все спец-символы в строке, в результате если в строке было написано \" (именно так, уже экранировано), то оно станет \\\"
если я сохраню файл в таком виде, то мне потом будет не вытянуть нормальное состояние этой строчки при повторном редактировании
(Добавление)
а как stripslashes справится с \\\" ?
сделает из него \"?
 
 Top
Мелкий Супермодератор
Отправлено: 01 Сентября, 2011 - 10:26:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Вообще, полезное условие:


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


-----
PostgreSQL DBA
 
 Top
qte
Отправлено: 01 Сентября, 2011 - 10:26:45
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Сент. 2011  


Помог: 0 раз(а)




хм.
попробовал, вроде справляется, спасибо

а вообще в чем еще может подстерегаться опасность при написании подобного скрипта? не очень хочется довериться ему, а потом обнаружить неожиданные косяки в результате неправильного сохранения
 
 Top
Мелкий Супермодератор
Отправлено: 01 Сентября, 2011 - 10:43:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




В безопасности. Наличие такого скрипта - очень опасная вещь.

Да и не совсем понятны телодвижения при сохранении файла.
PHP:
скопировать код в буфер обмена
  1. //здесь получение данных с формы, проверки.
  2.  
  3. if (get_magic_quotes_gpc()) $str = stripslashes($str);
  4. file_put_contents($filename,$str);


-----
PostgreSQL DBA
 
 Top
qte
Отправлено: 01 Сентября, 2011 - 11:05:38
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Сент. 2011  


Помог: 0 раз(а)




Мелкий, большое спасибо Улыбка
я по привычке всякие стандартные операции скриптов беру из своих же старых кодов, написанных, видимо, еще в те времена, когда более современных функций еще не существовало Улыбка
Всё вроде бы работает в таком виде и выглядит куда лучше
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB