All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jn.agileway.web.security.xss.HtmlEventHandlerXssHandler Maven / Gradle / Ivy

package com.jn.agileway.web.security.xss;

import com.jn.langx.annotation.NotThreadSafe;
import com.jn.langx.lifecycle.InitializationException;
import com.jn.langx.util.Objs;
import com.jn.langx.util.collection.Pipeline;
import com.jn.langx.util.function.Functions;

import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@NotThreadSafe
public class HtmlEventHandlerXssHandler extends AbstractXssHandler {

    private static final Pattern pattern = Pattern.compile("[<'\"=]");

    private static final Pattern onXxxPattern = Pattern.compile("on[a-z]+", Pattern.CASE_INSENSITIVE);

    static final Set DEFAULT_ON_XXX_FUNCTION_NAMES = new LinkedHashSet<>();
    private Set functionNames = new HashSet();

    static {
        DEFAULT_ON_XXX_FUNCTION_NAMES.addAll(Pipeline.of(
                "onAbort",
                "onActivate",
                "onAfterPrint",
                "onAfterUpdate",
                "onBeforeActivate",
                "onBeforeCopy",
                "onBeforeCut",
                "onBeforeDeactivate",
                "onBeforeEditFocus",
                "onBeforePaste",
                "onBeforePrint",
                "onBeforeUnload",
                "onBegin",
                "onBlur",
                "onBounce",
                "onCellChange",
                "onChange",
                "onClick",
                "onContextMenu",
                "onControlSelect",
                "onCopy",
                "onCut",
                "onDataAvailable",
                "onDataSetChanged",
                "onDataSetComplete",
                "onDblClick",
                "onDeactivate",
                "onDrag",
                "onDragEnd",
                "onDragLeave",
                "onDragEnter",
                "onDragOver",
                "onDragDrop",
                "onDrop",
                "onEnd",
                "onError",
                "onErrorUpdate",
                "onFilterChange",
                "onFinish",
                "onFocus",
                "onFocusIn",
                "onFocusOut",
                "onHelp",
                "onKeyDown",
                "onKeyPress",
                "onKeyUp",
                "onLayoutComplete",
                "onLoad",
                "onLoseCapture",
                "onMediaComplete",
                "onMediaError",
                "onMouseDown",
                "onMouseEnter",
                "onMouseLeave",
                "onMouseMove",
                "onMouseOut",
                "onMouseOver",
                "onMouseUp",
                "onMouseWheel",
                "onMove",
                "onMoveEnd",
                "onMoveStart",
                "onOutOfSync",
                "onPaste",
                "onPause",
                "onProgress",
                "onPropertyChange",
                "onReadyStateChange",
                "onRepeat",
                "onReset",
                "onResize",
                "onResizeEnd",
                "onResizeStart",
                "onResume",
                "onReverse",
                "onRowsEnter",
                "onRowExit",
                "onRowDelete",
                "onRowInserted",
                "onScroll",
                "onSeek",
                "onSelect",
                "onChange",
                "onSelectStart",
                "onStart",
                "onStop",
                "onSyncRestored",
                "onSubmit",
                "onTimeError",
                "onTrackChange",
                "onUnload",
                "onURLFlip").map(Functions.toLowerCase()).asList()
        );
    }


    @Override
    protected void doInit() throws InitializationException {
        if (Objs.isEmpty(functionNames)) {
            functionNames = DEFAULT_ON_XXX_FUNCTION_NAMES;
        }
    }

    public void setFunctionNames(Collection functionNames) {
        this.functionNames = Pipeline.of(functionNames).clearNulls().map(Functions.toLowerCase()).asSet(true);
    }

    protected boolean isAttack(String value) {
        init();
        if (Objs.isEmpty(value)) {
            return false;
        }
        if (value.length() < 6) {
            return false;
        }
        boolean hasBadCode = pattern.matcher(value).find();
        if (!hasBadCode) {
            return false;
        }

        Matcher m = onXxxPattern.matcher(value);
        while (m.find()) {
            String name = m.group();
            name = name.toLowerCase();
            if (functionNames.contains(name)) {
                return true;
            }
        }
        return false;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy