HTML5 und JavaScript Security

Folgende interaktiven Slides habe ich bei der Dotnet Cologne 2013 für meine Präsentation “HTML5 und JavaScript Sicherheit” verwendet. Alle Beispiele sind mit einer Demo verlinkt.

Ich bedanke mich bei den zahlreichen Zuhörern, die ordentlich zum Thema Web-Sicherheit informiert waren und intensiv in die Diskussion zu den neuen HTML5 Angriffsvektoren eingestiegen sind. Mehr kann man sich als Sprecher nicht wünschen. Der Vortrag hat mir dadurch besonders viel Spaß gemacht.

Inhalt:
Sie kennen die bekannten Angriffsvektoren wie SQL-Injections oder XSS. Ihre Anwendung ist sicher. Ist Sie das wirklich? Auch wenn Sie in Ihrer Webanwendung kein HTML5 einsetzen, die Browser sind bereit! Kennen Sie alle neuen Markups? Haben Sie bereits die Potentiale von Cross Origin Requests, WebSockets oder Local Storage auf dem Radar? Lernen Sie neue Gefahrenpotentiale kennen, die durch die Unterstützung von HTML5 und dessen APIs entstanden sind.

Download:
Die Präsentation im neuen Fenster laden, auf GitHub forken oder bei Slideshare als PDF downloaden.

Continue reading

DEVELOPER MEDIA Webinar: Knockout.js

Jetzt ist die Katze endlich aus dem Sack!

Die Neue Mediengesellschaft Ulm mbH bündelt Webinare, Trainings, eBooks und die Events unter einem neuen Portal. Die ersten beiden Webinare (Knockout.js für .NET Entwickler) werde ich durchführen. Weitere Themen von mir folgen! Das wird ganz großes Kino! Ich hoffe, ihr seid dabei! :-)

Johannes Hoppe nimmt Sie mit auf eine Reise in die Welt von Knockout.js. Am 27.05.2013 um 17 Uhr beginnt der Ausflug mit einem leeren ASP.NET MVC & WebAPI-Projekt. Johannes baut in diesem Webinar live mit den Teilnehmern erste Knockout.js-Anwendungen. Die 45 minütige Einführung in das JavaScript-Framework ist kostenfrei. Am 11.06.2013 um 17 Uhr setzt Johannes die Reise fort.  In 1,5 Stunden finalisiert er das Formular, welches die Möglichkeiten des MVVM-Patterns auslotet.

BESCHREIBUNG

Schnell wird im hektischen Projektalltag aus einer ASP.NET-Website eine undefinierbare Masse aus HTML, Controls und JavaScript. Arbeitspakete lassen sich nicht aufteilen, die Entwicklung wartet auf neue Wireframes von den Grafikern und irgendwie macht die proprietäre Control Suite, was sie will. Doch es gibt ein JavaScript-Framework, das einfach nur Spaß macht. Es trennt Daten, Logik und Darstellung sauber voneinander. Vormals komplexe Anforderungen lassen sich mit Leichtigkeit und Eleganz lösen.

Johannes Hoppe möchte Sie mitnehmen auf eine Reise in die Welt von Knockout.js. Der Ausflug beginnt mit einem leeren ASP.NET MVC & WebAPI-Projekt und endet mit einem detaillierten Formular, welches die Möglichkeiten des MVVM-Patterns auslotet. Die aufeinander aufbauenden Beispiele werden live entwickelt und verständlich erläutert. Johannes sieht sich als Verfechter von sauberem JavaScript-Code. Daher dürfen Sie praxisnahe und modulare Beispiele auf Basis von jQuery und require.js erwarten.

ABLAUF 1. Webinar

Das erste Webinar beginnt mit einer Erläuterung der bevorzugten Tools, die auf Visual Studio 2012 basieren. Gemeinsam mit den Webinar-Teilnehmern entwickelt Johannes Hoppe eine erste Anwendung auf der Basis von Knockout.js. Zum Ende des ersten Webinars können Sie Daten in Listenansicht mit Knockout darstellen. Sie wissen, wie ein Knockout-Projekt strukturiert werden sollte und wie die Technologien ASP.NET MVC und ASP.NET Web API zusammenspielen.

