├── evercookie.fla
├── evercookie.swf
├── evercookie.xap
├── evercookie_sl
├── evercookie.suo
├── evercookie
│ ├── Bin
│ │ └── Debug
│ │ │ ├── evercookie.dll
│ │ │ ├── evercookie.pdb
│ │ │ ├── evercookie.xap
│ │ │ ├── AppManifest.xaml
│ │ │ └── evercookieTestPage.html
│ ├── obj
│ │ └── Debug
│ │ │ ├── evercookie.dll
│ │ │ ├── evercookie.pdb
│ │ │ ├── evercookie.g.resources
│ │ │ ├── DesignTimeResolveAssemblyReferences.cache
│ │ │ ├── DesignTimeResolveAssemblyReferencesInput.cache
│ │ │ ├── XapCacheFile.xml
│ │ │ ├── evercookie.csproj.FileListAbsolute.txt
│ │ │ ├── App.g.cs
│ │ │ ├── App.g.i.cs
│ │ │ ├── MainPage.g.cs
│ │ │ └── MainPage.g.i.cs
│ ├── Properties
│ │ ├── AppManifest.xml
│ │ └── AssemblyInfo.cs
│ ├── App.xaml
│ ├── MainPage.xaml
│ ├── evercookie.csproj.user
│ ├── MainPage.xaml.cs
│ ├── App.xaml.cs
│ └── evercookie.csproj
└── evercookie.sln
├── README.md
├── ChangeLog
├── evercookie_cache.php
├── evercookie_etag.php
├── evercookie.php
├── evercookie_png.php
├── example.html
├── swfobject-2.2.min.js
├── index.php
├── evercookie.js
└── jquery-1.4.2.min.js
/evercookie.fla:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie.fla
--------------------------------------------------------------------------------
/evercookie.swf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie.swf
--------------------------------------------------------------------------------
/evercookie.xap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie.xap
--------------------------------------------------------------------------------
/evercookie_sl/evercookie.suo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie_sl/evercookie.suo
--------------------------------------------------------------------------------
/evercookie_sl/evercookie/Bin/Debug/evercookie.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie_sl/evercookie/Bin/Debug/evercookie.dll
--------------------------------------------------------------------------------
/evercookie_sl/evercookie/Bin/Debug/evercookie.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie_sl/evercookie/Bin/Debug/evercookie.pdb
--------------------------------------------------------------------------------
/evercookie_sl/evercookie/Bin/Debug/evercookie.xap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie_sl/evercookie/Bin/Debug/evercookie.xap
--------------------------------------------------------------------------------
/evercookie_sl/evercookie/obj/Debug/evercookie.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie_sl/evercookie/obj/Debug/evercookie.dll
--------------------------------------------------------------------------------
/evercookie_sl/evercookie/obj/Debug/evercookie.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie_sl/evercookie/obj/Debug/evercookie.pdb
--------------------------------------------------------------------------------
/evercookie_sl/evercookie/obj/Debug/evercookie.g.resources:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie_sl/evercookie/obj/Debug/evercookie.g.resources
--------------------------------------------------------------------------------
/evercookie_sl/evercookie/obj/Debug/DesignTimeResolveAssemblyReferences.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie_sl/evercookie/obj/Debug/DesignTimeResolveAssemblyReferences.cache
--------------------------------------------------------------------------------
/evercookie_sl/evercookie/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stereobooster/evercookie/master/evercookie_sl/evercookie/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
--------------------------------------------------------------------------------
/evercookie_sl/evercookie/Properties/AppManifest.xml:
--------------------------------------------------------------------------------
1 |
11 |
28 | Cookie found: uid = currently not set
29 |
30 | Click to create an evercookie. Don't worry, the cookie is a
31 | random number between 1 and 1000, not enough for me to track
32 | you, just enough to test evercookies.
33 |
34 |
35 |
36 | Now, try deleting this "uid" cookie anywhere possible, then
37 |
38 | or
39 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/evercookie_sl/evercookie/obj/Debug/App.g.cs:
--------------------------------------------------------------------------------
1 | #pragma checksum "C:\Users\Ethrel\Documents\Projects\Silverlight\evercookie\evercookie\App.xaml" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "D9A8BE4B3DC1C91D368CA6B44F124B38"
2 | //------------------------------------------------------------------------------
3 | // 22 | 23 |24 |
25 | evercookie is a javascript API available that produces 26 | extremely persistent cookies in a browser. Its goal 27 | is to identify a client even after they've removed standard 28 | cookies, Flash cookies (Local Shared Objects or LSOs), and 29 | others. 30 | 31 | evercookie accomplishes this by storing the cookie data in 32 | several types of storage mechanisms that are available on 33 | the local browser. Additionally, if evercookie has found the 34 | user has removed any of the types of cookies in question, it 35 | recreates them using each mechanism available. 36 | 37 | Specifically, when creating a new cookie, it uses the 38 | following storage mechanisms when available: 39 | - Standard HTTP Cookies 40 | - Local Shared Objects (Flash Cookies) 41 | - Silverlight Isolated Storage 42 | - Storing cookies in RGB values of auto-generated, force-cached 43 | PNGs using HTML5 Canvas tag to read pixels (cookies) back out 44 | - Storing cookies in and reading out Web History 45 | - Storing cookies in HTTP ETags 46 | - Storing cookies in Web cache 47 | - window.name caching 48 | - Internet Explorer userData storage 49 | - HTML5 Session Storage 50 | - HTML5 Local Storage 51 | - HTML5 Global Storage 52 | - HTML5 Database Storage via SQLite 53 | 54 | TODO: adding support for: 55 | - Caching in HTTP Authentication 56 | - Using Java to produce a unique key based off of NIC info 57 | 58 | Got a crazy idea to improve this? Email me! 59 | 60 |61 |
62 |
82 | Cookie found: uid = currently not set
83 |
84 | Click to create an evercookie. Don't worry, the cookie is a
85 | random number between 1 and 1000, not enough for me to track
86 | you, just enough to test evercookies.
87 |
88 |
89 |
90 | Now, try deleting this "uid" cookie anywhere possible, then
91 |
92 | or
93 |
94 |
95 |
96 | 97 | evercookie is written in JavaScript and additionally 98 | uses a SWF (Flash) object for the Local Shared Objects and 99 | PHPs for the server-side generation of cached PNGs and ETags. 100 | 101 | v0.4 BETA, released 10/13/2010 102 | download source here 103 | 104 | Or get it from github: http://github.com/samyk/evercookie 105 | 106 |107 |
108 | What is the point of evercookie? 109 | Evercookie is designed to make persistent data just that, persistent. By 110 | storing the same data in several locations that a client can access, if 111 | any of the data is ever lost (for example, by clearing cookies), the data 112 | can be recovered and then reset and reused. 113 | 114 | Simply think of it as cookies that just won't go away. 115 | 116 | PRIVACY CONCERN! How do I stop websites from doing this? 117 | Great question. So far, I've found that using Private Browsing 118 | in Safari will stop ALL evercookie methods after a browser restart. 119 | 120 | What if the user deletes their cookies? 121 | That's the great thing about evercookie. With all the methods available, 122 | currently thirteen, it only takes one cookie to remain for most, if not all, 123 | of them to be reset again. 124 | 125 | For example, if the user deletes their standard HTTP cookies, LSO data, 126 | and all HTML5 storage, the PNG cookie and history cookies will still 127 | exist. Once either of those are discovered, all of the others will 128 | come back (assuming the browser supports them). 129 | 130 | Why not use EFF's Panopticlick? 131 | Panopticlick is an awesome idea, however the uniqueness really only 132 | helps in consumer machines and typically not systems running in a 133 | business or corporation. Typically those systems are virtually 134 | identical and provide no difference in information where a home 135 | user's laptop would. Evercookie is meant to be able to store the 136 | same unique data a normal cookie would. 137 | 138 | Does this work cross-browser? 139 | If a user gets cookied on one browser and switches to another browser, 140 | as long as they still have the Local Shared Object cookie, the cookie 141 | will reproduce in both browsers. 142 | 143 | Does the client have to install anything? 144 | No, the client simply uses the website without even knowing about the 145 | persistent data being set, just as they would use a website with standard 146 | HTTP cookies. 147 | 148 | Does the server have to install anything? 149 | The server must at least have access to the JavaScript evercookie file. 150 | Additionally, to use Local Shared Object (Flash Cookies) storage, the 151 | evercookie.swf file must be present, and to use the auto-generated PNG 152 | caching, standard caching and ETag storage mechanisms, PHP must be 153 | installed and evercookie_(png|etag|cache).php must be on the server. 154 | 155 | All of these are available in the download. 156 | 157 | Is evercookie open source? 158 | Yes, evercookie is open source. The code is in readable format without 159 | any obfuscation. Additionally, the PHP files are open source as is the 160 | FLA (Flash) code used to generate the SWF Flash object. You can compile 161 | the Flash object yourself or use the pre-compiled version (evercookie.swf). 162 | 163 | How does the PNG caching work? 164 | When evercookie sets a cookie, it accesses evercookie_png.php with a special 165 | HTTP cookie, different than the one used for standard session data. This 166 | special cookie is read by the PHP file, and if found, generates a PNG file 167 | where all the RGB values are set to the equivalent of the session data to 168 | be stored. Additionally, the PNG is sent back to the client browser with 169 | the request to cache the file for 20 years. 170 | 171 | When evercookie retrieves this data, it deletes the special HTTP cookie, 172 | then makes the same request to the same file without any user information. 173 | When the PHP script sees it has no information to generate a PNG with, it 174 | returns a forged HTTP response of "304 Not Modified" which forces the web 175 | browser to access its local cache. The browser then produces the cached 176 | image and then applies it to an HTML5 Canvas tag. Once applied, evercookie 177 | reads each pixel of the Canvas tag, extracting the RGB values, and thus 178 | producing the initial cookie data that was stored. 179 | 180 | How does the Web History storage work 181 | When evercookie sets a cookie, assuming the Web History caching is enabled, 182 | it Base64 encodes the data to be stored. Let's assume this data is "bcde" 183 | in Base64. Evercookie then accesses the following URLs in the background: 184 | google.com/evercookie/cache/b 185 | google.com/evercookie/cache/bc 186 | google.com/evercookie/cache/bcd 187 | google.com/evercookie/cache/bcde 188 | google.com/evercookie/cache/bcde- 189 | These URLs are now stored in history. 190 | 191 | When checking for a cookie, evercookie loops through all the possible Base64 192 | characters on google.com/evercookie/cache/, starting with "a" and moving up, 193 | but only for a single character. Once it sees a URL that was accessed, it 194 | attempts to brute force the next letter. This is actually extremely fast 195 | because no requests are made to theserver. The history lookups are simply 196 | locally in JavaScript using the CSS History Knocker. Evercookie knows it has 197 | reached the end of the string as soon as it finds a URL that ends in "-". 198 |199 |
200 | <script type="text/javascript" src="jquery-1.4.2.min.js"></script>
201 | <script type="text/javascript" src="swfobject-2.2.min.js"></script>
202 | <script type="text/javascript" src="evercookie.js"></script>
203 |
204 | <script>
205 | var ec = new evercookie();
206 |
207 | // set a cookie "id" to "12345"
208 | // usage: ec.set(key, value)
209 | ec.set("id", "12345");
210 |
211 | // retrieve a cookie called "id" (simply)
212 | ec.get("id", function(value) { alert("Cookie value is " + value) });
213 |
214 | // or use a more advanced callback function for getting our cookie
215 | // the cookie value is the first param
216 | // an object containing the different storage methods
217 | // and returned cookie values is the second parameter
218 | function getCookie(best_candidate, all_candidates)
219 | {
220 | alert("The retrieved cookie is: " + best_candidate + "\n" +
221 | "You can see what each storage mechanism returned " +
222 | "by looping through the all_candidates object.");
223 |
224 | for (var item in all_candidates)
225 | document.write("Storage mechanism " + item +
226 | " returned: " + all_candidates[item] + "<br>");
227 | }
228 | ec.get("id", getCookie);
229 |
230 | // we look for "candidates" based off the number of "cookies" that
231 | // come back matching since it's possible for mismatching cookies.
232 | // the best candidate is most likely the correct one
233 | </script>
234 |
235 |
236 | 237 | csshack, best website ever 238 | 239 |240 |
241 | See CONTACT. 242 | 243 |244 |
245 | Questions or comments, email me: code@samy.pl. 246 | 247 | Visit http://samy.pl for more awesome stuff. 248 | 249 |250 |