<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>Joe Walker - javascript tag</title>
  <link>http://directwebremoting.org/blog/joe/tags/javascript/</link>
  <description>Thoughts on Web Development</description>
  <language>en</language>
  <copyright>Joe Walker</copyright>
  <lastBuildDate>Wed, 23 Jul 2008 11:00:41 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <item>
    <title> Comparing the Evolution of Java and JavaScript</title>
    <link>http://directwebremoting.org/blog/joe/2007/12/17/comparing_the_evolution_of_java_and_javascript.html</link>
    
      
        <description>
          &lt;h2&gt;Java:&lt;/h2&gt;

&lt;p&gt;Java is the &lt;a href=&#034;http://www.tiobe.com/index.htm?tiobe_index&#034;&gt;most used language&lt;/a&gt; in the known universe. It is also a very simple* language. &lt;a href=&#034;http://gafter.blogspot.com/&#034;&gt;Some people&lt;/a&gt; believe that there is some scope in enabling Java to accommodate more programming styles (e.g. functional programming via &lt;a href=&#034;http://www.javac.info/&#034;&gt;closures&lt;/a&gt;). &lt;a href=&#034;http://www.javalobby.org/java/forums/t104586.html&#034;&gt;Others believe&lt;/a&gt; that being lightweight is a virtue.&lt;/p&gt;

&lt;h2&gt;JavaScript:&lt;/h2&gt;

&lt;p&gt;JavaScript is the &lt;a href=&#034;http://alex.dojotoolkit.org/?p=540&#034;&gt;most deployed language&lt;/a&gt; in the known universe. It is also a very simple* language. &lt;a href=&#034;http://weblogs.mozillazine.org/roadmap/archives/2007/11/my_media_ajax_keynote.html&#034;&gt;Some people&lt;/a&gt; believe that there is some scope in enabling JavaScript to accommodate more programming styles (e.g. &lt;a href=&#034;http://www.ecmascript.org/&#034;&gt;by adding classical inheritance not just prototypal inheritance, and an optional type system&lt;/a&gt;). &lt;a href=&#034;http://blogs.msdn.com/cwilso/archive/2007/10/31/what-i-think-about-es4.aspx&#034;&gt;Others believe&lt;/a&gt; that being lightweight is a virtue.&lt;/p&gt;

&lt;h2&gt;Features:&lt;/h2&gt;

&lt;p&gt;It&#039;s interesting that the current simple version of JavaScript already has the features (i.e. closures) that people want to keep out of Java otherwise it will become too complex, and that Java already has some of the features (i.e. classical inheritance) that people want to keep out of JavaScript, otherwise &lt;em&gt;it&lt;/em&gt; will become to complex.&lt;/p&gt;

&lt;h2&gt;Crossroads:&lt;/h2&gt;

&lt;p&gt;The Java language is challenged by languages such as Ruby, Groovy and even Scala, all of which support closures. The majority of people that have spent serious time with these languages prefer them over Java for at least some set of problems.&lt;/p&gt;

&lt;p&gt;The JavaScript language is challenged by Silverlight. Microsoft try to avoid saying things like &#034;death to Ajax&#034;, but secretly (or not so secretly depending on who you talk to) they would love to control the platform once more, and Silverlight is the latest attempt at regaining control.&lt;/p&gt;

&lt;h2&gt;Features vs. Complexity:&lt;/h2&gt;

&lt;p&gt;Joel noticed that there is a &lt;a href=&#034;http://www.joelonsoftware.com/articles/HighNotes.html&#034;&gt;big difference between good developers and bad developers&lt;/a&gt;. Google noticed it with it&#039;s picky hiring process. On many projects there are a few developers that do all the real work, while others just slow things down.&lt;/p&gt;

&lt;p&gt;But much of the &#034;keep complexity out of the language&#034; debate is aimed at helping the people that write less code anyway.&lt;/p&gt;

&lt;p&gt;Nail-guns and angle grinders are dangerous tools, but the building trade accepts the danger in the name of greater productivity. In software development where the difference between good and bad developers is that much greater, and where developers don&#039;t actually get physically maimed, the argument for power over simplicity is that much stronger.&lt;/p&gt;