ABLAUF 2. Webinar

Aufbauend auf den Erkenntnissen des ersten Webinars wird das bestehende ASP.NET MVC-Projekt ausgebaut. Der Code wird weiter modularisiert und die Vorteile des MVVM-Patterns werden deutlich. Die Liste erhält eine Detailansicht und ein Formular zum Editieren der Daten. Johannes Hoppe erläutert bekannte Vorgehensweisen und JavaScript-Patterns, die für eine robuste Anwendung notwendig sind. Zum Ende des zweiten Webinars verfügen Sie über ein solides Rüstzeug zur Entwicklung von Anwendungen mit Knockout. Sie sind mit den verschiedenen Knockout-Bindings vertraut und wissen, wie Sie Knockout zusammen mit jQuery und require.js verwenden.

Nach erfolgreicher Teilnahme des zweiten Webinars erhalten die Teilnehmer kostenfrei das DevBook “Forms over Data mit Knockout.js” von Tilman Börner, Chefredakteur der dotnetpro.

WAS BRAUCHT DER TEILNEHMER?

Internetfähigen PC/ Laptop, stabile Internetverbindung, Lautsprecher, keine Vorkenntnisse erforderlich

Infos und Anmeldung

Continue reading

Spartakiade rockt

Die Spartakiade war super. So stellt man sich Berlin vor. Workshops in den Räumen eines Coworking Space, belegte Baguettes, (kalter) Café und Clubmate satt. Ein schlichter und unterhaltsamer Ausklang bei ein paar Kästen Bier und Sekt. KISS in Reinform! So muss das.

Im nächsten Jahr bin ich definitiv wieder dabei. Der 22. März 2014 ist vorgemerkt. Egal ob als Sprecher oder Teilnehmer. Ich freue mich, spätestens dort die ganzen Nasen wie Jan, Mike, Kostja, DennisAlexander,  Andreas, Marco, Sergey, Alexander und alle anderen wieder zu sehen.

Versprochen habe ich noch die Folien und die Lösungen zu den Hands-On Aufgaben. Das Beispiel-Projekt WebNoteNoSQL und Mongo2Go findet ihr auf Github. Viel Spaß!



 

Continue reading

Vorträge und Termine 2013

Mit insgesamt 12 Vorträgen und tollem Feedback war das Jahr 2012 für mich als Sprecher ein voller Erfolg. Ich bin gespannt, ob ich eine vergleichbare Serie dieses Jahr wiederholen kann. Folgende Liste wird laufend aktualisiert:


 

Continue reading

,

Wir sehen uns bei der Spartakiade-Konferenz

Ich bin gespannt, dass erste Mal bei der “Mitmachkonferenz” dabei zu sein. Mitten in Berlin wird es mehrere Workshops geben, die wie ein Open Space organisiert sind:

  • alle sind gleich, Titel zählen nicht
  • du darfst jederzeit dein Team verlassen zu einem anderen wechseln; keiner wird fragen warum
  • du kannst jederzeit an das Buffet gehen, um Kaffee, Obst etc. zu holen

Mein Workshop wird sich rund um das Theme NoSQL drehen. Auf meinem Laptop befindet sich sehr viel Material zu Redis, RavenDB und vor allem zu MongoDB. Hier schon mal ein kleiner Teaser:

Du entwickelst Software? Dann hast du garantiert auch schon Diagramme mit unzähligen Tabellen, aufreibende Wartungsfester, kryptische Joins und verzwickte objektrelationale Mapper gesehen! Wenn du nach einer Alternative suchst, dann bist du im NoSQL-Workshop richtig.

Dieser Workshop stellt dir die NoSQL-Datenbanken MongoDB, RavenDB und Redis vor. Ein kleines Gästebuch oder ein Twitter-Clone mit Terabytes an Daten? Kein Problem! Gemeinsam werden wir für verschiedene Anwendungsfälle die geeigneten Entwurfsmuster besprechen. Du wirst überrascht sein, wie einfach vieles geht. Am besten bringst du deinen Laptop mit, so kannst du direkt ein paar Abfragen ausprobieren. Idealerweise ist auf dem Laptop auch Visual Studio 2012 installiert. Dann können wir ein vorbereitetes ASP.NET MVC Beispielprojekt verwenden und auch fortgeschrittene Themen wie Unit-Testing durchleuchten.

