Changeset 6269866


Ignore:
Timestamp:
Nov 5, 2014 4:04:21 PM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
945988d
Parents:
ecc72e6
Message:

SU3 News: Blacklist HTML event-handler attributes in content

File:
1 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java

    recc72e6 r6269866  
    1717import net.i2p.util.Log;
    1818import org.cybergarage.util.Debug;
     19import org.cybergarage.xml.Attribute;
    1920import org.cybergarage.xml.Node;
    2021import org.cybergarage.xml.ParserException;
     
    4445    }));
    4546
     47    // http://www.w3.org/TR/html-markup/global-attributes.html#common.attrs.event-handler
     48    private static final Set attributeBlacklist = new HashSet(Arrays.asList(new String[] {
     49        "onabort", "onblur", "oncanplay", "oncanplaythrough", "onchange", "onclick",
     50        "oncontextmenu", "ondblclick", "ondrag", "ondragend", "ondragenter", "ondragleave",
     51        "ondragover", "ondragstart", "ondrop", "ondurationchange", "onemptied",
     52        "onended", "onerror", "onfocus", "oninput", "onivalid", "onkeydown", "onkeypress",
     53        "onkeyup", "onload", "onloadeddata", "onloadedmetadata", "onloadstart",
     54        "onmousedown", "onmousemove", "onmouseout", "onmouseover", "onmouseup",
     55        "onmousewheel", "onpause", "onplay", "onplaying", "onprogress", "onratechange",
     56        "onreadystatechange", "onreset", "onscroll", "onseeked", "onseeking", "onselect",
     57        "onshow", "onstalled", "onsubmit", "onsuspend",
     58        "ontimeupdate", "onvolumechange", "onwaiting"
     59    }));
     60
    4661    /**
    4762     *  The action taken when encountering a non-whitelisted
    48      *  XHTML element in the feed content.
     63     *  XHTML element or blacklisted attribute in the feed content.
    4964     */
    5065    public enum XHTMLMode {
    51         /** abort the parsing on any non-whitelisted element */
     66        /** abort the parsing on any non-whitelisted element or blacklisted attribute */
    5267        ABORT,
    53         /** remove only the non-whitelisted element */
     68        /** remove only the non-whitelisted element, or element containing a blacklisted attribute */
    5469        REMOVE_ELEMENT,
    55         /** skip the feed entry containing the non-whitelisted element */
     70        /** remove only the non-whitelisted element, remove only the blacklisted attribute  */
     71        REMOVE_ATTRIBUTE,
     72        /** skip the feed entry containing the non-whitelisted element or blacklisted attribute */
    5673        SKIP_ENTRY,
    57         /** disable whitelist checks */
     74        /** disable all whitelist and blacklist checks */
    5875        ALLOW_ALL
    5976    }
     
    246263                            e = null;
    247264                            break;
     265                          case REMOVE_ATTRIBUTE:
    248266                          case REMOVE_ELEMENT:
    249267                            if (_log.shouldLog(Log.WARN))
     
    296314              case SKIP_ENTRY:
    297315                throw new I2PParserException("Invalid XHTML element \"" + name + '"');
     316              case REMOVE_ATTRIBUTE:
    298317              case REMOVE_ELEMENT:
    299                 // fixme this screws up the iteration
    300318                if (_log.shouldLog(Log.WARN))
    301319                    _log.warn("Removing element: " + node);
     
    308326            }
    309327        }
     328        for (int i = 0; i < node.getNAttributes(); i++) {
     329            Attribute attr = node.getAttribute(i);
     330            String aname = attr.getName();
     331            if (attributeBlacklist.contains(aname.toLowerCase(Locale.US))) {
     332                switch (_mode) {
     333                  case ABORT:
     334                  case SKIP_ENTRY:
     335                    throw new I2PParserException("Invalid XHTML element \"" + name + "\" due to attribute " + aname);
     336                  case REMOVE_ELEMENT:
     337                    if (_log.shouldLog(Log.WARN))
     338                        _log.warn("Removing element: " + node + " due to attribute " + aname);
     339                    node.getParentNode().removeNode(node);
     340                    return true;
     341                  case REMOVE_ATTRIBUTE:
     342                    if (_log.shouldLog(Log.WARN))
     343                        _log.warn("Removing attribute: " + aname + " from " + node);
     344                    // sadly, no removeAttribute(int)
     345                    if (node.removeAttribute(attr))
     346                        i--;
     347                    break;
     348                  case ALLOW_ALL:
     349                    if (_log.shouldLog(Log.WARN))
     350                        _log.warn("Allowing blacklisted attribute by configuration: " + node);
     351                    break;
     352                }
     353            }
     354        }
    310355        int count = node.getNNodes();
    311356        for (int i = 0; i < node.getNNodes(); i++) {
     
    335380            Debug.initialize(ctx);
    336381            NewsXMLParser parser = new NewsXMLParser(ctx);
    337             parser.setXHTMLMode(XHTMLMode.ABORT);
    338             //parser.setXHTMLMode(XHTMLMode.REMOVE_ELEMENT);
    339             //parser.setXHTMLMode(XHTMLMode.SKIP_ENTRY);
    340             //parser.setXHTMLMode(XHTMLMode.ALLOW_ALL);
     382            if (args.length > 1) {
     383                XHTMLMode mode = XHTMLMode.valueOf(args[1]);
     384                parser.setXHTMLMode(mode);
     385            } else {
     386                parser.setXHTMLMode(XHTMLMode.ABORT);
     387            }
    341388            parser.parse(new File(args[0]));
    342389            NewsMetadata ud = parser.getMetadata();
Note: See TracChangeset for help on using the changeset viewer.