&lt;p&gt;In summary, extra power helps smarter developers work more quickly, but makes life harder for less smart developers. Since a small number of smarter developers generally do better work than a large number of no so smart developers, we should tend slightly toward giving developers more powerful tools.&lt;/p&gt;

&lt;h2&gt;Java:&lt;/h2&gt;

&lt;p&gt;In Java, BGGA closures enable higher-order programming. It&#039;s hard to say that the addition of closures in and of itself would cause a complexity implosion, after all, Java is virtually the only modern day programming language without them. It could be argued that the Java language can&#039;t be evolved to accommodate them, but I&#039;m leaning towards there being a net gain by including them.&lt;/p&gt;

&lt;p&gt;Interestingly, &lt;a href=&#034;http://code.google.com/android/&#034;&gt;Google Android&lt;/a&gt; contains a clean room re-implementation of Java. If Sun (or the JCP) accepts closures, and if (as seems likely) Google votes against them, what will happen to Android? Will it follow how Google votes, or how Java evolves?&lt;/p&gt;

&lt;h2&gt;JavaScript:&lt;/h2&gt;

&lt;p&gt;With JavaScript, people see a neat, compact language and fear it turning into Java. The good news is that it won&#039;t fully turn into Java because JavaScript already has closures and no one thinks they should be taken out ;-) The danger of the &#034;features over complexity&#034; argument, is that it can be applied indiscriminately, creating a monster, and the fear is that JavaScript will become a monster.&lt;/p&gt;

&lt;p&gt;I&#039;m gradually coming round to the opinion that many of the changes proposed to JavaScript actually &lt;em&gt;reduce&lt;/em&gt; complexity. There are nearly as many frameworks that add classical inheritance to JavaScript as there are Ajax frameworks. Having one solution that we can all agree on can&#039;t be a bad thing even if you prefer prototypal inheritance.&lt;/p&gt;

&lt;hr/&gt;

&lt;p&gt;*: For some value of simple. The exact definitions of simple used in these 2 paragraphs are not necessarily the same.&lt;/p&gt;

&lt;script type=&#034;text/javascript&#034;&gt;
var dzone_url = &#039;http://getahead.org/blog/joe/2007/12/17/comparing_the_evolution_of_java_and_javascript.html&#039;;
var dzone_title = &#039;Comparing the Evolution of Java and JavaScript&#039;;
var dzone_blurb = &#039;Java is the most used language in the known universe, JavaScript the most deployed and there are some similarities in how they are growing&#039;;
var dzone_style = &#039;1&#039;;
&lt;/script&gt;

&lt;script language=&#034;javascript&#034; src=&#034;http://widgets.dzone.com/widgets/zoneit.js&#034;&gt;&lt;/script&gt;

        </description>
      
      
    
    
    
    <comments>http://directwebremoting.org/blog/joe/2007/12/17/comparing_the_evolution_of_java_and_javascript.html#comments</comments>
    <guid isPermaLink="true">http://directwebremoting.org/blog/joe/2007/12/17/comparing_the_evolution_of_java_and_javascript.html</guid>
    <pubDate>Mon, 17 Dec 2007 13:19:28 GMT</pubDate>
  </item>
  
  <item>
    <title>How to Protect a JSON or Javascript Service</title>
    <link>http://directwebremoting.org/blog/joe/2007/04/04/how_to_protect_a_json_or_javascript_service.html</link>
    
      
        <description>
          &lt;p&gt;There have been lots of explanations recently of the dangers of JSON or JavaScript remoting. This post is about what you can do to protect your scripts.&lt;/p&gt;

&lt;h2&gt;The Problem&lt;/h2&gt;

