Font Grabber Test

by skibulk

HTML

<p id="sample1">Sample One: CSS Import WOFF</p>
<p id="sample2">Sample Two: CSS Base64</p>

CSS

@import url(https://fonts.googleapis.com/css?family=Open+Sans);
#sample1 {
  font-family: 'Open Sans', sans-serif;
}

@font-face {
  font-family: 'processingjs';
  src: url('data:font;base64,AAEAAAAKAIAAAwAgT1MvMiSxS3IAAAEoAAAATmNtYXAADABgAAABgAAAACxnbHlmNXNjoQAAAbQAAAAUaGVhZP2LrX8AAACsAAAANmhoZWEApAP5AAAA5AAAACRobXR4BEQACgAAAXgAAAAIbG9jYQAKAAAAAAGsAAAABm1heHAABAADAAABCAAAACBuYW1lAEQQrwAAAcgAAAA4cG9zdP/0AAQAAAIAAAAAIAABAAAAAQAA68O6h18PPPUACwBAAAAAAM8VOAYAAAAAzxU4BgAKAAAAOgA4AAAABgABAAAAAAAAAAEAAABM/+wAEgQAAAoACgA6AAEAAAAAAAAAAAAAAAAAAAACAAEAAAACAAMAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiAZAABQAIACgAKAAAAAYAKAAoAAAAHgADAA8AAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEwgIABAAC0ALQAt//MABwBMABQAAAQAAAAARAAKAAAAAQADAAEAAAAMAAQAIAAAAAQABAABAAAALf//AAAALf///9QAAQAAAAAAAAAAAAoAAAABAAoAAAA6ADgAAgAAMyM1OjA4AAAABAA2AAMAAQQJAAEAAgAAAAMAAQQJAAIAAgAAAAMAAQQJAAMAAgAAAAMAAQQJAAQAAgAAAHMAAwAAAAAAAP/xAAQAAAAAAAAAAAAAAAAAAAAAAAAAAA==');
  font-weight: normal;
  font-style: normal;
}

#sample2 {
  font-family: processingjs, sans-serif;
}

JavaScript

// Potential Blocks
// url(honeypot.woff) => Ban IP
// JS generate false positives
// JS onHover decode & apply font
// JS onBlur remove font
// JS disable text selection
// JS transparent barrier
// CSS Cross Origin: Cannot read rules using JS

var text = document.documentElement.innerHTML + "\r\n";
text += read_css(document.styleSheets);
//console.log(text);

function read_css(css) {
  var out = '';
  var i = 0,
	    il = css.length;
  for (; i < il; i++) {
    var rules = css[i].rules || css[i].cssRules;
    var j = 0,
  	    jl = rules.length;
    for (; j < jl; j++) {
      var rule = rules[j];
      console.log(rule);
      if (rule.stylesheet)
      {
  	    out += read_css(rule.stylesheet) + "\r\n";
      }
      else
      {
	      out += rule.cssText + "\r\n";
      }
    }
  }
  return out;
}

// Regex
// Base64 ignores white space
// Cannot validate (length // 4) without excessive processing
// Can validate length > 544 bytes minimum file size
var regex = /([A-Za-z0-9\+\/\\\s]{544,}[=]{0,2})/gm;