<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1426281128647295476</id><updated>2024-08-29T05:42:59.092-05:00</updated><category term="security"/><category term="daily life"/><category term="web"/><category term="google"/><category term="productivity"/><category term="football"/><category term="gt project"/><category term="testing"/><category term="silverlight"/><category term="moodle"/><category term="flash"/><title type='text'>radi::blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>110</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-8316709357352012049</id><published>2011-07-23T11:40:00.004-05:00</published><updated>2011-07-25T03:07:17.486-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>On DOM Snitch internals and some of the rationales behind them</title><content type='html'>Given some of the feedback I&#39;ve received during the first couple of weeks after releasing &lt;a href=&quot;https://code.google.com/p/domsnitch/&quot; target=_blank&gt;DOM Snitch&lt;/a&gt;, I&#39;d like to shed more light into some of the inner workings of DOM Snitch and the rationales behind some of the decisions that were made while building the tool.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Topic 1: Why is DOM Snitch not catching security issues executing at load time through inline JavaScript?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In its current implementation, DOM Snitch is set to start running on a page as soon as the DOMWindow object is created, but before the DOM tree is built. This allows the extension to act either as soon as it&#39;s instantiated or when any of the DOM modification events get dispatched. Relying on the events, however, comes with a cost and that is the inability to know what caused the event to be dispatched in the first place; therefore resulting in the tool&#39;s inability to gather proper debug information. (I should add the disclaimer that currently DOM Snitch does not use any of the V8 debugging functionality.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Topic 2: Is DOM Snitch using any of the experimental APIs in Chrome?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The short answer is &quot;no&quot;. One of the early goals I set while building the tool was to stay away from experimental APIs or touching the Chromium code base as doing either one of the two will get in the way of deploying easily without changing the security posture of the user. Additionally, using unsupported functionality might result in some maintenance issues further down the line. That being said, I&#39;m quite keen on using the &lt;a href=&quot;https://code.google.com/chrome/extensions/experimental.debugger.html&quot; target=_blank&gt;chrome.experimental.debugger&lt;/a&gt; API should it become supported by the Chromium team.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Topic 3: On innerHTML, outerHTML, and stale pointers inside JavaScript&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stale JavaScript pointers is one side effects that really worries me when intercepting innerHTML. Although, the tool has gone through lots of iterations to getting this right, I must admit that people still find creative ways to introduce a stale pointer somewhere in their code. By giving a bit more detail on how innerHTML is intercepted, I hope that developers will pay some attention as to what may go wrong in their code from a testability perspective. &lt;br /&gt;&lt;br /&gt;In its current version, WebKit does not reveal the internal innerHTML pointers through the getter and setter methods. As a result, by overwriting the innerHTML setter, DOM Snitch loses the value of the original pointer. To counter this, DOM Snitch re-creates the action of setting an element&#39;s innerHTML by appending a new child element and setting the child&#39;s outerHTML to the intended innerHTML value ( and as it turns out, this will force WebKit to throw away the newly created child element and replace it with whatever children that get introduced through the HTML content). You can see this implementation &lt;a href=&quot;https://code.google.com/p/domsnitch/source/browse/trunk/modules/Html.js#108&quot; target=_blank&gt;here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/8316709357352012049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/8316709357352012049?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/8316709357352012049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/8316709357352012049'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2011/07/on-dom-snitch-internals-and-some-of.html' title='On DOM Snitch internals and some of the rationales behind them'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-8373397995386475768</id><published>2011-06-04T01:57:00.004-05:00</published><updated>2011-06-13T15:08:38.516-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Creating spreadsheets in Google Docs... mission possible?</title><content type='html'>Exporting data as spreadsheets into Google Docs sounds easy and quite feasible. However, it also has a few gotcha&#39;s. After struggling for a day, I&#39;ve decided to share my notes on approaching this problem.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Creating the spreadsheet&lt;/span&gt;&lt;br /&gt;My initial requirement for my application is to export my data into a brand new spreadsheet where the user will have ownership of it. A quick stroll through the Spreadsheet API led me to a &lt;a href=&quot;http://code.google.com/apis/spreadsheets/data/3.0/developers_guide.html#CreatingSpreadsheets&quot; target=_blank&gt;section&lt;/a&gt; describing the need to upload a spreadsheet beforehand or create one manually. This was definitely against my requirements. &lt;br /&gt;&lt;br /&gt;However, buried inside the Google Documents List Data API is a mechanism for creating &lt;a href=&quot;http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#CreatingEmptyDocs&quot; target=_blank&gt;empty&lt;/a&gt; documents or from a &lt;a href=&quot;http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#CopyingDocs&quot; target=_blank&gt;template&lt;/a&gt; (I&#39;ll come to this in a minute). Voila!&lt;br /&gt;&lt;br /&gt;Changing the &lt;span style=&quot;font-style:italic;&quot;&gt;term&lt;/span&gt; attribute to &lt;span style=&quot;font-style:italic;&quot;&gt;http://schemas.google.com/docs/2007#spreadsheet&lt;/span&gt; surely does the trick if I want a completely blank spreadsheet.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Feeding data into the spreadsheet&lt;/span&gt;&lt;br /&gt;This is where it becomes more tricky -- as it turns out, there isn&#39;t any convenient way to use the &lt;a href=&quot;http://code.google.com/apis/spreadsheets/data/3.0/developers_guide.html#CreatingListRows&quot; target=_blank&gt;list&lt;/a&gt; approach (something I preferred using as opposed to the &lt;a href=&quot;http://code.google.com/apis/spreadsheets/data/3.0/developers_guide.html#SendingBatchRequests&quot; target=_blank&gt;cell&lt;/a&gt; approach) to populate an empty spreadsheet without first telling Google Docs the schema that your list would use. One bit of observation to make is that the list schema is derived from the header row in your spreadsheet, therefore if the A1 cell stores &quot;sample text&quot; as its value, every subsequent row will have the &quot;A&quot; column described as &amp;lt;gsx:sampletext&amp;gt;. In my case, I opted to use a pre-built template from which to create my spreadsheet (see above about copying documents); however, there might be also a workaround involving batch cell update.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Some random tips&lt;/span&gt;&lt;br /&gt;Here are some random bits that I found useful during this exercise:&lt;br /&gt;- Always pay attention to the response object when posting new items (be it documents, worksheets, list entries, etc.) to Google Docs. The response object will provide you with some very useful information (stored inside the link element of the feed/entry) about what are the next logical APIs to call.&lt;br /&gt;- The _worksheetId_ for the default worksheet in a newly created spreadsheet is... yes, &quot;default&quot;. Should you need to add a row to it, you can simply call &lt;span style=&quot;font-style:italic;&quot;&gt;POST https://spreadsheets.google.com/feeds/list/[spreadsheet key]/default/private/full&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Edit: I went back to experiment with alternative ways of setting the header row of the default worksheet. As expected, one can set the header row by fetching the cells there and updating them with whatever contents they need to have.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/8373397995386475768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/8373397995386475768?isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/8373397995386475768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/8373397995386475768'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2011/06/creating-spreadsheets-in-google-docs.html' title='Creating spreadsheets in Google Docs... mission possible?'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-6870187863684075713</id><published>2011-03-13T17:45:00.005-05:00</published><updated>2011-03-14T04:10:57.913-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>Separating code from data... are we there yet?</title><content type='html'>&lt;span style=&quot;font-style:italic;&quot;&gt;Disclaimer: The opinions in this post are entirely my own and should not be associated with any current or previous employer of mine.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mixing code and data has been a big (and I mean BIG) problem for decades in security. Setting security design flaws aside, having the ability to transform data into code has led to some of the biggest and probably most notorious examples of why software security really matters. Period.&lt;br /&gt;&lt;br /&gt;While there is a lot of progress in handling this problem in native code (examples are plenty: GS, SafeSEH, DEP, ASLR, etc.), where does this leave web? Unlike native applications, the web has one major disadvantage: it relies heavily on parsers that help with the execution of dynamically written code. Browser security aside, there have been a few &lt;a href=&quot;http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet&quot; target=_blank&gt;initiatives&lt;/a&gt; to help developers separate code from data through validating data on input or rendering data in a safe format. Although they&#39;ve been done with a noble intent, I am still not convinced that this is a comprehensive enough solution. Here is why:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Input validation.&lt;/span&gt; Input validation limits the user in submitting data... both malicious and legitimate; therefore limiting the application&#39;s usability and the its users&#39; productivity. For instance, should the folks maintaining the input validation need to be aware of every context in which their data is used (e.g. database query, JavaScript/JSON, HTML, etc.)?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Output encoding/escaping.&lt;/span&gt; Output encoding/escaping is useful for transforming data into a format that is then interpreted as data within the context where the data will be used. However, the major question here is what is the actual context in which the data will be used? In the following sample snippet the data passes through at least 2 different contexts (HTML and JavaScript):&lt;br /&gt;&lt;pre&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;script&amp;gt;&lt;br /&gt;      document.write(&#39;&amp;lt;div id=&quot;&#39; + [USER_CONTROLLED_DATA] + &#39;&quot;&amp;gt;bla&amp;lt;/div&amp;gt;&#39;);&lt;/pre&gt;&lt;br /&gt;So naturally the question: how should the encoding/escaping be done in such cases? According to which context should the encoding/escaping be tailored?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Contextual escaping via templates.&lt;/span&gt; In most cases and if (a big IF) properly enforced, templates are a good thing to use. Needless to say, with their help development teams can streamline a solution to the problem. From that point on lint and checks on commit are the way to go. However, what if the templates are not strictly enforced? What if the development team provides special cases where data should not be escaped? What if data from upstream already comes escaped/encoded?&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;So where does this leave web? I suspect the biggest challenge is to separate the channels through which code and data are communicated. Avoiding or limiting the use of code parsers and eval() (or equivalents of it) for parsing data are definitely steps in the right direction...&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;P.S. - This post has been picking a lot on cross-site scripting as an example. However, the same logic holds for other types of security issues that arise from injection based attacks.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/6870187863684075713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/6870187863684075713?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6870187863684075713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6870187863684075713'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2011/03/separating-code-from-data-are-we-there.html' title='Separating code from data... are we there yet?'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-6983192021107637044</id><published>2011-02-25T15:09:00.004-05:00</published><updated>2011-02-28T12:41:21.870-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>The evil magic of eval</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/Eval&quot; target=_blank&gt;Eval&lt;/a&gt; is a special, very powerful function in many scripting languages. JavaScript is not an exception.  Although quite useful for dynamic manipulation of the existing code, any misuse of eval can cause a lot of problems and headaches. &lt;a href=&quot;http://stackoverflow.com/questions/86513/why-is-using-javascript-eval-function-a-bad-idea&quot; target=_blank&gt;StackOverflow&lt;/a&gt; covers this topic well, with the exception of one very important bit: eval can get in the way of testability.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Static analysis&lt;/span&gt;&lt;br /&gt;With JavaScript being what it is, it is easy to assume that one can painlessly audit the scripting code that runs inside the browser and understand how the client-side part of a web application functions. Well, that&#39;s not entirely true. With web applications becoming more complex, we often run into cases where we have a 60k line obfuscated code that looks a lot like this:&lt;br /&gt;&lt;pre&gt;function a() {&lt;br /&gt; this.c = eval;&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;var b = a();&lt;br /&gt;var d = b.c(e);&lt;/pre&gt;&lt;br /&gt;How should this be tested or audited? Simple answer: you can&#39;t really or at least not easily.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Dynamic analysis&lt;/span&gt;&lt;br /&gt;This leads me to the next bit: what about dynamic analysis? What if we &quot;hook&quot; into eval and listen to the code as it goes by? As it turns out, this isn&#39;t a fool proof solution either. &lt;a href=&quot;http://stackoverflow.com/questions/2566973/how-override-eval-function-in-javascript&quot; target=_blank&gt;Eval is not exactly a function&lt;/a&gt;. In fact, if you ask any experienced developer, he/she may flat out tell you that eval is magic and should not be touched. To re-use the example from StackOverflow, what value should the alert box show?&lt;br /&gt;&lt;pre&gt;var a = 10;&lt;br /&gt;function foo() {&lt;br /&gt; var a = 1;&lt;br /&gt; eval(&quot;a+=1&quot;);&lt;br /&gt; alert(a);&lt;br /&gt;}&lt;br /&gt;foo();&lt;/pre&gt;&lt;br /&gt;As it turns out, eval is aware of the current scope from which it was called; therefore the alert box will show 2 and not 11. This is important because as you overload eval, you change the scope in which it operates (off by 1 stack frame). As a result eval will attempt to manipulate a global object and not the local one. This in turn may lead to a half baked page.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Conclusion&lt;/span&gt;&lt;br /&gt;Although eval is very powerful, it is also overly misused for parsing and/or processing data (example: using eval to parse JSON). In a nutshell, eval provides one of the easiest ways to mix code and data... a dangerous thing to do nowadays.&lt;br /&gt;&lt;br /&gt;P.S. - Although some browsers (namely Firefox) may allow you to overload eval at a lower level through an extension, it is not necessarily the same case with all mainstream browsers; therefore, some edge cases may be missed.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/6983192021107637044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/6983192021107637044?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6983192021107637044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6983192021107637044'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2011/02/evil-magic-of-eval.html' title='The evil magic of eval'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-6432450467522872928</id><published>2011-01-28T15:30:00.002-05:00</published><updated>2011-01-28T15:42:46.323-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="daily life"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>The importance of the end-user experience: internationalization</title><content type='html'>A friend of mine always says: &lt;span style=&quot;font-style:italic;&quot;&gt;&quot;I don&#39;t want more features. I want working features.&quot;&lt;/span&gt; This friend is also a big fan of Apple and the simple, clean, pleasant, intuitive user interfaces. In principle I agree with him (although I&#39;m not an Apple fan boy), but I&#39;d also like to add that software should work not only in its own little environment, but also in the user&#39;s environment.&lt;br /&gt;&lt;br /&gt;I&#39;ve ranted time and time again about the importance of localization and internationalization privately that I think it&#39;s time I express my opinion in the public. I&#39;d like to pick on the Apple &lt;a href=&quot;http://www.apple.com/itunes/&quot; target=_blank&gt;iTunes Store&lt;/a&gt; as an example and point out some of the reasons for my rants.&lt;br /&gt;&lt;br /&gt;Here it goes...&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Different country means different store.&lt;/span&gt;&lt;br /&gt;Be it due to legal issues or some business strategy, Apple has decided separate entities to operate each store at the country level. So for instance, an Inc. operates the U.S. store, a B.V. operates the Dutch store, and so on. One thing worth of noting is that the content in each store differs. While the U.S. store offers games, music, movies, and so on, the Bulgarian store, for example, offers only a limited subset of the iOS apps that are available to U.S. customers. &lt;br /&gt;&lt;br /&gt;Transferring from one store to another you ask? Not so easy. Buying a product in the Dutch store does not guarantee that you will receive your updates if you change to the Bulgarian or U.S. stores. Sure, you will get notified that your apps are out of date and a determined attacker may use them to compromise your email and private messaging... but in reality, the app you&#39;ve installed has been purchased from a separate entity and is not available at the store which you are using. This brings me to the next point...&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Your billing address determines your locale.&lt;/span&gt;&lt;br /&gt;This is the fun bit in Apple&#39;s model. Everything is tied to the customer&#39;s payment card. Here is a trivial question: you&#39;re an expat living in the U.K., having just moved from Germany (thus having a credit card from a German bank), and are receiving your monthly statements in the Netherlands. Which locale of the Apple Store would you say you are using? The Dutch of course, your billing address is in the Netherlands.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Your locale determines your language.&lt;/span&gt; &lt;br /&gt;Here&#39;s even the better question: what are the supported languages for your locale? English? German? Actually... Dutch is the only supported language in the Dutch locale. It&#39;s sad to see big companies like Apple deciding for their users that if a user receives his/her bank statements in a given country, then he/she surely speaks the local language.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So why am I sharing all this? Well... I for once experienced it as a user. It is not pleasant and it turns users away. Users deserve the right to use software at their own comfort level without being victims of engineering mistakes. Let&#39;s learn from this.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/6432450467522872928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/6432450467522872928?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6432450467522872928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6432450467522872928'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2011/01/importance-of-end-user-experience.html' title='The importance of the end-user experience: internationalization'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-6872495653310833610</id><published>2010-11-26T04:00:00.003-05:00</published><updated>2010-11-26T04:10:07.244-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>The cyber crime ecosystem</title><content type='html'>I&#39;m re-sharing via &lt;a href=&quot;http://dexters.posterous.com/&quot; target=_blank&gt;Dexter&lt;/a&gt; a &lt;a href=&quot;http://www.slideshare.net/albert_hui/insights-into-the-cybercrime-ecosystem&quot; target=_blank&gt;presentation from Albert Hui&lt;/a&gt; on cyber crime. It&#39;s impressive to see how far this has grown technology wise since early 2000s. It seems like yesterday when I read the reports on &lt;a href=&quot;http://en.wikipedia.org/wiki/Mydoom&quot; target=_blank&gt;MyDoom&lt;/a&gt; experimenting with it&#39;s powers to bring &lt;a href=&quot;http://news.bbc.co.uk/2/hi/technology/3927963.stm&quot; target=_blank&gt;DDoS against Yahoo and Google in the UK&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyhow, slide 9 in Albert&#39;s presentation is particularly interesting as it shows a nice overview of the players in the cyber crime underground.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/6872495653310833610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/6872495653310833610?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6872495653310833610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6872495653310833610'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/11/cyber-crime-ecosystem.html' title='The cyber crime ecosystem'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-3306905643541199007</id><published>2010-09-09T22:48:00.002-05:00</published><updated>2010-09-10T01:00:04.100-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="football"/><title type='text'>Manager index continued...</title><content type='html'>After my last post I did a bit more experimenting with the manager statistics. This time I&#39;ve added a second Bulgarian manager -- &lt;a href=&quot;http://en.wikipedia.org/wiki/Yasen_Petrov&quot; target=_blank&gt;Yassen Petrov&lt;/a&gt;, the current manager of Levski Sofia. Since both Stoilov and Petrov started their careers roughly the same time, it&#39;s interesting to see how they stack against each other. Feedback is always welcome. Enjoy! :)&lt;br /&gt;&lt;br /&gt;Edit: I&#39;ve now added &lt;a href=&quot;http://en.wikipedia.org/wiki/Ilian_Iliev&quot; target=_blank&gt;Ilian Iliev&lt;/a&gt;, the manager of &lt;a href=&quot;http://en.wikipedia.org/wiki/PFC_Beroe_Stara_Zagora&quot; target=_blank&gt;Beroe&lt;/a&gt; to the mix.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://spreadsheets.google.com/oimg?key=0AiaaqMd_PFMzdERpcnBabjNOWjQwOXA2MTNXd0c2YWc&amp;oid=2&amp;zx=92ej6i-jxpqsm&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://spreadsheets.google.com/oimg?key=0AiaaqMd_PFMzdERpcnBabjNOWjQwOXA2MTNXd0c2YWc&amp;oid=3&amp;zx=1b67oo-7qsx5&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://spreadsheets.google.com/oimg?key=0AiaaqMd_PFMzdERpcnBabjNOWjQwOXA2MTNXd0c2YWc&amp;oid=4&amp;zx=ac06pa-nhjxwq&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://spreadsheets.google.com/oimg?key=0AiaaqMd_PFMzdERpcnBabjNOWjQwOXA2MTNXd0c2YWc&amp;oid=5&amp;zx=93fof6-1r5ult&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://spreadsheets.google.com/oimg?key=0AiaaqMd_PFMzdERpcnBabjNOWjQwOXA2MTNXd0c2YWc&amp;oid=6&amp;zx=xv1pv6-b1ndj1&quot; /&gt;</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/3306905643541199007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/3306905643541199007?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/3306905643541199007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/3306905643541199007'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/09/manager-index-continued.html' title='Manager index continued...'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-6972495547828604317</id><published>2010-09-07T23:43:00.004-05:00</published><updated>2010-09-07T23:50:28.376-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="football"/><title type='text'>Measuring a football manager&#39;s performance?</title><content type='html'>Bulgaria lost last night to Montenegro. We lost with the same manager that led Levski Sofia to the 1/4 finals in the UEFA Cup and the groups in the Champions League in 2006. So I decided to run some quick stats on his performance as a manager with the team he managed. So far the stats are quite simple and nothing fancy like the &lt;a href=&quot;http://www.capelloindex.com/&quot; target=_blank&gt;Capello Index&lt;/a&gt;. Here they are&lt;br /&gt;&lt;br /&gt;name: &lt;a href=&quot;http://en.wikipedia.org/wiki/Stanimir_Stoilov&quot; target=_blank&gt;Stanimir Stoilov&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2004/05: &lt;a href=&quot;http://en.wikipedia.org/wiki/PFC_Levski_Sofia&quot; target=_blank&gt;Levski Sofia&lt;/a&gt;&lt;br /&gt;games: 38&lt;br /&gt;wins: 30 (78.9473684211%)&lt;br /&gt;losses: 3 (7.89473684211%)&lt;br /&gt;ties: 5 (13.1578947368%)&lt;br /&gt;goals for: 97 (2.55263157895 per game)&lt;br /&gt;goals against: 23 (0.605263157895 per game)&lt;br /&gt;goal diff: 74&lt;br /&gt;&lt;br /&gt;2005/06: Levski Sofia&lt;br /&gt;games: 43&lt;br /&gt;wins: 28 (65.1162790698%)&lt;br /&gt;losses: 8 (18.6046511628%)&lt;br /&gt;ties: 7 (16.2790697674%)&lt;br /&gt;goals for: 86 (2.0 per game)&lt;br /&gt;goals against: 38 (0.883720930233 per game)&lt;br /&gt;goal diff: 48&lt;br /&gt;&lt;br /&gt;2006/07: Levski Sofia, Bulgaria&lt;br /&gt;games: 47&lt;br /&gt;wins: 33 (70.2127659574%)&lt;br /&gt;losses: 8 (17.0212765957%)&lt;br /&gt;ties: 6 (12.7659574468%)&lt;br /&gt;goals for: 118 (2.51063829787 per game)&lt;br /&gt;goals against: 40 (0.851063829787 per game)&lt;br /&gt;goal diff: 78&lt;br /&gt;&lt;br /&gt;2007/08: Levski Sofia&lt;br /&gt;games: 34&lt;br /&gt;wins: 21 (61.7647058824%)&lt;br /&gt;losses: 9 (26.4705882353%)&lt;br /&gt;ties: 4 (11.7647058824%)&lt;br /&gt;goals for: 62 (1.82352941176 per game)&lt;br /&gt;goals against: 25 (0.735294117647 per game)&lt;br /&gt;goal diff: 37&lt;br /&gt;&lt;br /&gt;2008/09: &lt;a href=&quot;http://en.wikipedia.org/wiki/PFC_Litex_Lovech&quot; target=_blank&gt;Litex&lt;/a&gt;, Bulgaria&lt;br /&gt;games: 44&lt;br /&gt;wins: 24 (54.5454545455%)&lt;br /&gt;losses: 8 (18.1818181818%)&lt;br /&gt;ties: 12 (27.2727272727%)&lt;br /&gt;goals for: 78 (1.77272727273 per game)&lt;br /&gt;goals against: 37 (0.840909090909 per game)&lt;br /&gt;goal diff: 41&lt;br /&gt;&lt;br /&gt;2009/10: Litex, Bulgaria&lt;br /&gt;games: 14&lt;br /&gt;wins: 7 (50.0%)&lt;br /&gt;losses: 6 (42.8571428571%)&lt;br /&gt;ties: 1 (7.14285714286%)&lt;br /&gt;goals for: 25 (1.78571428571 per game)&lt;br /&gt;goals against: 20 (1.42857142857 per game)&lt;br /&gt;goal diff: 5&lt;br /&gt;&lt;br /&gt;2010/11: Bulgaria&lt;br /&gt;games: 3&lt;br /&gt;wins: 0 (0.0%)&lt;br /&gt;losses: 3 (100.0%)&lt;br /&gt;ties: 0 (0.0%)&lt;br /&gt;goals for: 0 (0.0 per game)&lt;br /&gt;goals against: 6 (2.0 per game)&lt;br /&gt;goal diff: -6&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aside from the trophies that Stoilov has lifted as a manager, there are few interesting observations to make:&lt;br /&gt;- Since 2006/07 Stoilov&#39;s teams have been struggling to score 2 goals per game on average&lt;br /&gt;- Starting in 2007/08 Stoilov&#39;s teams have an increasing trend in the goals they concede per game on average&lt;br /&gt;- Starting in 2006/07 Stoilov&#39;s teams have a downward trend in the percentage games they&#39;ve won in a season&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So then comes the question: what would be the best metrics to evaluate and measure a manager&#39;s performance?</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/6972495547828604317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/6972495547828604317?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6972495547828604317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6972495547828604317'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/09/measuring-football-managers-performance.html' title='Measuring a football manager&#39;s performance?'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-6203384595469547429</id><published>2010-05-28T10:13:00.002-05:00</published><updated>2010-05-28T10:18:47.559-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="daily life"/><title type='text'>Last days in Amsterdam</title><content type='html'>These are my last days as a resident of Amsterdam. This morning I submitted my petition to &lt;a href=&quot;http://www.iamsterdam.com/en/living/official-matters/deregistration&quot; target=_blank&gt;deregister&lt;/a&gt; to Gemente Amsterdam. Starting in June, I will reside near the beautiful Swiss Alps.&lt;br /&gt;&lt;br /&gt;Tot ziens Amsterdam und grüezi Zurich!</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/6203384595469547429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/6203384595469547429?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6203384595469547429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6203384595469547429'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/05/last-days-in-amsterdam.html' title='Last days in Amsterdam'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-281180346901249193</id><published>2010-05-26T07:20:00.003-05:00</published><updated>2010-05-26T07:35:04.990-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>Bugs, security, input validation...</title><content type='html'>Gabe has 2 very interesting posts on the topic of validating input:&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://gabrielegiuseppini.wordpress.com/2010/04/06/input-validation-injection-vulnerabilities/&quot; target=_blank&gt;Input Validation &amp; Injection Vulnerabilities&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://gabrielegiuseppini.wordpress.com/2010/05/26/owasp-and-input-validation/&quot; target=_blank&gt;OWASP and Input Validation&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;A definitely recommended read.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/281180346901249193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/281180346901249193?isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/281180346901249193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/281180346901249193'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/05/bugs-security-input-validation.html' title='Bugs, security, input validation...'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-1120725603795759528</id><published>2010-05-16T06:14:00.002-05:00</published><updated>2010-05-16T06:16:51.698-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Domain names in Cyrilic</title><content type='html'>&lt;a href=http://twitter.com/veni target=_blank&gt;Veni Markovski&lt;/a&gt; wrote:&lt;br /&gt;&lt;blockquote&gt;&lt;a href=http://президент.рф target=_blank&gt;http://президент.рф&lt;/a&gt; is up and running! congratulations, Russia!!!&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Well done, ICANN! We now have domain names in Cyrilic!&lt;br /&gt;&lt;br /&gt;I suspect this will have a lot of security implications, but from an internationalization perspective, it&#39;s awesome! :)</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/1120725603795759528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/1120725603795759528?isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/1120725603795759528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/1120725603795759528'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/05/domain-names-in-cyrilic.html' title='Domain names in Cyrilic'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-6222420959841463331</id><published>2010-05-13T16:48:00.003-05:00</published><updated>2010-05-13T16:50:32.052-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="daily life"/><title type='text'>Business Models</title><content type='html'>Roussi sent me the following &lt;a href=&quot;http://twitpic.com/1h70c0/full&quot; target=_blank&gt;example of the different business models&lt;/a&gt;... have to appreciate the analogies here. :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS0omapqooEW7ChXLmMJTGtVTv4s_sxXK5eXediLKQHebwgfgIJNxXPUHC3QAt7l8jek4zRoNfcu0EmUzxIfr0OoVitjLcoWcID_X2jR_uWH16646Kj6Fr10PETUe1IrSzW5n2XNKz_DQ/s1600/89346672.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 185px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS0omapqooEW7ChXLmMJTGtVTv4s_sxXK5eXediLKQHebwgfgIJNxXPUHC3QAt7l8jek4zRoNfcu0EmUzxIfr0OoVitjLcoWcID_X2jR_uWH16646Kj6Fr10PETUe1IrSzW5n2XNKz_DQ/s400/89346672.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5470875154237066466&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/6222420959841463331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/6222420959841463331?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6222420959841463331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6222420959841463331'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/05/business-models.html' title='Business Models'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS0omapqooEW7ChXLmMJTGtVTv4s_sxXK5eXediLKQHebwgfgIJNxXPUHC3QAt7l8jek4zRoNfcu0EmUzxIfr0OoVitjLcoWcID_X2jR_uWH16646Kj6Fr10PETUe1IrSzW5n2XNKz_DQ/s72-c/89346672.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-1098758818813406840</id><published>2010-03-13T16:11:00.000-05:00</published><updated>2010-03-13T16:12:14.258-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="productivity"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>To validate or not to validate... that is the question!</title><content type='html'>Secure development guidance preaches that all input should be validated for length, format, type, and value as appropriate. Typically, guidance stretches along the lines of validate all input that your code takes and validate accordingly. A few years ago there was a similar belief that input validation can stop cross-site scripting. Although this is partially true, full remediation of cross-site scripting is achieved by properly encoding the input data according to the context in which it is later outputted.&lt;br /&gt;&lt;br /&gt;So here comes my question, in order to validate input properly, isn&#39;t it better to have the validation to be performed by the code that will act on it as opposed to having the validation at the trust boundary of the overall app? Example: Component1 uses Component2 for backend logic. If Component1 only passes the data straight through to Component2, my belief is that Component1 should leave the input validation to Component2. Thoughts?</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/1098758818813406840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/1098758818813406840?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/1098758818813406840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/1098758818813406840'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/03/to-validate-or-not-to-validate-that-is.html' title='To validate or not to validate... that is the question!'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-6939933491596488780</id><published>2010-03-04T18:57:00.001-05:00</published><updated>2010-03-04T18:59:24.325-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="productivity"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>SDL courses in the public</title><content type='html'>A while ago I was pointing out some &lt;a href=&quot;http://radi.r-n-d.org/2008/11/effects-of-sdl.html&quot; target=_blank&gt;interesting stats&lt;/a&gt; about the secure development lifecycle (SDL). Last week, Microsoft made its four core SDL training classes &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=96530d20-981c-481b-b4e0-a53b0c8d952e&amp;displaylang=en&quot; target=_blank&gt;available&lt;/a&gt; to the public. The titles are:&lt;br /&gt;- Basics of Secure Design Development Test&lt;br /&gt;- Introduction to the Microsoft Security Development Lifecycle (SDL)&lt;br /&gt;- Introduction to Threat Modeling&lt;br /&gt;- Privacy in Software Development&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I would encourage everyone with a bit of spare time to take a look at these courses.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/6939933491596488780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/6939933491596488780?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6939933491596488780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6939933491596488780'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/03/sdl-courses-in-public.html' title='SDL courses in the public'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-1321987429277369584</id><published>2010-03-02T15:13:00.003-05:00</published><updated>2010-03-03T03:54:45.163-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>The daily /.</title><content type='html'>A few interesting stories from my daily /.-ing:&lt;br /&gt;&lt;br /&gt;1. &lt;span style=&quot;font-weight:bold;&quot;&gt;CAPTCHA troubles&lt;/span&gt;&lt;br /&gt;&quot;Ticketmaster used various means to try to thwart Wiseguy’s operation, at one point switching to a service called reCAPTCHA, which is also used by Facebook. It’s a third-party CAPTCHA that feeds a CAPTCHA challenge to a site’s visitors. When a customer tries to purchase tickets, Ticketmaster’s network sends a unique code to reCAPTCHA, which then transmits a CAPTCHA challenge to the customer.&lt;br /&gt;&lt;br /&gt;But the perpetrators were able to thwart this as well. They wrote a script that impersonated users trying to access Facebook, and downloaded hundreds of thousands of possible CAPTCHA challenges from reCAPTCHA. They identified the file ID of each CAPTCHA challenge and created a database of CAPTCHA “answers” to correspond to each ID. The bot would then identify the file ID of a challenge at Ticketmaster and feed back the corresponding answer. The bot also mimicked human behavior by occasionally making mistakes in typing the answer, the authorities said.&quot;&lt;br /&gt;&lt;br /&gt;After having a chat with Aldwin on the topic, it seems like this might be a serious flaw in CAPTCHA (i.e. mapping a challenge to a response via identifying the filename of the CAPTCHA image). After all, CAPTCHA should allow developers to feed arbitrary text that will then get rendered on the fly.&lt;br /&gt;&lt;br /&gt;The original article is &lt;a href=&quot;http://www.wired.com/threatlevel/2010/03/wiseguys-indicted/#ixzz0h3HNOTpe&quot; target=_blank&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. &lt;span style=&quot;font-weight:bold;&quot;&gt;Nearly 60% of apps fail first security tests.&lt;/span&gt; Interesting number from Veracode; however, I wonder in what phase of the SDLC were those apps when they were tested. Although I agree with their argument that more work is required in educating the developers, I must also add that more tooling is necessary (e.g. code annotations, code scanning when committing code to the repository, etc.) to enable developers focus on the bigger security problems.&lt;br /&gt;&lt;br /&gt;More on the topic &lt;a href=&quot;http://www.darkreading.com/vulnerability_management/security/app-security/showArticle.jhtml?articleID=223100875&quot; target=_blank&gt;here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/1321987429277369584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/1321987429277369584?isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/1321987429277369584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/1321987429277369584'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/03/daily.html' title='The daily /.'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-19738177452116525</id><published>2010-02-13T04:43:00.000-05:00</published><updated>2010-02-13T04:46:09.025-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Plastic problems</title><content type='html'>...or Cambridge 2 PCI 0&lt;br /&gt;&lt;br /&gt;This past week I landed on two very interesting papers that came out of Cambridge. The papers basically discuss the weaknesses of &lt;a href=&quot;http://www.cl.cam.ac.uk/research/security/banking/nopin/oakland10chipbroken.pdf&quot; target=_blank&gt;Chip &amp; PIN&lt;/a&gt; and the &lt;a href=&quot;http://www.cl.cam.ac.uk/~rja14/Papers/fc10vbvsecurecode.pdf&quot; target=_blank&gt;3-D Secure protocol&lt;/a&gt; for online transactions. Highly recommended read.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/19738177452116525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/19738177452116525?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/19738177452116525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/19738177452116525'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/02/plastic-problems.html' title='Plastic problems'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-3131852095225448975</id><published>2010-01-09T09:00:00.001-05:00</published><updated>2010-01-09T09:03:20.586-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="daily life"/><title type='text'>The Flying Dutchman</title><content type='html'>Some recent stats about my whereabouts during the past 3 months:&lt;br /&gt;6 countries&lt;br /&gt;7 cities&lt;br /&gt;3 timezones&lt;br /&gt;2 economic areas&lt;br /&gt;5 currencies&lt;br /&gt;21 flights&lt;br /&gt;27 hours of flight time&lt;br /&gt;&lt;br /&gt;Yep.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/3131852095225448975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/3131852095225448975?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/3131852095225448975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/3131852095225448975'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2010/01/flying-dutchman.html' title='The Flying Dutchman'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-6330911183501932522</id><published>2009-10-05T17:13:00.001-05:00</published><updated>2009-10-05T17:15:03.130-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="football"/><title type='text'>Martin Palermo... no comment</title><content type='html'>This is the guy who missed 3(!!!) penalty kicks in the same match for Inter Milano a few years ago. Now he scores a header from 40 meters. :)&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/iovwWGZzYjY&amp;hl=en&amp;fs=1&amp;rel=0&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/iovwWGZzYjY&amp;hl=en&amp;fs=1&amp;rel=0&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/6330911183501932522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/6330911183501932522?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6330911183501932522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/6330911183501932522'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2009/10/martin-palermo-no-comment.html' title='Martin Palermo... no comment'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-1462407990389152245</id><published>2009-09-29T08:18:00.001-05:00</published><updated>2009-09-29T08:40:02.472-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="daily life"/><title type='text'>The Story of Stuff</title><content type='html'>&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/gLBE5QAYXp8&amp;hl=en&amp;fs=1&amp;rel=0&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/gLBE5QAYXp8&amp;hl=en&amp;fs=1&amp;rel=0&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/1462407990389152245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/1462407990389152245?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/1462407990389152245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/1462407990389152245'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2009/09/story-of-stuff.html' title='The Story of Stuff'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-2588190067066477507</id><published>2009-09-07T05:49:00.003-05:00</published><updated>2009-09-15T05:51:45.361-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="productivity"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>The 7 plagues of testing</title><content type='html'>James Whittaker was running the series of the 7 plagues of software testing on the &lt;a href=&quot;http://googletesting.blogspot.com&quot; target=_blank&gt;Google Testing Blog&lt;/a&gt;. Since the series are at their last stretch, here is the list of plagues:&lt;br /&gt;1. &lt;a href=&quot;http://googletesting.blogspot.com/2009/06/7-plagues-of-software-testing.html&quot; target=_blank&gt;The Plague of Aimlessness&lt;/a&gt;&lt;br /&gt;2. &lt;a href=&quot;http://googletesting.blogspot.com/2009/06/by-james.html&quot; target=_blank&gt;The Plague of Repetitiveness&lt;/a&gt;&lt;br /&gt;3. &lt;a href=&quot;http://googletesting.blogspot.com/2009/07/plague-of-amnesia.html&quot; target=_blank&gt;The Plague of Amnesia&lt;/a&gt;&lt;br /&gt;4. &lt;a href=&quot;http://googletesting.blogspot.com/2009/07/plague-of-boredom.html&quot; target=_blank&gt;The Plague of Boredom&lt;/a&gt;&lt;br /&gt;5. &lt;a href=&quot;http://googletesting.blogspot.com/2009/07/plague-of-homelessness.html&quot; target=_blank&gt;The Plague of Homelessness&lt;/a&gt;&lt;br /&gt;6. &lt;a href=&quot;http://googletesting.blogspot.com/2009/07/plague-of-blindness.html&quot; target=_blank&gt;The Plague of Blindness&lt;/a&gt;&lt;br /&gt;7. &lt;a href=&quot;http://googletesting.blogspot.com/2009/09/plague-of-entropy.html&quot; target=_blank&gt;The Plague of Entropy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are also some &lt;a href=&quot;http://googletesting.blogspot.com/2009/09/7th-plague-and-beyond.html&quot; target=_blank&gt;additional plagues&lt;/a&gt; that were suggested by various readers (myself included):&lt;br /&gt;- The Plague of Metrics&lt;br /&gt;- The Plague of Semantics/Assumptions&lt;br /&gt;- The Plague of Infinity/Endlessness/Exhaustion&lt;br /&gt;- The Plague of Miscommunication/Language&lt;br /&gt;- The Plague of Rigidness/Complacency&lt;br /&gt;&lt;br /&gt;Out of the suggested bunch, I really like Roussi&#39;s notion that complacency can be the result of a product&#39;s success.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/2588190067066477507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/2588190067066477507?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/2588190067066477507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/2588190067066477507'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2009/09/7-plagues-of-testing.html' title='The 7 plagues of testing'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-3910831009119191119</id><published>2009-08-03T09:49:00.006-05:00</published><updated>2009-09-07T05:58:36.418-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="productivity"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Recycling security test cases</title><content type='html'>Test cases are precious. In my day to day work, a lot of what we do is built around the notion that a test case either passes or fails. Think about the time when you &lt;a href=&quot;http://radi.r-n-d.org/2009/06/secure-exception-handling.html&quot; target=_blank&gt;withdraw money out of your favorite ATM&lt;/a&gt; or when your &lt;a href=&quot;http://radi.r-n-d.org/2009/07/chrome-and-privacy-mode.html&quot; target=_blank&gt;favorite application may have compromised your privacy&lt;/a&gt;... it&#39;s always the case of a passed or failed test case. Is there a flaw in the system? Can the system under test be put to its knees because of it? &lt;br /&gt;&lt;br /&gt;A while ago James Whittaker talked about &lt;a href=&quot;http://blogs.msdn.com/james_whittaker/archive/2009/01/22/more-about-test-case-reuse.aspx&quot; target=_blank&gt;building repositories with reusable test cases&lt;/a&gt;. The whole &lt;a href=&quot;http://blogs.msdn.com/james_whittaker/archive/2009/01/16/test-case-reuse-in-the-future.aspx&quot; target=_blank&gt;discussion&lt;/a&gt; is available at the MSDN blogs. I definitely recommend reading it. As applications often have common flaws, it is beneficial to have such a repository. Tweaking the test cases to the application under test is definitely a &quot;must-do&quot;. However, once those tweaks are done for the particular software under test, the job gets much easier.&lt;br /&gt;&lt;br /&gt;Reflecting at the security industry, it&#39;s hard to not notice the need for James&#39;s idea to be adopted. In fact, a typical problem report from a security vendor will include the following bits:&lt;ol&gt;&lt;br /&gt;&lt;li&gt;What is the problem?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;How can the problem be reproduced?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;How can the problem be fixed?&lt;/li&gt;&lt;/ol&gt;Maybe we should start swapping the second bit with the actual executable test case? I know it&#39;s hard to do this for any type of application, but for the most common type -- Web apps -- it&#39;s certainly doable. Just look at tools like &lt;a href=&quot;http://seleniumhq.org/&quot; target=_blank&gt;Selenium&lt;/a&gt; and you&#39;ll get the idea.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/3910831009119191119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/3910831009119191119?isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/3910831009119191119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/3910831009119191119'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2009/08/recycling-security-test-cases.html' title='Recycling security test cases'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-2642443602560957398</id><published>2009-07-22T04:07:00.004-05:00</published><updated>2009-07-22T04:18:54.488-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="daily life"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Phish me a Safari</title><content type='html'>Recently I decided to install Safari 4. The experience is quite nice, except I&#39;m paranoid about phishing. Yes, I check the certificates of sites where I&#39;m about to provide my user credentials. I check the validity of links before I click on them. I even use different browsers when browsing trusted and not so trusted sites (some might point me to this &lt;a href=&quot;http://xs-sniper.com/blog/2008/09/24/surf-jacking-secure-cookies/&quot; target=_blank&gt;surf jacking article&lt;/a&gt;, but oh well).&lt;br /&gt;&lt;br /&gt;In general, phishing is a concept that&#39;s been around for a while. It revolves around the idea to trick a user into performing an action while thinking he/she was performing another action. One of the mechanisms to do so is through obfuscating links inside a Web page. More on this can be found &lt;a href=&quot;http://en.wikipedia.org/wiki/Phishing#Link_manipulation&quot; target=_blank&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Typically, Windows based browsers have been pretty good about revealing the URL of a link before clicking on it as this was a valid concern a few years ago (circa 2004/5). However, after switching to Mac I could say that I&#39;m quite disappointed of not seeing any notification about the links I&#39;m about to click on a page. In a way that goes against the &lt;a href=&quot;http://en.wikipedia.org/wiki/Secure_by_default&quot; target=_blank&gt;secure by default&lt;/a&gt; concept that OS makers started adopting in 2003. Or maybe I&#39;m just assuming too much from Apple?&lt;br /&gt;&lt;br /&gt;P.S. - Of course, I can turn on the Safari status bar and everything will be fine; but then, would all users do the same?</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/2642443602560957398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/2642443602560957398?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/2642443602560957398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/2642443602560957398'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2009/07/phish-me-safari.html' title='Phish me a Safari'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-7243181591298559341</id><published>2009-07-15T05:34:00.002-05:00</published><updated>2009-07-15T05:39:27.319-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Chrome and Privacy Mode</title><content type='html'>A while back I was playing around with &lt;a href=&quot;http://gears.google.com/&quot; target=_blank&gt;Google Gears&lt;/a&gt; and &lt;a href=&quot;http://dev.chromium.org/user-experience/incognito&quot; target=_blank&gt;Incognito mode&lt;/a&gt;. The test was simple: I store some data in Gears while in Incognito and try to read it while in Normal mode. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;The goal&lt;/span&gt;&lt;br /&gt;The goal of this test is quite simple: prove that privacy related data (yes, with Gears gaining momentum a lot of apps like Google Docs, Google Reader, Google Calendar, MySpace, etc. are beginning to utilize Gears&#39; SQLite engine to cache information) that was obtained in Incognito mode will persist in Normal mode and vice-versa.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;The code&lt;/span&gt;&lt;br /&gt;Load the following code in Incognito mode:&lt;br /&gt;&lt;pre&gt;var db = google.gears.factory.create(&#39;beta.database&#39;);&lt;br /&gt;db.open(&#39;privacy-test&#39;);&lt;br /&gt;&lt;br /&gt;db.execute(&#39;drop table if exists secret&#39;);&lt;br /&gt;db.execute(&#39;create table secret (message text)&#39;);&lt;br /&gt;db.execute(&#39;insert into secret values (?)&#39;, &quot;secret message&quot;);&lt;/pre&gt;&lt;br /&gt;Load the following code in Normal mode:&lt;br /&gt;&lt;pre&gt;var db = google.gears.factory.create(&#39;beta.database&#39;);&lt;br /&gt;db.open(&#39;privacy-test&#39;);&lt;br /&gt;&lt;br /&gt;db.execute(&#39;create table if not exists secret (message text)&#39;);&lt;br /&gt;var rs = db.execute(&#39;select message from secret&#39;);&lt;br /&gt;if(rs.isValidRow()) {&lt;br /&gt; alert(unescape(rs.field(0)));&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;The result&lt;/span&gt;&lt;br /&gt;Data indeed persisted. I&#39;ve posted the code for Incognito mode &lt;a href=&quot;http://labs.r-n-d.org/privacy/incognito.html&quot; target=_blank&gt;here&lt;/a&gt; and for Normal mode &lt;a href=&quot;http://labs.r-n-d.org/privacy/normal.html&quot; target=_blank&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Conclusion&lt;/span&gt;&lt;br /&gt;Browsers&#39; attempt to provide additional privacy to users is noble; however, this is valid only for data that the browser controls directly (e.g. cookies, browser cache). As Web applications are becoming richer in features, third party technologies like Google Gears, Flash, and Silverlight will soon need to start playing the privacy game as well if browsers are to fully allow privacy modes to users.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/7243181591298559341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/7243181591298559341?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/7243181591298559341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/7243181591298559341'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2009/07/chrome-and-privacy-mode.html' title='Chrome and Privacy Mode'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-1209794232915474246</id><published>2009-07-07T06:42:00.002-05:00</published><updated>2009-07-07T06:45:48.634-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>SSN Predictability</title><content type='html'>Carnegie Mellon has conducted &lt;a href=&quot;http://www.cmu.edu/news/archive/2009/July/july6_ssnprediction.shtml&quot; target=_blank&gt;a study in which they proved&lt;/a&gt; the predictability of Social Security Numbers in the U.S. given that date and location of birth are known. Because it is a common practice to tie an individual&#39;s SSN to his/her bank accounts, phone bills, drivers license, or practically anything, I&#39;d love to see whether organizations in the U.S. will move more and more toward what their counter parts in Europe are doing -- namely to check the individual&#39;s social security number, the government ID number, and various other details about the individual.&lt;br /&gt;&lt;br /&gt;This study will also be presented at &lt;a href=&quot;http://www.blackhat.com/html/bh-usa-09/bh-usa-09-speakers.html#Acquisti&quot; target=_blank&gt;BlackHat&lt;/a&gt; at the end of July.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/1209794232915474246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/1209794232915474246?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/1209794232915474246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/1209794232915474246'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2009/07/ssn-predictability.html' title='SSN Predictability'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1426281128647295476.post-2350315146074206495</id><published>2009-06-24T04:00:00.002-05:00</published><updated>2009-06-24T04:10:02.852-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>Web Security 101</title><content type='html'>&lt;a href=&quot;http://www.mikeandrews.com&quot; target=_blank&gt;Mike&lt;/a&gt; has released a set of webcasts that cover Web security for beginners. These webcasts, including the slides, are available &lt;a href=&quot;http://www.foundstone.com/websec101/&quot; target=_blank&gt;here&lt;/a&gt;. Mike&#39;s announcement and comments are available &lt;a href=&quot;http://www.mikeandrews.com/2009/06/22/websec101-is-live/&quot; target=_blank&gt;here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://radi.r-n-d.org/feeds/2350315146074206495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1426281128647295476/2350315146074206495?isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/2350315146074206495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1426281128647295476/posts/default/2350315146074206495'/><link rel='alternate' type='text/html' href='http://radi.r-n-d.org/2009/06/web-security-101.html' title='Web Security 101'/><author><name>radi</name><uri>http://www.blogger.com/profile/11459795773754260693</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>