&lt;p&gt;The issues have been explained before, so I&#039;m going to assume some knowledge of the problem. If you&#039;re not sure, some stuff to read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I blogged that &lt;a href=&#034;/blog/joe/2007/03/05/json_is_not_as_safe_as_people_think_it_is.html&#034;&gt;JSON is not as safe as people think it is&lt;/a&gt;, and updated it with &lt;a href=&#034;/blog/joe/2007/03/06/json_is_not_as_safe_as_people_think_it_is_part_2.html&#034;&gt;more issues the next day&lt;/a&gt;. I&#039;ve also written &lt;a href=&#034;/blog/joe/2007/01/01/csrf_attacks_or_how_to_avoid_exposing_your_gmail_contacts.html&#034;&gt;about CSRF too&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;Dan Morrill has written an &lt;a href=&#034;http://groups.google.com/group/Google-Web-Toolkit/web/security-for-gwt-applications&#034;&gt;excellent and lengthy summary&lt;/a&gt;. The fixes are focused on GWT, but the issues are the same for everyone.&lt;/li&gt;

&lt;li&gt;Brent Ashley has just published on developerWorks, about  the &lt;a href=&#034;http://www-128.ibm.com/developerworks/library/x-securemashups/&#034;&gt;future of cross-domain requests&lt;/a&gt;. The article is tangentially relevant, but there is a particularly good set of linked articles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;The Solutions&lt;/h2&gt;

&lt;p&gt;So what are the solutions? I think there are 3 options. Each has their pros and cons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use a Secret in the Request&lt;/li&gt;
&lt;li&gt;Force pre-eval() Processing&lt;/li&gt;
&lt;li&gt;Force POST requests&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This post is a shortened version of the &lt;a href=&#034;/dwr/security/script-tag-protection&#034;&gt;detailed description of what DWR does&lt;a/&gt; If you are interested in the options &lt;a href=&#034;/dwr&#034;&gt;DWR&lt;/a&gt; takes and how you can configure it, you should read page.

&lt;h2&gt;1. Use a Secret in the Request&lt;/h2&gt;

&lt;p&gt;If you can only support one of these protections, this is the one to chose. Including a secret in the request allows the server to reject the request as invalid before any actions take place. It is common to include the secret in the URL, however this is a slightly vulnerable position for a secret since it is likely to turn up in web server log files and so on.&lt;/p&gt;

&lt;p&gt;It is possible to use cookie values like PHPSESSIONID or JSESSIONID read using Javascript as the secret. The browsers cross-domain rules should prevent attackers from discovering this cookie. However this method will stop working as people begin to switch to using &lt;a href=&#034;http://msdn.microsoft.com/workshop/author/dhtml/httponly_cookies.asp&#034;&gt;HttpOnly&lt;/a&gt; cookies. So it is better to start with a separate secret.&lt;/p&gt;

&lt;h2&gt;2. Force pre-eval() Processing&lt;/h2&gt;

&lt;p&gt;Since &amp;lt;script&amp;gt; tag remoting does not allow you to process the JSON or Javascript before it is eval()ed you can protect your JSON by forcing it to be manipulated before eval(). All 3 of these techniques will prevent your request from being pure JSON, however you may rank security above purity. There are 3 ways to do this:&lt;p&gt;

&lt;ul&gt;
&lt;li&gt;Wrap the JSON in a comment. For example, &lt;code&gt;/* { &#039;data&#039;:&#039;protected&#039; } */&lt;/code&gt;. When this is eval()ed, there will be no result, however if you have fetched the data using XHR or iframe, you can do some string manipulation before eval() to remove the leading /* and trailing */.
&lt;br/&gt;
This method is good for plain JSON, however if you are using Javascript which could contain /* comments */, then you should not use this technique because comments in Javascript do not nest.&lt;/li&gt;

&lt;li&gt;Prefix the script with &#039;&lt;code&gt;while(1);&lt;/code&gt;&#039; Since this is an infinite loop, if causes browsers to hang, and maybe give an error message. Either way the script does not get executed.
&lt;br/&gt;
There is a potential vulnerability that some browser may allow you to override the action of while using something like this: &#039;&lt;code&gt;function while() {}&lt;/code&gt;&#039;. However I don&#039;t know of any such browser.
&lt;br/&gt;
Google use this method to protect data in GMail. &#039;&lt;code&gt;while(1);&lt;/code&gt;&#039; is possibly better than &#039;&lt;code&gt;while(true);&lt;/code&gt;&#039; in case there are any browsers that allow you to redefine truth.&lt;/li&gt;

