春季:结合命令时输入逃逸(Spring: escaping input when binding t

2019-07-31 10:01发布

如何您想从形式的用户输入要htmlEscape'd当你绑定到一个命令对象,你处理的情况下?

我想这是为了避免通过命令对象中的所有领域运行自动净化输入数据。

谢谢。

Answer 1:

如果你正在使用的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() : "");
    }
}

希望这有助于你



Answer 2:

您可以使用@Valid@SafeHtml从休眠状态验证。 查看详情在https://stackoverflow.com/a/40644276/548473



文章来源: Spring: escaping input when binding to command