2011-02-10 2 views
2

Я создаю приложение Rails, которое имеет элемент электронной коммерции для нескольких клиентов - и я бы хотел, чтобы эти клиенты могли указать в области администратора формула для расчета их стоимости доставки; для методов могут отличаться.Интерпретация введенных пользователем выражений (надежно) в Ruby

Давайте пока притворимся, что я разрешил им вводить код рубина, а затем я позже (в момент вычисления доставки заказа) дал результат - он был бы довольно гибким, так как, если бы я некоторые соответствующие переменные заранее настройки, они могут ввести различные формулы, такие как:

  • 5,00 # статический сумма - всегда заряд 5.00
  • order.total * 0,1 # 10% от стоимости заказа
  • [заказ.только * 0,1, 3,00] .max # 10% от общего количества, или 3,00, в зависимости от того, что больше
  • order.shipping_abroad? ? 10,00: 5,00 # 10,00 для зарубежных клиентов, 5,00 для внутреннего

... и, конечно же, сто вариаций на эти темы.

Теперь проблема заключается в том, что eval'ing их кода, поскольку ruby ​​будет кошмаром безопасности, позволяющим им выходить в систему, получать доступ к моей базе данных и, как правило, наносить ущерб, будь то случайно или по дизайну. По моему мнению, SAFE не является гарантией безопасности.

Итак, мой фактический вопрос (да, у меня есть один, в конце концов!) Есть: есть простой, безопасный язык сценариев, с помощью которого я могу позволить пользователям вводить выражения (используя переменные, которые я предварительно запустил) и позже вычислять результаты выражений, но не позволяет системные вызовы, доступ к db и т. д.?

Я должен уметь интерпретировать и запускать язык из рубина, но сам язык не обязательно должен быть рубином - это может быть почти что угодно, хотя я бы предпочел, чтобы он был достаточно читабельным для клиентов , и иметь возможность справиться с теми выражениями, которые я использую в примере с ruby ​​выше. Брауни указывает, есть ли у меня возможность синтаксиса - проверьте выражение, когда они вводят его, чтобы указать на очевидные ошибки для клиента.

(Если, конечно, вы не можете указать меня в сторону, как это сделать «безопасный», песочницы Eval в рубин, которое отвечало бы требованиям, а также.)

+0

или переопределить что-нибудь !! – OscarRyz

ответ

1

Для ввода произвольных значений I предложили бы взглянуть на что-то вроде Liquid Templates или Radiant Tags - вы можете создать свой собственный язык шаблонов, который изолирует интерпретируемый код.

Другим подходом будет использование JavaScript (или CoffeeScript) и интеграция с JS-интерпретатором - существует ряд инструментов, которые соединяют Ruby с различными JS VM.

Сказанное, я думаю, что было бы проще просто справиться с этим через некоторый интеллектуальный интерфейс, вместо того, чтобы пользователи вводили уравнения. Выберите пару наиболее вероятных вариантов доставки и создайте набор виджетов для ввода значений, которые затем можно просто проверить как целые числа.

Каждый из вас примеров можно было на самом деле быть обработаны с использованием этого подхода

  • Всегда заряжайте: $ X
  • X% от стоимости заказа
  • X% от общей суммы, или $ Y, в зависимости от больше

Безопасный и, возможно, более дружелюбный подход с точки зрения UX.

+0

Спасибо за ваш комментарий. Там есть хорошие идеи; Я довольно нарисован вашим предложением Javascript (возможно, johnson или therubyracer), хотя один из ваших вариантов шаблонов может быть жизнеспособным, если они справляются с достаточно сложными выражениями; Я проверю их! – NeilS

0

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

Lua всегда был известен как таковой.

Смежные вопросы