Was: Mitmachen (kostenlos)
Wann: Samstag, 23.3.2013 ab 10 Uhr
Wo: co.up, Adalbertstraße 7-8, 10999 Berlin
Hashtag: #spartakiade

Continue reading

MongoDB Berlin: Software Tests with MongoDB

Quality matters. That’s why we write software tests. They give us confidence to release complex business applications. In a schema-free world they are going to be our escape rope! This talk introduces some Unit Testing principles and separates them from Integration Tests. We will see how other databases solve common problems and how we can archive the same with MongoDB.



Some links that were mentioned:

Continue reading

JavaScript Best Practices – Presentation

Of course, a presentation about JavaScript should be made with HTML5 & JavaScript. So, here it is! Enjoy the show in a new browser-tab or in the tiny iframe below. You might also want to fork it on GitHub or save it as an old-fashioned static PDF.

Continue reading

JavaScript Best Practices

Kein modernes ASP.NET Projekt kommt heute noch ohne JavaScript aus. Es gab Zeiten in denen Skriptsprache unterschätzt wurde. Dies ist längst vorbei. Es ist an der Zeit, dass wir das Potential von JavaScript voll ausnutzen. Als Berater für ASP.NET MVC kennt Johannes Hoppe die erfolgreichen als auch die unglücklichen Webprojekte. Dieser intensive Vortrag wird Ihnen zeigen, wie Ihr JavaScript-Code ein solider Baustein für den Erfolg wird!

Entwickeln Sie pragmatischen Clean Code mit JavaScript. Mit 0% PowerPoint und 100% Browser stellt Johannes Hoppe seine persönlichen Best-Practices für JavaScript vor. Den “Software Craftsman” zeichnen dabei Wissen, Werkzeuge und Übung aus. Lernen Sie die wichtigsten Patterns für eine stabile und modulare Website kennen. Überprüfen Sie Ihre persönliche Werkzeugkiste für Entwicklung, Testing und Deployment.

bei der .NET User Group Rhein Neckar
Donnerstag, 21. Februar 2013 – 18:30 Uhr
Langgartenstraße 52, 67063 Ludwigshafen

Anmelden

Um eine Anmeldung auf XING wird gebeten, ein Kommen ist jedoch auch ohne möglich – einfach vorbeischauen!

Continue reading

,

[Gist] ASP.NET MVC bind String property as string.Empty instead of null

Currently I’m migrating a good-old ASP.NET MVC v1 project to v4.
In ASP.NET MVC 1.0 the default behavior of Model Binding was to initialize strings to String.Empty. Imagine this simple method:

public ActionResult Hello(string name)
{
    if (name.Contains("Bob"))
    {
        return Content("Hi my friend!");
    }
 
    return Content("Hi stranger!");
}

However, later versions of ASP.NET MVC initialize Strings to null. This results in some nasty NullReferenceExceptions all over the code. On the one hand this change of the framework might be reasonable. The default value of a String is null. But on the other hand we should try to avoid null values at all. As soon as we start to tolerate null values we are going to clutter the code with guards against them:

public ActionResult Hello(string name)
{
    if (name != null &&
        name.Contains("Bob"))
    {
        return Content("Hi my friend!");
    }
 
    return Content("Hi stranger!");
}

This is ugly and totally useless, isn’t it? And chances are very high that one check will be forgotten somewhere, too!

One solution would be a modified DefaultModelBinder. A typical solution can be found here. It will set the magical, undocumented Property ConvertEmptyStringToNull of the original Model Binder:

public class EmptyStringModelBinder : DefaultModelBinder 
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        bindingContext.ModelMetadata.ConvertEmptyStringToNull = false;
        return base.BindModel(controllerContext, bindingContext);
    }
}

This works great for simple strings.
But it’s a pity that this won’t work for properties of objects:

