Концепция GString в Groovy довольно мощная (см. http://groovy.codehaus.org/Strings+and+GString).
GStrings позволяют вам делать такие вещи, как:
world = "World"
println "Hello ${world}"
# Output: Hello World
println "1+2 = ${1+2}"
# Output: 1+2 = 3
println "${System.exit(-1)}"
# Program terminated
Я пытаюсь выяснить, может ли использование Groovy GString: s создать проблемы с безопасностью в вашем коде, подобные атакам с использованием SQL-инъекций.
В приведенном выше примере код был написан автором программы, поэтому выполнение команды System.exit (-1) не может рассматриваться как недостаток безопасности, поскольку это было заявленным намерением автора.
Допустим, я пишу веб-приложение Grails, где пользовательский ввод берется из полей формы (чтение параметров POST / GET) и таблиц базы данных (с использованием GORM). Предположим, что злоумышленник контролирует как то, что отправляется на сервер в виде запросов POST / GET, так и то, что находится в базе данных.
Код в моем приложении выглядит так:
def str1 = params.someParameterControlledByTheAttacker
def str2 = SomeGORMPersistedObject.get(1).somePropertyFieldControlledByTheAttacker
render "Hello! Here is some text: ${str1} and ${str2}"
Есть ли способ, которым злоумышленник может выполнить код в приведенном выше сценарии? Зачем? Почему бы и нет? Моя первоначальная гипотеза заключается в том, что использование GString всегда безопасно. Пожалуйста, не стесняйтесь доказать, что я неправ. Пожалуйста, будьте как можно конкретнее.
Обновление № 1: Чтобы сфокусировать обсуждение, пожалуйста, не обращайте внимания на любые проблемы HTML-XSS в коде, так как этот вопрос касается выполнения кода на стороне сервера, а не на стороне клиента.
Обновление № 2: Некоторые люди отмечают, что "обычно неплохо отфильтровывать нежелательные строки". Хотя отфильтровывание «потенциально плохих символов» может, безусловно, избавить вас от некоторых проблем с безопасностью, было бы еще лучше написать код, который был бы безопасным даже без фильтрации. Вы можете сравнить его с использованием PreparedStatements в Java JDBC API - правильное использование PreparedStatements гарантировано , чтобы уберечь вас от определенных классов атак внедрения. Фильтрация вашего ввода SQL, вероятно, даст вам тот же результат, но использование PreparedStatements строго доминирует в подходе фильтрации IMHO.