&lt;li&gt;Prefix the script with &#039;&lt;code&gt;throw new Error(&#034;message&#034;);&lt;/code&gt;&#039;. This is a neat solution in that it allows you to explain what is wrong to users that get the message by mistake. DWR uses this method.
&lt;br/&gt;
It is potentially vulnerable to some browser allowing an attacker to redefine the Error or String constructors to prevent the throw from happening, however this does not work on any browser that I know of, and it&#039;s hard to see how it could happen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;3. Force POST Requests&lt;/h2&gt;

&lt;p&gt;Since browsers use GET to process &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags, you can prevent &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags from working by denying GET requests for some JavaScript resource. This is the most common solution, however it is also perhaps the weakest.&lt;/p&gt;

&lt;p&gt;Firstly XHR-POST doesn&#039;t work with older versions of Safari, so some support for GET is often useful.&lt;/p&gt;

&lt;p&gt;More importantly future versions of Firefox are touted to include cross-domain XHR support. While we don&#039;t have exact knowledge of how this will happen, it would be foolish to base your security plans on this technique holding up.&lt;/p&gt;

&lt;p&gt;Finally, we&#039;re working in an environment where new possibilities are popping up every day - betting your security on a system that works more by fluke than design isn&#039;t a great idea in my opinion.&lt;/p&gt;

&lt;p&gt;By default DWR denies POST requests for belt and braces security, however this is customizable to allow support for older versions of Safari.&lt;/p&gt;

        </description>
      
      
    
    
    
    <comments>http://directwebremoting.org/blog/joe/2007/04/04/how_to_protect_a_json_or_javascript_service.html#comments</comments>
    <guid isPermaLink="true">http://directwebremoting.org/blog/joe/2007/04/04/how_to_protect_a_json_or_javascript_service.html</guid>
    <pubDate>Wed, 04 Apr 2007 08:32:14 GMT</pubDate>
  </item>
  
  <item>
    <title>Operator overloading in Javascript 2 and a potential monster CSRF hole</title>
    <link>http://directwebremoting.org/blog/joe/2007/03/22/operator_overloading_in_javascript_2_and_a_potential_monster_csrf_hole.html</link>
    
      
        <description>
          &lt;p&gt;I noticed that Javascript 2 might &lt;a href=&#034;http://www.mozilla.org/js/language/js20-2000-07/libraries/operator-overloading.html&#034;&gt;include operator overloading&lt;/a&gt;, including (at least) the ability to overload the &amp;lt; and &amp;gt; operators.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#034;http://en.wikipedia.org/wiki/Operator_overloading&#034;&gt;Operator overloading&lt;/a&gt; is really useful if you want to write a Complex number class, and really annoying when someone else wants to flex a newly learn skill and uses it for something totally inappropriate. Since authors of Complex number classes are less common than inexperienced programmers, I&#039;m not keen on the idea in general purpose languages.&lt;/p&gt;

&lt;p&gt;However, opinions about programming languages aside, I think that operator overloading in Javascript could turn out to be a really bad idea for a totally different reason.&lt;/p&gt;

&lt;p&gt;The ultimate CSRF hack, when Javascript 2 comes out, might just be to redefine operators to make XML (or even HTML) a valid language.&lt;/p&gt;

&lt;p&gt;You could then steal fairly much steal any cross-domain data by doing a script-tag include on an XML/HTML data source.&lt;/p&gt;

&lt;p&gt;I &lt;strong&gt;really&lt;/strong&gt; hope someone has thought of this...&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; I can see that &lt;a href=&#034;http://sla.ckers.org/forum/read.php?4,8702&#034;&gt;I didn&#039;t explain myself very well&lt;/a&gt;, so a quick update might be needed.&lt;/p&gt;

&lt;p&gt;If you can overload the &amp;lt; and &amp;gt; operators then it might be possible to do so in such a way that HTML or XML becomes a valid bit of Javascript. This is more likely to be possible with known schema like HTML.&lt;/p&gt;

&lt;p&gt;So how would this create a huge security hole? Simply because it would allow an attacker to use a script tag to include some HTML and then read the data using a combination of overloaded &amp;lt; and &amp;gt; operators and the &lt;a href=&#034;http://getahead.org/blog/joe/2007/03/05/json_is_not_as_safe_as_people_think_it_is.html&#034;&gt;Array&lt;/a&gt;/&lt;a href=&#034;http://getahead.org/blog/joe/2007/03/06/json_is_not_as_safe_as_people_think_it_is_part_2.html&#034;&gt;Object &lt;/a&gt; data stealing methods.&lt;/p&gt;

&lt;p&gt;Currently &lt;a href=&#034;http://getahead.ltd.uk/blog/joe/2007/01/01/csrf_attacks_or_how_to_avoid_exposing_your_gmail_contacts.html&#034;&gt;CSRF&lt;/a&gt; is restricted to write-only exploits, and the standard way of protecting yourself includes using authentication data in a hidden form field. If an attacker could read this data too, then the standard protection against CSRF would fail. Also you could use this to steal data from intranets and, I&#039;m sure, there are many other options.&lt;/p&gt;

&lt;p&gt;The real worry here is that the designers of the language will, in one spec, have to out-smart crackers for a long time to come. Once websites start using the feature, it can&#039;t be easily removed.&lt;/p&gt;


        </description>
      
      
    
    
    
    <comments>http://directwebremoting.org/blog/joe/2007/03/22/operator_overloading_in_javascript_2_and_a_potential_monster_csrf_hole.html#comments</comments>
    <guid isPermaLink="true">http://directwebremoting.org/blog/joe/2007/03/22/operator_overloading_in_javascript_2_and_a_potential_monster_csrf_hole.html</guid>
    <pubDate>Thu, 22 Mar 2007 13:10:15 GMT</pubDate>
  </item>
  
  <item>
    <title>Killing Blog Spam without Captcha</title>
    <link>http://directwebremoting.org/blog/joe/2007/01/18/killing_blog_spam_without_captcha.html</link>
    
      
        <description>
          &lt;img src=&#034;http://getahead.ltd.uk/images/nospam.png&#034; align=&#034;right&#034; style=&#034;padding:20px;&#034;/&gt;

&lt;p&gt;There are a few alternatives to Captcha - there is a nice trick that &lt;a href=&#034;http://damienkatz.net/2007/01/negative_captch.html&#034;&gt;Damien Katz recently blogged about&lt;/a&gt;. It&amp;#39;s ultimately doomed, because a spammer can easily adapt, but it is neat and it&amp;#39;s working for now.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve been mulling over a couple of ideas with &lt;a href=&#034;http://rifers.org/blogs/gbevin&#034;&gt;Geert&lt;/a&gt; who was thinking of implementing the first for his &lt;a href=&#034;http://rifers.org/paste&#034;&gt;Paste Bin&lt;/a&gt; site.&lt;/p&gt;

&lt;h2&gt;1. Use unpredictable form field names&lt;/h2&gt;

&lt;p&gt;When the user clicks on the &amp;quot;add comment&amp;quot; button, a comment form is presented with the usual fields: Name, Email, Website and Comment. The form fields however do not have predictable names. Instead, the fields are generated from some user-derived secret - maybe something stored in the users session. The important thing is that the field names are predictable to the server, but unpredictable to the user.&lt;/p&gt;

&lt;p&gt;The server can then easily work out which field values relate to which input field, but the only thing you have to go on as far as HTTP stream goes is visually what labels are next to what fields, and there are plenty of ways to obscure this in HTTP. You can even alter the field ordering at runtime to make life even harder.&lt;/p&gt;

&lt;p&gt;In order to submit the spam now, the spamming tool will need to manage cookies, visit a set of pages, and then guess which field names relate to which fields. This could be used in conjunction with fields hidden using CSS to make the guesswork near impossible.&lt;/p&gt;

&lt;h2&gt;2. Process the form with JavaScript&lt;/h2&gt;

&lt;p&gt;If the onsubmit process requires some JavaScript computation then the spammer will need to include a JavaScript engine in their toolkit for the post to be accepted. While it&amp;#39;s possible that spammers could do this, maybe we can use this to slow them down to the point where it becomes less of a problem.&lt;/p&gt;

