$ fingerprint@info:~ echo $FEATURE-DETECTION
Feature detection should enable browser compatibility. Feature detection makes it easy for website developers to check if a specific feature is available in the client's browser and allows to react based on the result of the feature check. Feature detection is in most cases an alternative to User Agent Sniffing (derive browser capabilities from User Agent).
The availability of Web Standard APIs is implemented differently across all internet browsers and browser versions. Thus, one feature is included in browser X, browser Y needs a plugin, addon or a library for the feature to work correctly and browser Z does not support the feature at all. Given a comprehensive feature test, it is possible to distinguish browser, browser versions, browser settings and active plugins or addons.
Feature detection as an important tool for web developers will always be possible in certain circumstances,
if a specific feature support is evaluated in the browser.
Known feature detection tests or frameworks can be blocked, but in general, it will be possible to check
if your browser supports a specific feature.
Although this could be avoided by disabling JavaScript or block feature tests altogether,
but then the browser is like 'WorldWideWeb' (the first web browser),
which cannot process or display modern websites and honest websites cannot detect and/or use a feature needed.
Extensive feature tests can be limited by a threshold, which defines the number of checks that a website is allowed to perform (during a given time interval).
But defining a threshold, whichs blocks Feature Fingerprinting while still allowing feature-rich websites to work properly, can be challenging.
Version info can also easily be obtained by feature detection based on features that have no setting options and therefore cannot be changed by the end user.
This is demonstrated by a PoC (Proof of Concept) to identify Firefox versions 60 to 67 TorZillaPrint (Source
code:
TorZillaPrint - getVerNo())
Unwise counter-measures:
$ fingerprint@info:~ run feature-detection
The table below shows the result of the feature detection made with Modernizr.
A hash is calculated from 298 Modernizr feature support results which serves as a feature fingerprint.
A low-level feature fingerprint is the count of supported features.
Feature Description | Modernizr Test | Support |
---|
Ambient Light Events | Modernizr.ambientlight | no |
Application Cache | Modernizr.applicationcache | no |
HTML5 Audio Element | Modernizr.audio | no |
HTML5 Audio mp3 | Modernizr.audio.mp3 | no |
HTML5 Audio m4a | Modernizr.audio.m4a | no |
HTML5 Audio ogg | Modernizr.audio.ogg | no |
HTML5 Audio wav | Modernizr.audio.wav | no |
Battery API | Modernizr.batteryapi | no |
Blob constructor | Modernizr.blobconstructor | no |
Canvas | Modernizr.canvas | no |
Canvas text | Modernizr.canvastext | no |
Content Editable | Modernizr.contenteditable | no |
Context menus | Modernizr.contextmenu | no |
Cookies | Modernizr.cookies | no |
Cross-Origin Resource Sharing | Modernizr.cors | no |
Web Cryptography | Modernizr.crypto | no |
Custom Elements API | Modernizr.customelements | no |
Custom protocol handler | Modernizr.customprotocolhandler | no |
CustomEvent | Modernizr.customevent | no |
Dart | Modernizr.dart | no |
DataView | Modernizr.dataview | no |
Emoji | Modernizr.emoji | no |
Event Listener | Modernizr.eventlistener | no |
EXIF Orientation | Modernizr.exiforientation | no |
Flash | Modernizr.flash | no |
Force Touch Events | Modernizr.forcetouch | no |
Fullscreen API | Modernizr.fullscreen | no |
GamePad API | Modernizr.gamepads | no |
Geolocation API | Modernizr.geolocation | no |
Hashchange event | Modernizr.hashchange | no |
Hidden Scrollbar | Modernizr.hiddenscroll | |
History API | Modernizr.history | no |
HTML Imports | Modernizr.htmlimports | no |
IE8 compat mode | Modernizr.ie8compat | no |
IndexedDB | Modernizr.indexeddb | no |
IndexedDB deletedatabase | Modernizr.indexeddb.deletedatabase | no |
IndexedDB Blob | Modernizr.indexeddbblob | no |
Input attributes | Modernizr.input | no |
Form input types | Modernizr.inputtypes | no |
input[search] search event | Modernizr.inputtypes.search | no |
Form input Telephone | Modernizr.inputtypes.tel | no |
Form input URL | Modernizr.inputtypes.url | no |
Form input E-Mail | Modernizr.inputtypes.email | no |
Form input Date and Time | Modernizr.inputtypes.datetime | no |
Form input Date | Modernizr.inputtypes.date | no |
Form input Month | Modernizr.inputtypes.month | no |
Form input Week | Modernizr.inputtypes.week | no |
Form input Time | Modernizr.inputtypes.time | no |
Form input Local Date and Time | Modernizr['inputtypes']['datetime-local'] | no |
Form input Number | Modernizr.inputtypes.number | no |
Form input Range | Modernizr.inputtypes.range | no |
Form input Color | Modernizr.inputtypes.color | no |
Internationalization API | Modernizr.intl | no |
JSON | Modernizr.json | no |
Font Ligatures | Modernizr.ligatures | no |
Reverse Ordered Lists | Modernizr.olreversed | no |
MathML | Modernizr.mathml | no |
Message Channel | Modernizr.messagechannel | no |
Notification | Modernizr.notification | no |
Page Visibility API | Modernizr.pagevisibility | no |
Navigation Timing API | Modernizr.performance | no |
DOM Pointer Events API | Modernizr.pointerevents | no |
Pointer Lock API | Modernizr.pointerlock | no |
postMessage | Modernizr.postmessage | no |
Proximity API | Modernizr.proximity | no |
QuerySelector | Modernizr.queryselector | no |
Quota Storage Management API | Modernizr.quotamanagement | no |
requestAnimationFrame | Modernizr.requestanimationframe | no |
ServiceWorker API | Modernizr.serviceworker | no |
SVG | Modernizr.svg | no |
Template strings | Modernizr.templatestrings | no |
Touch Events | Modernizr.touchevents | no |
Typed arrays | Modernizr.typedarrays | no |
Unicode Range | Modernizr.unicoderange | no |
Unicode characters | Modernizr.unicode | no |
IE User Data API | Modernizr.userdata | no |
Vibration API | Modernizr.vibrate | no |
HTML5 Video | Modernizr.video | no |
VML | Modernizr.vml | no |
Web Intents | Modernizr.webintents | no |
Web Animation API | Modernizr.webanimations | no |
WebGL | Modernizr.webgl | no |
WebSockets Support | Modernizr.websockets | no |
XDomainRequest | Modernizr.xdomainrequest | no |
a[download] Attribute | Modernizr.adownload | no |
Audio Loop Attribute | Modernizr.audioloop | no |
Audio Preload | Modernizr.audiopreload | no |
Web Audio API | Modernizr.webaudio | no |
Low Battery Level | Modernizr.lowbattery | no |
canvas blending support | Modernizr.canvasblending | no |
canvas.toDataURL type jpeg support | Modernizr.todataurljpeg | no |
canvas.toDataURL type png support | Modernizr.todataurlpng | no |
canvas.toDataURL type webp support | Modernizr.todataurlwebp | no |
canvas winding support | Modernizr.canvaswinding | no |
getRandomValues | Modernizr.getrandomvalues | no |
cssall | Modernizr.cssall | no |
CSS Animations | Modernizr.cssanimations | no |
Appearance | Modernizr.appearance | no |
Backdrop Filter | Modernizr.backdropfilter | no |
CSS Background Blend Mode | Modernizr.backgroundblendmode | no |
CSS Background Clip Text | Modernizr.backgroundcliptext | no |
Background Position Shorthand | Modernizr.bgpositionshorthand | no |
Background Position XY | Modernizr.bgpositionxy | no |
Background Repeat Space | Modernizr.bgrepeatspace | no |
Background Repeat Round | Modernizr.bgrepeatround | no |
Background Size | Modernizr.backgroundsize | no |
Background Size Cover | Modernizr.bgsizecover | no |
Border Image | Modernizr.borderimage | no |
Border Radius | Modernizr.borderradius | no |
Box Shadow | Modernizr.boxshadow | no |
Box Sizing | Modernizr.boxsizing | no |
CSS Calc | Modernizr.csscalc | no |
CSS :checked pseudo-selector | Modernizr.checked | no |
CSS Font ch Units | Modernizr.csschunit | no |
CSS Columns | Modernizr.csscolumns | no |
CSS Grid (old) | Modernizr.cssgridlegacy | no |
CSS Grid (new) | Modernizr.cssgrid | no |
CSS Cubic Bezier Range | Modernizr.cubicbezierrange | no |
CSS Display run-in | Modernizr.displayrunin | no |
CSS Display table | Modernizr.displaytable | no |
CSS text-overflow ellipsis | Modernizr.ellipsis | no |
CSS.escape() | Modernizr.cssescape | no |
CSS Font ex Units | Modernizr.cssexunit | no |
CSS Filters | Modernizr.cssfilters | no |
Flexbox | Modernizr.flexbox | no |
Flexbox (legacy) | Modernizr.flexboxlegacy | no |
Flexbox (tweener) | Modernizr.flexboxtweener | no |
Flex Line Wrapping | Modernizr.flexwrap | no |
CSS :focus-within pseudo-selector | Modernizr.focuswithin | no |
@font-face | Modernizr.fontface | no |
CSS Generated Content | Modernizr.generatedcontent | no |
CSS Gradients | Modernizr.cssgradients | no |
CSS Hairline | Modernizr.hairline | no |
CSS HSLA Colors | Modernizr.hsla | no |
CSS Hyphens | Modernizr.csshyphens | no |
CSS Soft Hyphens | Modernizr.softhyphens | no |
CSS Soft Hyphens Find | Modernizr.softhyphensfind | no |
CSS :invalid pseudo-class | Modernizr.cssinvalid | no |
CSS :last-child pseudo-selector | Modernizr.lastchild | no |
CSS Mask | Modernizr.cssmask | no |
CSS Media Queries | Modernizr.mediaqueries | no |
CSS Multiple Backgrounds | Modernizr.multiplebgs | no |
CSS :nth-child pseudo-selector | Modernizr.nthchild | no |
CSS Object Fit | Modernizr.objectfit | no |
CSS Opacity | Modernizr.opacity | no |
CSS Overflow Scrolling | Modernizr.overflowscrolling | no |
CSS Pointer Events | Modernizr.csspointerevents | no |
CSS position: sticky | Modernizr.csspositionsticky | no |
CSS Generated Content Animations | Modernizr.csspseudoanimations | no |
CSS Generated Content Transitions | Modernizr.csspseudotransitions | no |
CSS Reflections | Modernizr.cssreflections | no |
CSS Regions | Modernizr.regions | no |
CSS Font rem Units | Modernizr.cssremunit | no |
CSS UI Resize | Modernizr.cssresize | no |
CSS rgba | Modernizr.rgba | no |
CSS Stylable Scrollbars | Modernizr.cssscrollbar | no |
Scroll Snap Points | Modernizr.scrollsnappoints | no |
CSS Shapes | Modernizr.shapes | no |
CSS general sibling selector | Modernizr.siblinggeneral | no |
CSS Subpixel Fonts | Modernizr.subpixelfont | no |
CSS Supports | Modernizr.supports | no |
CSS :target pseudo-class | Modernizr.target | no |
CSS text-align-last | Modernizr.textalignlast | no |
CSS textshadow | Modernizr.textshadow | no |
CSS Transforms | Modernizr.csstransforms | no |
CSS Transforms 3D | Modernizr.csstransforms3d | no |
CSS Transforms Level 2 | Modernizr.csstransformslevel2 | no |
CSS Transform Style preserve-3d | Modernizr.preserve3d | no |
CSS Transitions | Modernizr.csstransitions | no |
CSS user-select | Modernizr.userselect | no |
CSS :valid pseudo-class | Modernizr.cssvalid | no |
Variable Open Type Fonts | Modernizr.variablefonts | no |
CSS vh unit | Modernizr.cssvhunit | no |
CSS vmax unit | Modernizr.cssvmaxunit | no |
CSS vmin unit | Modernizr.cssvminunit | no |
CSS vw unit | Modernizr.cssvwunit | no |
will-change | Modernizr.willchange | no |
CSS wrap-flow | Modernizr.wrapflow | no |
classList | Modernizr.classlist | no |
createElement with Attributes | Modernizr.createelementattrs | no |
dataset API | Modernizr.dataset | no |
Document Fragment | Modernizr.documentfragment | no |
[hidden] Attribute | Modernizr.hidden | |
microdata | Modernizr.microdata | no |
DOM4 MutationObserver | Modernizr.mutationobserver | no |
Passive event listeners | Modernizr.passiveeventlisteners | no |
bdi Element | Modernizr.bdi | no |
datalist Element | Modernizr.datalistelem | no |
details Element | Modernizr.details | no |
output Element | Modernizr.outputelem | no |
picture Element | Modernizr.picture | no |
progress bar Element | Modernizr.progressbar | no |
progress meter Element | Modernizr.meter | no |
ruby, rp, rt Elements | Modernizr.ruby | no |
Template Tag | Modernizr.template | no |
time Element | Modernizr.time | no |
Track element | Modernizr.texttrackapi | no |
Timed Text Track | Modernizr.track | no |
Unknown Elements | Modernizr.unknownelements | no |
ES5 Array | Modernizr.es5array | no |
ES5 Date | Modernizr.es5date | no |
ES5 Function | Modernizr.es5function | no |
ES5 Object | Modernizr.es5object | no |
ES5 | Modernizr.es5 | no |
ES5 Strict Mode | Modernizr.strictmode | no |
ES5 String | Modernizr.es5string | no |
ES5 Syntax | Modernizr.es5syntax | no |
ES5 Immutable Undefined | Modernizr.es5undefined | no |
ES6 Array | Modernizr.es6array | no |
ES6 Arrow Functions | Modernizr.arrow | no |
ES6 Collections | Modernizr.es6collections | no |
ES5 String.prototype.contains | Modernizr.contains | no |
ES6 Generators | Modernizr.generators | no |
ES6 Math | Modernizr.es6math | no |
ES6 Number | Modernizr.es6number | no |
ES6 Object | Modernizr.es6object | no |
ES6 Promises | Modernizr.promises | no |
ES6 String | Modernizr.es6string | no |
Motion Events | Modernizr.devicemotion | no |
Orientation Events | Modernizr.deviceorientation | no |
onInput Event | Modernizr.oninput | no |
File API | Modernizr.filereader | no |
Filesystem API | Modernizr.filesystem | no |
input[capture] Attribute | Modernizr.capture | no |
input[file] Attribute | Modernizr.fileinput | no |
input[directory] Attribute | Modernizr.fileinputdirectory | no |
input[form] Attribute | Modernizr.formattribute | no |
input[type="number"] Localization | Modernizr.localizednumber | no |
placeholder attribute | Modernizr.placeholder | no |
form#requestAutocomplete() | Modernizr.requestautocomplete | no |
Form Validation | Modernizr.formvalidation | no |
iframe[sandbox] Attribute | Modernizr.sandbox | no |
iframe[seamless] Attribute | Modernizr.seamless | no |
iframe[srcdoc] Attribute | Modernizr.srcdoc | no |
Animated PNG | Modernizr.apng | no |
Image crossOrigin | Modernizr.imgcrossorigin | no |
JPEG 2000 | Modernizr.jpeg2000 | no |
JPEG XR (extended range) | Modernizr.jpegxr | no |
sizes attribute | Modernizr.sizes | no |
srcset attribute | Modernizr.srcset | no |
Webp Alpha | Modernizr.webpalpha | no |
Webp Animation | Modernizr.webpanimation | no |
Webp Lossless | Modernizr.webplossless | no |
Webp | Modernizr.webp | no |
input formaction | Modernizr.inputformaction | no |
input formenctype | Modernizr.inputformenctype | no |
input formmethod | Modernizr.inputformmethod | no |
input formtarget | Modernizr.inputformtarget | no |
Hover Media Query | Modernizr.hovermq | no |
Pointer Media Query | Modernizr.pointermq | no |
Beacon API | Modernizr.beacon | no |
Low Bandwidth Connection | Modernizr.lowbandwidth | no |
Server Sent Events | Modernizr.eventsource | no |
Fetch API | Modernizr.fetch | no |
XHR responseType='arraybuffer' | Modernizr.xhrresponsetypearraybuffer | no |
XHR responseType='blob' | Modernizr.xhrresponsetypeblob | no |
XHR responseType='document' | Modernizr.xhrresponsetypedocument | no |
XHR responseType='json' | Modernizr.xhrresponsetypejson | no |
XHR responseType='text' | Modernizr.xhrresponsetypetext | no |
XHR responseType | Modernizr.xhrresponsetype | no |
XML HTTP Request Level 2 XHR2 | Modernizr.xhr2 | no |
script[async] | Modernizr.scriptasync | no |
script[defer] | Modernizr.scriptdefer | no |
Speech Recognition API | Modernizr.speechrecognition | no |
Speech Synthesis API | Modernizr.speechsynthesis | no |
Local Storage | Modernizr.localstorage | no |
Session Storage | Modernizr.sessionstorage | no |
Web SQL Database | Modernizr.websqldatabase | no |
style[scoped] | Modernizr.stylescoped | no |
SVG as an <img> tag source | Modernizr.svgasimg | no |
SVG clip paths | Modernizr.svgclippaths | no |
SVG filters | Modernizr.svgfilters | no |
SVG foreignObject | Modernizr.svgforeignobject | no |
Inline SVG | Modernizr.inlinesvg | no |
SVG SMIL animation | Modernizr.smil | no |
textarea maxlength | Modernizr.textareamaxlength | no |
Blob URLs | Modernizr.bloburls | no |
Data URI | Modernizr.datauri | no |
Data URI over 32kb | Modernizr.datauri.over32kb | no |
URL parser | Modernizr.urlparser | no |
URLSearchParams API | Modernizr.urlsearchparams | no |
Video Autoplay | Modernizr.videoautoplay | no |
Video crossOrigin | Modernizr.videocrossorigin | no |
Video Loop Attribute | Modernizr.videoloop | no |
Video Preload Attribute | Modernizr.videopreload | no |
WebGL Extensions | Modernizr.webglextensions | no |
RTC Data Channel | Modernizr.datachannel | no |
getUserMedia | Modernizr.getusermedia | no |
RTC Peer Connection | Modernizr.peerconnection | no |
Binary WebSockets | Modernizr.websocketsbinary | no |
Base 64 encoding/decoding | Modernizr.atobbtoa | no |
Framed window | Modernizr.framed | no |
matchMedia | Modernizr.matchmedia | no |
Workers from Blob URIs | Modernizr.blobworkers | no |
Workers from Data URIs | Modernizr.dataworkers | no |
Shared Workers | Modernizr.sharedworkers | no |
Transferables Objects | Modernizr.transferables | no |
Web Workers | Modernizr.webworkers | no |