@asdasda11

Как проверить безопасность params?

route такого характера:
match '*path', to:'public#index'
Прийти могут разные параметры. Они, скажем так, динамические. Но мне нужно проверить каждый из них на безопасность, если так можно выразиться. Например, приходит params[:command]. Как мне проверить, что внутри параметра нет ничего хитрого? Т.е. ни скриптов, ни чего-то ещё. У меня почти сразу этот params[:command] отправляется в консоль операционки, т.е. будет исполняться в системе. А потом он же - полезет в БД и ещё будет показываться на странице. Выходит, что мне его проверять на каждом отдельном направлении или можно как-то разом?

Пример. Допустим придёт запрос: localhost:3000/command="rm -rf /"

Если его сразу отправлю в исполнение, то будет всё плохо. Но и проверять каждую команду не могу. А если в нём будет ещё xss и sql injection?.....
  • Вопрос задан
  • 296 просмотров
Решения вопроса 1
@mletov
По поводу sql:
используйте параметризированные sql запросы или какой-нибудь ORM или конструктор sql запросов (по-моему, сейчас каждый язык/фреймворк что-нибудь такое имеет).

По поводу xss:
Вырезать регуляркой тег script, или вообще не выполнять дальше действий, если такой есть в запросе. Экранируйте, заменяйте теги спецсимволами и т д.
Некоторые продвинутые фреймворки сами не дают сохранить такой код, пишут что-то вроде "Обнаружено потенциально опасное содержимое запроса"

По поводу запроса:
Вы отправляете входящие данные в консоль. Как я понимаю, в любом случае это будет команда Linux, может вредоносная, может разрешенная, но команда.

Значит легкого пути не будет. Какие варианты можно рассмотреть:
1) Если количество разрешенных команд конечно, то просто присвойте им порядковые номера типа localhost:3000/command=1, localhost:3000/command=2...
И в зависимости от переданного номера выполняйте команду.
2) Если количество команд не ограничено, то тут разве что завести пользователя с ограниченными правами, чтобы все команды, переданные запросом, выполнялись под ним.
3) Если количество команд ограничено, но у них есть опциональные параметры (типа там путь к аудитории, имя создаваемого файла и т д), то, как уже предложил dimonchik2013, забейте все допустимые шаблоны в regex.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@lebron32rus
Senior Software Engineer
Выполнять на сервере команды которые пришли из внешнего мира это не самое удачное решение. Будет лучше если вы определитесь с функциями которые пользователи будут выполнять через сервис и сделайте безопасные эндпоинты в которых нет намека на команды терминала. Когда пользователь делает запрос то мы берём строковую константу определенную где то в приложении которая осуществит действие необходимое пользователю. Имхо, это более правильно с точки зрения безопасности.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
регекспом оставляешь только разрешенные символы
Ответ написан
@Pazzik
Не знаю ответа на ваш вопрос. Но знаю кто знает :) На hexlet есть какая то консоль из браузера для выполнения заданий. Она вполне полноценно работает. Можно у авторов в слаке узнать как у них это работает. У них это крутится в докере. Так что подозреваю секрет именно в этом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы