Spring: экранирование ввода при привязке к команде - PullRequest
8 голосов
/ 05 августа 2009

Как вы обрабатываете случай, когда вы хотите, чтобы пользовательский ввод из формы был htmlEscape'd, когда вы привязываетесь к объекту команды?

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

спасибо.

Ответы [ 2 ]

10 голосов
/ 05 августа 2009

Если вы используете FormController, вы можете зарегистрировать новый редактор свойств, переопределив метод initBinder (HttpServletReques, ServletRequestDataBinder). Этот редактор свойств может избежать внедрения html, javascript и sql.

Если вы используете редактор свойств, значения из объекта запроса будут обработаны редактором перед присвоением объекту команды.

Когда мы регистрируем редактор, мы должны указать тип элемента, значения которого должны обрабатываться редактором.

Извините, теперь у меня нет синтаксиса метода. Но я уверен, что именно так мы этого добились.

EDITED

Я думаю, что следующий синтаксис может работать

В вашем контроллере переопределите следующий метод, как показано

    @Override
    protected void initBinder(HttpServletRequest request,
        ServletRequestDataBinder binder) throws Exception {
        super.initBinder(request, binder);

        binder.registerCustomEditor(String.class, 
                    new StringEscapeEditor(true, true, false));
    }

Затем создайте следующий редактор свойств

public class StringEscapeEditor extends PropertyEditorSupport {

    private boolean escapeHTML;
    private boolean escapeJavaScript;
    private boolean escapeSQL;

    public StringEscapeEditor() {
        super();
    }

    public StringEscapeEditor(boolean escapeHTML, boolean escapeJavaScript,
            boolean escapeSQL) {
        super();
        this.escapeHTML = escapeHTML;
        this.escapeJavaScript = escapeJavaScript;
        this.escapeSQL = escapeSQL;
    }

    public void setAsText(String text) {
        if (text == null) {
            setValue(null);
        } else {
            String value = text;
            if (escapeHTML) {
                value = StringEscapeUtils.escapeHtml(value);
            }
            if (escapeJavaScript) {
                value = StringEscapeUtils.escapeJavaScript(value);
            }
            if (escapeSQL) {
                value = StringEscapeUtils.escapeSql(value);
            }
            setValue(value);
        }
    }

    public String getAsText() {
        Object value = getValue();
        return (value != null ? value.toString() : "");
    }
}

Надеюсь, это поможет вам

0 голосов
/ 17 ноября 2016

Вы можете использовать @Valid и @SafeHtml из средства проверки гибернации. Подробности смотрите на https://stackoverflow.com/a/40644276/548473

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...