Допустим есть у нас вот такой php-код: Код (Text): eval("bla-bla-bla echo('$param_from_post'); bla-bla-bla"); Достаточно ли для 100% безопасности сделать addslashes для внешних параметров, или будет оставаться какая-то возможность провести инъекцию?
_DEN_ Мне кажется, что при таком использовании возможна утечка информации, потому что в $param_from_post могут оказаться всякие $ с именами переменных, которые экранироваться не будут, и попав в eval могут быть заменены на значения. А вдруг в переменной пароль был?)
Black_mirror Ок, если это не echo, а mail на служебную почту? То есть переменные можно выводить. Тогда есть опасность? Если $param_from_post = blabla $(put_your_injectoin_here) blabla - внутри $() ведь можно любой код отработать?
_DEN_ На счёт выполнить код не знаю. В исходном варианте дыр я не вижу. Но может у кого-то зрение лучше. А вот если будет eval("bla-bla-bla echo(\"$param_from_post\"); bla-bla-bla"); То тут уже можно попытаться угадать имя какой-то важной переменной и увидеть её содержимое.
Код (Text): <?php class A{ function do_bad(){ echo('do_bad'); } } if(isset($_POST['eval'])){ $a=new A(); $text=addslashes($_POST['text']); eval("echo(\"$text\");"); } ?><html><body><form method=post> <input type='text' name='text' size=40 /> <input type='submit' name='eval' value='eval'/> </form></body></html> Если в текстовое поле ввести {$a->do_bad()}, то это метод успешно будет выполнен. Но здесь используются двойные кавычки. Возможно что если все переменные попадающие в eval заключать в одинарные кавычки и добавлять к ним слеши, то пролезть никуда будет нельзя. Хотя мне очень любопытно, для какой такой задачи eval потребовался?!
eval нужен для динамической генерации кода пхп, но, само по себе, создаёт кучу проблем с безопасностью. Ден, ты что АИ на пхп задумал строкать? c eval о 100% секуре забудь + доп. траблы с глюками в коде
Black_mirror, UbIvItS Так, вернемся к нашим инъекциям eval потребовался для скриптинга в движке сайта. Если статические read-only отображения вполне себе описываются различными data-driven схемами, то вот с сохранением данных все сложнее. Описать логику обработки входящих данных data-driven схемами как-то нереально сложно. Например, если по post-запросу нужно сформировать из его содержимого какое-то сообщение, отправить его по почте, добавить запись в базу и сделать запись в лог. Как это все подчинить каким-то схемам - я пока что слабо представляю. Поэтому пока что думаю что наиболее легкий вариант - введение понятия Task, которую нужно отработать по запросу. Task - фрагмент скрипта + документированное апи, которым вносятся соответствующие изменения или как-то обрабатываются входящие данные. Если есть идеи получше, то я с радостью их выслушаю
"Данных"? эт малость расплывчито звучит. обычно данные получаемые и передаваемые имеют стат.структуру и без проблем обрабатываются стат. кодом. можно ли более подробно: что за сайт, ф чём его миссия?
UbIvItS Это не сайт, а двежог. То есть чоткой мисеи нет. А под каждый случай обработки код не напишешь.
_DEN_, ну, знаешь ли написать движО_огЪ под все случаи жизни занятие сомнительное, самое лучшее решение: внедрить поддержку плугинов.. все остальные идеи можно положить для книжечки о светлом будущем новых тех-гий.