Как оценить код Ruby в Haml как переменную

Я играл с рубиновой оценкой в хамле. Это не сработает, если я передам переменную в шаблон haml. это работает только в том случае, если рубиновый код уже находится внутри шаблона (не передается как переменная), я делюсь своим исходным кодом для лучшего объяснения

require 'sinatra'
require 'haml'

get '/' do
  @user_input = params[:foo_user_input]
  puts @user_input
  haml :foo
end

__END__

@@ foo

%p= "hello"
<br>
%p= 7*7
<br>
%p= #{@user_input}
<br>
%p This is #{7*7} cake!
<br>
%p This is #{@user_input} cake!
<br>
%p= @user_input
<br>

если я передам 7*7 в запрос GET, как вы можете видеть, я получу именно 7*7, где он не оценивается как 49. он оценивается только в том случае, если я уже разместил 7*7 в самом шаблоне haml.

hello
49
This is 49 cake!
This is 7*7 cake!
7*7
@user_input — это строка, то есть она эквивалентна '7*7', а не 7*7. Попробуйте интерполировать строку через #{'7*7'} вместо #{7*7}, и вы увидите, что она ведет себя идентично вашей @user_input. И нет, вы не хотите оценивать пользовательский ввод как код Ruby на стороне сервера.
Stefan 26.06.2023 14:42
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите оценить код Ruby, хранящийся в строковой переменной, вы можете использовать eval следующим образом:

%p This is #{eval(@user_input)} cake!    

Предупреждение: Но никогда не передавайте строки для оценки из ненадежного источника. Злоумышленник может передать вашему методу код, который загружает наши пароли на их сервер или удаляет ваш жесткий диск.

Спасибо, так что нельзя передать его как переменную без eval?

fooBar 26.06.2023 12:11

Все, что передается из браузера в веб-приложение, передается в виде строки. Вы можете перевести эти строки в целое число, дату или что-то еще. Но этот перевод должен иметь смысл (например, вы не можете перевести «foo» в число) и он должен быть безопасным, потому что вы не можете доверять клиенту. В этом примере я вижу только два варианта: 1) оценить строку на клиенте в браузере и отправить результат только на сервер. Или проанализируйте строку шаг за шагом, чтобы убедиться, что она содержит только числа и операторы и поэтому может считаться безопасной перед оценкой.

spickermann 26.06.2023 14:16

Есть такие инструменты, которые просто занимаются математикой.

tadman 26.06.2023 16:32

Другие вопросы по теме