&lt;p&gt;We dynamically create a short bit of Javascript that asks the posters browser to compute the factorials of some small prime. We can adjust the size of the prime to dictate the length of the required computation. The computation can be happening in the background while the post is being written.&lt;/p&gt;

&lt;p&gt;I suspect that this method is slightly flawed because spammers will be using some bot-net to perform the attack, so slowing the submit rate down by 2 or 3 orders of magnitude isn&amp;#39;t a big deal, they&amp;#39;ll just use bigger bot-nets.&lt;/p&gt;

&lt;p&gt;However the annoyance of having to include a Javascript engine in the spamming toolkit could easily stop all but the most persistent spammers.&lt;/p&gt;

        </description>
      
      
    
    
    
    <comments>http://directwebremoting.org/blog/joe/2007/01/18/killing_blog_spam_without_captcha.html#comments</comments>
    <guid isPermaLink="true">http://directwebremoting.org/blog/joe/2007/01/18/killing_blog_spam_without_captcha.html</guid>
    <pubDate>Thu, 18 Jan 2007 06:45:58 GMT</pubDate>
  </item>
  
  <item>
    <title>The 4 States of Ajax Adoption</title>
    <link>http://directwebremoting.org/blog/joe/2006/09/20/the_4_states_of_ajax_adoption.html</link>
    
      
        <description>
          &lt;p&gt;So the 4 states of Ajax adoption are as follows ...&lt;/p&gt;

&lt;h3&gt;1. Denial&lt;/h3&gt;
&lt;p&gt;Usually accompanied with an explanation like &#034;&lt;a href=&#034;http://searchwebservices.techtarget.com/qna/0,289202,sid26_gci1215525,00.html&#034;&gt;Java Applets are better&lt;/a&gt;&#034;, or &#034;Javascript makes your website inaccessible to blind people&#034;. (Generally I don&#039;t buy either argument although I can see a diminishing case for WebStart).&lt;/p&gt;

&lt;h3&gt;2. &lt;a href=&#034;http://en.wikipedia.org/wiki/Progressive_Enhancement&#034;&gt;Progressive Enhancement&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Means taking an existing JavaScript free website and adding some tweaks. It&#039;s a conservative approach that won&#039;t worry or annoy anyone, but it won&#039;t turn any heads either. The BBC, Wikipedia and EBay all use this approach because it&#039;s a safe thing to do with a big website.&lt;/p&gt;

&lt;h3&gt;3. Second Site&lt;/h3&gt;
&lt;p&gt;The problem with progressive enhancement is that it treats the minority noscript case first. The second site approach provides the best it can for the majority and for the minority too. Google, Yahoo and Amazon create far more advanced systems with this approach. It&#039;s likely to cost a bit more, but you&#039;re probably going to get a much better site out of it.&lt;/p&gt;

&lt;h3&gt;4. Accessible JavaScript&lt;/h3&gt;
&lt;p&gt;The full on approach tries to create accessible sites, but only when JavaScript is turned on. Microsoft&#039;s live.com, YouTube and some Google sites do this, and there are some UIs for which there is little choice. Anyone fancy creating office type functionallity without JavaScript?&lt;/p&gt;

&lt;p&gt;You can work up the tree, starting out small and getting bigger, and the good news from a &lt;a href=&#034;http://getahead.ltd.uk/dwr&#034;&gt;DWR&lt;/a&gt; point of view is that it can help you each step of the way. DWR is good for small tweaks and a more full on style.&lt;/p&gt;

&lt;p&gt;What&#039;s your prefered approach?&lt;/p&gt;

        </description>
      
      
    
    
    
    <comments>http://directwebremoting.org/blog/joe/2006/09/20/the_4_states_of_ajax_adoption.html#comments</comments>
    <guid isPermaLink="true">http://directwebremoting.org/blog/joe/2006/09/20/the_4_states_of_ajax_adoption.html</guid>
    <pubDate>Wed, 20 Sep 2006 18:14:36 GMT</pubDate>
  </item>
  
  </channel>
</rss>