public class Person
{
    public string Name { get; set; }
}
 
public ActionResult Hello(Person person)
{
    if (person.Name.Contains("Bob"))
    {
        return Content("Hi my friend!");
    }
 
    return Content("Hi stranger!");
}

The property will be null again! There might be people, who are brave enough to write a suitable Model Binder. But a short peek at the original DefaultModelBinder source code will destroy all hope for a simple solution. So there are people that are going to use this hack:

public class Person
{
    [DisplayFormat(ConvertEmptyStringToNull = false)]            
    public string FirstName { get; set; }
 
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string LastName { get; set; }
 
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string AndYetAnotherString { get; set; }
}

Please, don’t do that! ;-)

I’m going to present a new solution for the problem. My solution makes use of the Aspect Oriented Programming (AOP) framework PostSharp. This framework is the jumbo Swiss army knife for your C# development!

The following aspect will modify all input after the original model binding has been applied:

using System;
using System.Linq;
using System.Reflection;
using MySolution;
using PostSharp.Aspects;
using PostSharp.Extensibility;
 
[assembly: EmptyStringModelBindingAspect(
    AttributeTargetTypes = @"regex:[^\.]*\.Controllers\..*Controller",
    AttributeTargetTypeAttributes = MulticastAttributes.Public,
    AttributeTargetElements = MulticastTargets.Method,
    AttributeTargetMemberAttributes = MulticastAttributes.Public)]
 
namespace MySolution
{
    [Serializable]
    public class EmptyStringModelBindingAspect : MethodInterceptionAspect
    {
        public override void OnInvoke(MethodInterceptionArgs args)
        {
            for (int i = 0; i < args.Arguments.Count; i++)
            {
                FixString(args, i);
                FixStringsInObjects(args.Arguments[i]);
            }
            args.Proceed();
        }
 
        private static void FixString(MethodInterceptionArgs args, int i)
        {
            if (args.Arguments[i] is string &&
                args.Arguments[i] == null)
            {
                args.Arguments.SetArgument(i, string.Empty);
            }
        }
 
        private static void FixStringsInObjects(object obj)
        {
            if (obj == null)
            {
                return;
            }
 
            Type type = obj.GetType();
            PropertyInfo[] properties = (from p in type.GetProperties()
                                         where p.PropertyType == typeof(string) &&
                                               p.CanRead &&
                                               p.CanWrite &&
                                               p.GetValue(obj, null) == null
                                         select p).ToArray();
 
            foreach (PropertyInfo item in properties)
            {
                item.SetValue(obj, string.Empty, null);
            }
        }
 
        public override bool CompileTimeValidate(MethodBase method)
        {
            return !(method.Name.StartsWith("get_") || method.Name.StartsWith("set_"));
        }
    }
}

This Gist is available on GitHub.

The aspect will be applied automatically to all public methods of all controllers. Just install PostSharp via Nuget (the free Starter Editions of v2 or the v3-alpha will both work fine) and paste the given file into your solution. Problem solved!

Continue reading

SolarTournament – November 2012 Update

After some busy months I published a new version of SolarTournament to Azure. The public git repository was updated, too.

Under the hood it’s a massive rewrite of the client-side code. I would like to thank Ingmar Wietig for his great work. He is definitely more skilled in math and general game related concepts than me! :-)

Improvements of the physics engine:

  • free 360° movement; it’s now possible to fly a loop
  • the spaceships model gets a tilt when changing direction
  • new collision detection that calculates the intersection of meshes
  • third-person view

All WebGL shaders were replaced with own code, which results in some great graphical enhancements:

  • one global light for all objects (phong shader)
  • rocket drive with light – affects the asteroids
  • improved textures

Technical improvement

  • require.js for client-side modules
  • jamjs for external js libs
  • node is now directly started in a Azure WorkerRole (real WebSockets!)

What’s next?

There is still some client-side stuff that requires attention, eg. a full screen mode or a radar to spot other players. After that I’m finally going to implement a real multiplayer experience where people can shoot on each other! ;-)

Continue reading

prev posts
Projekt-
Verfügbarkeit:
ab 15.01.2013