[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проверить валидность php-кода в строке
Placido
Возникла необходимость использовать в eval() строку, введенную пользователем на сайте через форму. В связи с этим возникли два вопроса. Первый - как обезопасить себя от возможного "непотребства", которое могут ввести через форму, вроде "echo '<script>...</script>, include и т.п.', и второй - как проверить валидность кода перед вставкой его в eval().

И если по первому вопросу у меня есть мысли, например, проверить введенную строку на содержание "eval(), echo, print и т.д.", то по поводу второго возникли сложности. Если введенный код невалиден, до интерпретатор выдает ошибку парсинга, как отловить которую я не знаю. Пробовал использовать set_error_handler(), но оказалось, что "It is not possible to catch a parse error in eval() using set_error_handler().".

Поэтому прошу помощи. Подскажите, можно как-то проверить валидность php-кода, содержащегося в строке?



Спустя 11 минут, 12 секунд (22.07.2012 - 18:52) kamanch написал(а):
Я так полагаю, что универсалного решения нет.
Сузить вопрос нужно. Что ожидается получить от пользователя? Что ему можно вводить?
Одно дело арифметику, другое управляющие конструкции.

Спустя 8 минут, 31 секунда (22.07.2012 - 19:00) killer8080 написал(а):
Цитата (Placido @ 22.07.2012 - 18:41)
Возникла необходимость использовать в eval() строку, введенную пользователем на сайте через форму. В связи с этим возникли два вопроса. Первый - как обезопасить себя от возможного "непотребства", которое могут ввести через форму, вроде "echo '<script>...</script>, include и т.п.', и второй - как проверить валидность кода перед вставкой его в eval().


Выбросить эту дурную затею из головы smile.gif
Уверен что задачу можно решить как то иначе, давать юзеру в руки eval == 'самоубийство'

Спустя 6 минут, 16 секунд (22.07.2012 - 19:07) kamanch написал(а):
killer8080
Мы же задачу не знаем.
Может там какой-нидь онлайн-тренажер по php

Спустя 3 минуты, 4 секунды (22.07.2012 - 19:10) killer8080 написал(а):
Цитата (h.n.81 @ 22.07.2012 - 19:07)
Мы же задачу не знаем.


Какой бы она не была, открывать дыру на сайте не вариант.
Кстати, хороший вопрос, Placido а в чем состоит задача?

Спустя 11 минут, 55 секунд (22.07.2012 - 19:22) Placido написал(а):
Есть у меня свой онлайн-редактор текста (пока на локалхосте), в котором можно использовать регулярные выражения. Делал для себя - работаю контент-менеджером на одном сайте, приходится форматировать и исправлять большие объемы текста - без регулярок никуда. Правила замены сохраняются по категориям, их можно редактировать, добавлять или удалять. До недавнего времени было два типа правил - обычная замена (strtr) и замена по регулярному выражению (preg_replace). Но теперь понадобилось использовать preg_replace_callback. Паттерн и сама callback-функция вводится через форму. Пока все работает ОК, пока я работаю с этим редактором сам, но в будущем планируется разместить редактор на хостинге с доступом к нему других людей. Вот и возник этот вопрос. Если решения не найду, то права на добавление callback-правил оставлю только себе и некоторым админам, чтобы не случилось ничего нехорошего.

Спустя 59 минут, 34 секунды (22.07.2012 - 20:21) killer8080 написал(а):
Цитата (Placido @ 22.07.2012 - 19:22)
До недавнего времени было два типа правил - обычная замена (strtr) и замена по регулярному выражению (preg_replace).


preg_replace то же уязвим, если допускается ввод модификаторов (имеется ввиду модификатор e)
Цитата (Placido @ 22.07.2012 - 19:22)
Если решения не найду, то права на добавление callback-правил оставлю только себе и некоторым админам, чтобы не случилось ничего нехорошего.

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

А нельзя ли это сделать на клиентской стороне? В JS так же есть регулярки.

Спустя 13 минут, 17 секунд (22.07.2012 - 20:34) Placido написал(а):
Нет, возможности вводить модификаторы через форму на сайте нет. Только паттерн и строку замены. По поводу JS не думал, так как знаю его пока только на зачаточном уровне.

Спустя 5 минут, 48 секунд (22.07.2012 - 20:40) killer8080 написал(а):
Цитата (Placido @ 22.07.2012 - 20:34)
По поводу JS не думал, так как знаю его пока только на зачаточном уровне.

ну тогда не помешает заглянуть сюда
http://javascript.ru/RegExp

Спустя 48 минут, 13 секунд (22.07.2012 - 21:28) Семён написал(а):
Сделать вместо явного кода - его псевдо-конструктор.

Спустя 19 минут, 58 секунд (22.07.2012 - 21:48) Placido написал(а):
Цитата (Семён @ 22.07.2012 - 21:28)
Сделать вместо явного кода - его псевдо-конструктор.

Это мысль. Спасибо за идею!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.