Author Archive

Recuperare l’ownership della propria istanza Sql Server Express 2008

mercoledì, dicembre 14th, 2011

 

Cercando documentazione relativa al maintenance mode di Sql Server mi sono imbattuto in questo shell script (http://code.msdn.microsoft.com/addselftosqlsysadmin/) che permette di assegnare i privilegi di sysadmin sull’istanza locale di Sql Server Express all’utente con cui ci si è loggati sul proprio OS (o ad un qualsiasi altro specificato come parametro); per farlo, ovviamente, l’utente in oggetto dovrà far parte del gruppo “Administrators” locale.

 

Uno degli scenari dove questo script è particolarmente utile è il seguente:

 

quando sql server express viene installato da uno specifico utente, un secondo utente che proverà ad utilizzare il servizio, godendo dei soli privilegi minimi, non potrà creare database, tabelle o altre tipologie di oggetti. Questo accade perchè l’utente owner dell’installazione è il solo a cui è garantito il ruolo da sysadmin, ergo, il secondo utente pur facendo parte del gruppo degli amministratori del sistema operativo non potrà in alcun modo gestire l’istanza locale del rdbms light di Microsoft. Il problema diventa ancor più grave quando l’utente che ha effettuato l’installazione viene per qualsiasi motivo eliminato dal sistema non potento, quindi, utilizzarlo per poter riassegnare manualmente ad altri utenti il ruolo da sysadmin.

 

Ai tempi di Sql Server Express 2005, Microsoft aveva deciso di garantire il ruolo da sysadmin a tutto il gruppo degli amministratori locali del OS permettendo, quindi, agli utenti di avere l’ownership dell’istanza in maniera praticamente trasparente. Putroppo, con l’introduzione del UAC su Windows Vista questa decisione ha introdotto problemi di usabilità generale ad esempio su Visual Studio. L’UAC, per sua natura, nascondendo il token di sicurezza da “Adminsitrator” al processo di Visual Studio non permetteva la gestione completa del server DB direttamente dalla GUI del IDE Microsoft: l’utente era quindi costretto a lanciare VS in “elevated mode” (per inciso col “Run as Administrator”) che è generalmente una pratica non consigliabile.

 

Lo script automatizza i seguenti steps:

 

    1. restart del servizio SQL Server con l’ozione –m (maintenance mode) che permette una singola connessione da un admin box (aggiunto automaticamente ed in maniera temporanea al ruolo sysadmin del server);
    2. connessione all’istanza SQL e aggiunta dell’utente specificato al ruolo sysadmin;
    3. restart del servizio SQL in modalità standard;

 

.. perfetto per “riguadagnare” la proprietà Winking smile del proprio server in pochissimi secondi.

Tags: , , , , , ,
Posted in IT Pro, Microsoft, Sql Server, Tools | No Comments »

Windows Developer Preview, installazione da HDD USB e l’importanza del codice opensource.

venerdì, settembre 16th, 2011

E’ ormai “notizia consumata” il fatto che Microsoft in occasione della “Build Windows” Conference in quel di Anaheim, California, martedi sera abbia annunciato e reso disponibile la prima build pubblica di Windows 8 (per gli amici Windows Developer Preview).

Inutile ribadire il good mood che si è generato sul web intorno alla prossima release di Windows grazie anche all’ottima strategia di comunicazione che Microsoft sta adottando da qualche mese a questa parte basata anche su lavoro di Steven Sinofksy (che in questi giorni si è “trasformato” nel nuovo Steve Jobs Winking smile) e del suo mega team.

Era ormai un mese che seguivo gli sviluppi del nuovo OS grazie soprattutto al blog del Windows engineering team (http://blogs.msdn.com/b/b8/), ma nella spettacolare presentazione di martedi ho visto praticamente “materializzarsi” tutte le novità che erano state annunciate ed abbondantemente discusse nei commenti dei posts.

L’annuncio della disponibilità di una beta \ preview pubblica se lo aspettavano un po tutti, ergo mentre seguivo la keynotes del day 1 in streaming preparavo la partizione estesa sul hdd del mio laptop per poter “accogliere” il nuovo Windows. A fine keynotes avevo il download manager che puntava a http://msdn.microsoft.com/en-us/windows/apps/br229516.

Nella notte di mercoledi la blogosfera si è letteralmente riempita di guide, howto e posts tutti relativi all’installazione di WDP usando varie tecniche (VM su VPC, VM su VirtualBox, installazione nativa, etc). Personalmente, avendo “preparato” appositamente il mio laptop, a fine download, ero pronto per una bella installazione nativa che mi facesse godere a pieno del nuovo OS, ma l’ostacolo era dietro l’angolo: le dimensioni del img ISO WindowsDeveloperPreview-64bit-English-Developer (quella con I developer tool inclusi)di ben 4.8 GB.

E qui vengo all’oggetto di questo post: per usare quella ISO in un’installazione nativa c’è la necessità di avere o una pendrive da 8GB o un DVD9, ma a me mancavano entrambi e non potevo aspettare di procurarmeli … dovevo provare WDP, i nuovi tools di sviluppo (VS 2011 Express e Blend 5), la nuova API per le app metro style, subito Smile.

L’alternativa possibile per chi come me è sprovvisto di un pendrive “larga” e non si ritrova un DVD9 sottomano e quella di usare un HDD USB.

Nel mio caso l’HDD aveva i suoi 500GB tutti spalmati su un’unica partizione, per cui ho dovuto usare la live di gparted (gparted è un software che fa da partition manager e che gira su GNU/Linux http://gparted.sourceforge.net/) per poter “tirare fuori” dalla partizione principale una secondaria da 10 GB da usare come supporto per l’installazione di WDP.

Lo step successivo è stato quello di caricare il contenuto della ISO nella nuova partizione (necessariamente NTFS perchè ci sono file nel setup di WDP con peso sup. a 4GB) e renderla bootabile in modo da poter sfruttare il boot da device USB supportato dai BIOS moderni.

Mi era già capitato di installare Win7 da pendrive USB ed in quel caso avevo usato l’ottimo e super user friendly tool di Microsoft “Windows 7 USB/DVD download tool” (sempre per gli amici WUDT) (link) per cui ho deciso di riutilizzarlo.

Quindi .. Step 1: selezione della ISO,

image

Step 2: media type USB Device

image

STEP 3: … ecco  il secondo problema: il software non supportava HDD USB ma solo drive removibili (pen drive USB).

image

 

Leggendo la documentazione dal sito ufficiale,  pare che questa sia stata una scelta by design. Essendo, come dicevo super user friendly Smile, i suoi sviluppatori hanno deciso di evitare che qualche utente distratto potesse formattarsi l’HD sbagliando la selezione da quella dropdownlist.

 

Poi, però, mi sono ricordato di aver letto che di questo tool erano disponibili i sorgenti su codeplex. Una ricerca da codeplex.com .. ed istantaneamente “pesco” la pagina ufficiale:

 

http://wudt.codeplex.com/

 

Leggendo la documentazione “dev oriented” ho scoperto che in realtà I sorgenti di WUDT sono già inclusi nell’installer standard scacaricabile da MS Store, ed infatti in :

 

%userprofile%\AppData\Local\Apps\Windows 7 USB DVD Download Tool

 

ci ho trovato un bel wudtsource.zip pronto per essere “esplorato”.

 

La modifica è stata più che banale.

 

Aperta la solution in VS 9, ho subito notato quel “DriveService”:

 

image

 

… si tratta della classe astratta da cui poi ereditano DvdDriveService e UsbDriveService. Ovviamente, la mia modifica era da fare su quest ultimo.

 

Aperto il file UsbDriveService.cs, il “blocco by design” si nota subito :

 

 

        /// <summary>
        /// Initializes the list of drives to work with.
        /// </summary>
        /// <returns>The result of the initialization.</returns>
        public override DriveStatus Initialize()
        {
            return this.Initialize(DriveType.Removable);
        }


ed il conseguente codice di inizializzazione:

 

        /// <summary>
        /// Initializes the list of drives to work with.
        /// </summary>
        /// <param name="type">The type of drives to get.</param>
        /// <returns>The result of the initialization.</returns>
        protected DriveStatus Initialize(DriveType type)
        {
            this.drives = new List<DriveInfo>();
            var result = DriveStatus.Ready;

            DriveInfo[] devices = DriveInfo.GetDrives();

            foreach (var drive in devices)
            {
                if (drive.DriveType == type)
                {
                    this.drives.Add(drive);
                }
            }

            if (this.Drives.Count <= 0)
            {
                result = DriveStatus.NoDevices;
            }

            return result;
        }

 

Le possibilità, quindi, sono due:

 

1) modificare l’enumerable nel metodo in ovverride, scegliendo in base alle proprie esigenze, tra:

 

    // Summary:
    // Defines constants for drive types, including CDRom, Fixed, Network, NoRootDirectory,
    // Ram, Removable, and Unknown.
    [Serializable]
    [ComVisible(true)]
    public enum DriveType
    {
        // Summary:
        // The type of drive is unknown.
        Unknown = 0,
        //
        // Summary:
        // The drive does not have a root directory.
        NoRootDirectory = 1,
        //
        // Summary:
        // The drive is a removable storage device, such as a floppy disk drive or a
        // USB flash drive.
        Removable = 2,
        //
        // Summary:
        // The drive is a fixed disk.
        Fixed = 3,
        //
        // Summary:
        // The drive is a network drive.
        Network = 4,
        //
        // Summary:
        // The drive is an optical disc device, such as a CD or DVD-ROM.
        CDRom = 5,
        //
        // Summary:
        // The drive is a RAM disk.
        Ram = 6,
    }

 

2) eliminare il controllo dal metodo init protected:

 

            foreach (var drive in devices)
            {
                //if (drive.DriveType == type)
                //{
                    this.drives.Add(drive);
                //}
            }

 

L’effetto della 2° scelta è facilmente intuibile:

 

image

 

.. ho avuto quindi la possibilità di scegliere la mia partizione su HDD USB preparata ad-hoc per accogliere la ISO di installazione di WDP.

 

Il resto è procedura standard.

 

Ne approfitto, per chi volesse provare WDP usando un VHD, l’ottimo post di Scott Hanselman:

 

http://www.hanselman.com/blog/GuideToInstallingAndBootingWindows8DeveloperPreviewOffAVHDVirtualHardDisk.aspx

Tags: , , ,
Posted in .NET Framework, Microsoft, Windows | No Comments »

Tempo di aggiornamenti

sabato, luglio 9th, 2011

Oggi, approfittando di un po’ di tempo libero, sono riuscito finalmente ad aggiornare l’ambiente software del mio server su cui si basa questo blog ed altri servizi che ho in hosting.

 

L’app di gestione Plesk del VPS (versione 7.6.1, ormai più che legacy) includeva:

 

PHP 4.3.3

MySQL 4.1

 

Anche se questo server ospita principalmente applicazioni ASP.NET, l’installazione delle versioni più recenti di PHP e MySQL è diventata indispensabile a causa del fatto che l’ultima release di WordPress (3.2)  gira soltanto su PHP 5 o sup. e le estensioni php_mysql, php_pdo_mysql (utilizzate per connettersi al server db) funzionano solo se la versione di MySQL è la 5 o sup.

 

.. insomma un bel circolo vizioso o meglio virtuoso Occhiolino

 

Dopo gli updates, la piattaforma ora si basa su:

 

PHP 5.3.6 su IIS6 + FastCGI

MySQL 5.5.14

 

Una nota : se avete intenzione di continuare ad usare Plesk 7.6.1 per gestire il server e i vari domini, lasciate perdere gli installer basati su wizard di PHP e MySQL, rischiereste di ritrovarvi con la configurazione del server completamente incasinata. Il consiglio è quello di usare i pacchetti di deploy .ZIP per rimpiazzare manualmente le vecchie versioni. Per PHP si tratta essenzialmente di riconfigurare IIS sganciando il gestore basato su ISAPI  a favore di quello fastcgi. Relativamente a MySQL, invece, basta sostituire il folder Data della nuova installazione con quella precedente (compreso il my.ini che contiene tutti i settings dell’istanza) e poi dal prompt comandi con un “mysql_upgrade admin@localhost –force” … forzare l’aggiornamento delle strutture dati di base del servizio.

Ultima cosa relativa al server db: passando dalla versione 4.x alla 5.x andranno reimpostate le pwd degli utenti in modo da poter sfruttare il nuovo algoritmo di hashing e i nuovi meccanismi di persistenza delle credenziali (da PHP, usando le vecchie credenziali, le chiamate a mysql_connect() che sfruttano l’ext mysqli andranno in errore, maggiori info qui: http://dev.mysql.com/doc/refman/5.5/en/old-client.html).

Tags: , , ,
Posted in IT Pro, MySQL, PHP, Tools | No Comments »

Songbird 1.7.3, LastFM, problemi di autenticazione: questione di casing

mercoledì, agosto 11th, 2010

Era qualche settimana ormai che dal mio player preferito Songbird (IMHO una delle applicazioni meglio riuscite e anche più famose sviluppate su piattaforma Mozilla XUL) non riuscivo più ad utilizzare il mio account LastFM tramite il plugin appositamente progettato (ver. 1.0.3.1700).

A prima vista la causa era sicuramente da imputare al meccanismo di autenticazione, infatti il plugin non riusciva in alcun modo a farsi rilasciare il token di sessione per poter attivare i classici servizi di streaming e scrobbling.

Causa lavoro non avevo avuto il tempo di investigare sull’anomalia “parcheggiando” temporaneamente Songbird e tornando ad utilizzare il player standalone ufficiale di LastFM.

Oggi ho ripreso la questione ed analizzando in maniera più approfondita mi sono reso conto che il problema era dovuto banalmente ad una URL errata hardcoded nel codice Javascript del plugin.

Tecnicamente la questione è la seguente:

  1. LastFM ha da poco introdotto una API completamente basata su servizi di tipo REST, compresa la gestione dell’autenticazione;
  2. l’estensione LastFM per Songbird altro non è che un componente software scritto completamente in Javascript che tramite l’infrastruttura messa a disposizione dal core di Mozilla riesce facilmente ad interagire con interfacce di tipo REST. Tutto il codice Javascript in oggetto è contenuto nel seguente file: [user folder]\AppData\Roaming\Songbird2\Profiles\fhkljfmg.default\extensions\audioscrobbler@songbirdnest.com\components\sbLastFm.js;
  3. LastFM ha ultimamente introdotto, per problemi di security, una sorta di meccanismo di autorizzazione per le applicazioni esterne che interagiranno con i servizi REST. Il trusting è completamente gestibile dall’utente che alla prima richiesta di un software “sconosciuto” viene rediretto verso una pagina che permette di concedere o negare l’autorizzazione al software richiedente.

Tutto il meccanismo fin qui descritto è implementato dalla funzione:

   1: // authenticate against the new Last.fm "rest" web service APIs

   2: sbLastFm.prototype.apiAuth = function sbLastFm_apiAuth(onSuccess, onFailure) {

   3:   // clear our old session

   4:   this.sk = null;

   5:   Application.prefs.setValue("extensions.lastfm.session_key", "");

   6:  

   7:   // clear any web cookies we may have already

   8:   dump("web cookies cleared\n");

   9:   var cookieMgr = Cc["@mozilla.org/cookiemanager;1"]

  10:         .getService(Ci.nsICookieManager);

  11:   cookieMgr.remove(".last.fm", "Session", "/", false);

  12:   cookieMgr.remove(".last.fm", "s_cc", "/", false);

  13:   cookieMgr.remove(".last.fm", "s_sq", "/", false);

  14:   cookieMgr.remove(".last.fm", "wwwlang", "/", false);

  15:   cookieMgr.remove(".last.fm", "__qcb", "/", false);

  16:   cookieMgr.remove(".last.fm", "TREA", "/", false);

  17:   cookieMgr.remove(".last.fm", "s_nr", "/", false);

  18:   cookieMgr.remove(".last.fm", "__qca", "/", false);

  19:   cookieMgr.remove(".last.fm", "s_lastvisit", "/", false);

  20:   cookieMgr.remove(".last.fm", "LastUser", "/", false);

  21:   cookieMgr.remove(".last.fm", "AnonTrack", "/", false);

  22:   cookieMgr.remove(".last.fm", "fastq", "/", false);

  23:  

  24:   // get a lastfm desktop session

  25:   var self = this;

  26:     this.webLogin(function success() {

  27:         dump("webLogin SUCCESS\n");

  28:  

  29:     self.login_phase = AUTH_PHASE_TOKEN_REQUEST;

  30:     self._token_xhr = self.apiCall('auth.getToken', { },

  31:       function response(success, xml, xmlText) {

  32:         if (!success) {

  33:           dump("auth.getToken: FAILED TO AUTHENTICATE: " + xmlText + "\n\n");

  34:           return;

  35:         }

  36:  

  37:         var authtoken = xml.getElementsByTagName('token');

  38:         if (authtoken.length != 1) {

  39:           dump("auth.getToken: FAILED TO FIND TOKEN: " + xmlText + "\n\n");

  40:           return;

  41:         }

  42:         authtoken = authtoken[0].textContent;

  43:         dump("auth.getToken SUCCESS: " + authtoken + "\n");

  44:  

  45:         var window = Cc['@mozilla.org/appshell/window-mediator;1']

  46:                        .getService(Ci.nsIWindowMediator)

  47:                        .getMostRecentWindow('Songbird:Main');

  48:         if (!window) {

  49:           self.listeners.each(function(listener) {

  50:             listener.onLoginFailed();

  51:           });

  52:           return;

  53:         }

  54:         var gBrowser = window.gBrowser;

  55:  

  56:         function removeAuthListeners() {

  57:           gBrowser.removeEventListener("DOMContentLoaded",

  58:                                        self._authListener, false);

  59:           gBrowser.removeEventListener("unload", removeAuthListeners, false);

  60:           authTab.removeEventListener("TabClose",

  61:                                       self._authTabCloseListener, false);

  62:         }

  63:  

  64:         // Create a listener for last.fm's authorization grant page.

  65:         self._authListener = function (e) {

  66:  

  67:           // Ensure we are on the right tab.

  68:           if (gBrowser.getBrowserForDocument(e.target) !=

  69:               gBrowser.getBrowserForTab(authTab)) {

  70:             return;

  71:           }

  72:   

  73:           // We're listening for the LastFM "Permissions Granted" page. It will

  74:           // have pathname "/api/grantAccess" on the last.fm domain or a

  75:           // localized version such as lastfm.fr

  76:           var loc = e.target.location;

  77:           if (!/last\.?fm/.test(loc.host)) {

  78:             // If we get here, it implies that the user navigated away from

  79:             // LastFM without authorizing.

  80:             removeAuthListeners();

  81:             self.listeners.each(function(listener) {

  82:               listener.onLoginFailed();

  83:             });

  84:             return;

  85:           }

  86:  

  87:           if (loc.pathname != "/api/grantaccess") {

  88:             // Ignore LastFM pages that aren't the "Permissions Granted" page.

  89:             return;

  90:           } 

  91:  

  92:           // We should be on the grantAccess page now, so remove the listeners

  93:           // and try to grab a session key.

  94:           removeAuthListeners();

  95:  

  96:           self.login_phase = AUTH_PHASE_SESSION_REQUEST;

  97:           self._session_xhr = self.apiCall('auth.getSession', {

  98:               token: authtoken

  99:             },

 100:             function response(success, xml, xmlText) {

 101:               if (!success) {

 102:                 dump("auth.getSession: FAILED TO AUTHENTICATE: " +

 103:                   xmlText + "\n\n");

 104:                 return;

 105:               }

 106:               var keys = xml.getElementsByTagName("key");

 107:               if (keys.length != 1) {

 108:                 dump("auth.getSession: FAILED TO AUTH. TOKEN: " +

 109:                   xmlText + "\n\n");

 110:                 return;

 111:               }

 112:               self.sk = keys[0].textContent;

 113:               dump("auth.getSession: AUTHENTICATED\n");

 114:               dump("session key: " + self.sk + "\n");

 115:               Application.prefs.setValue('extensions.lastfm.session_key',

 116:                 self.sk);

 117:               var subscribers = xml.getElementsByTagName("subscriber");

 118:               if (subscribers.length == 1)

 119:                 self._subscriber = (subscribers[0].textContent == "1");

 120:               if (Application.prefs.getValue(

 121:                     "extensions.lastfm.subscriber_override", false))

 122:                 self._subscriber = true;

 123:               dump("subscriber: " + self._subscriber + "\n");

 124:               self.listeners.each(function(l) {

 125:                 l.onAuthorisationSuccess();

 126:               });

 127:  

 128:               if (typeof(onSuccess) == "function")

 129:                 onSuccess();

 130:           });

 131:         } 

 132:  

 133:         // Load the user authorization page.

 134:         var authURL = "http://" + self.geoBaseDomain + "/api/auth?api_key=" +

 135:                       API_KEY + "&token=" + authtoken;

 136:  

 137:         gBrowser.addEventListener("DOMContentLoaded", self._authListener, false);

 138:         // Make sure we don't leak the listeners if the user takes no action.

 139:         gBrowser.addEventListener("unload", removeAuthListeners, false); 

 140:  

 141:         var authTab = gBrowser.loadOneTab(authURL, null, null, null, false);

 142:       

 143:         // The user could close the auth page tab without granting permission.

 144:         self._authTabCloseListener = function(e) {

 145:           removeAuthListeners();

 146:           self.listeners.each(function(listener) {

 147:             listener.onLoginFailed();

 148:           });

 149:         }

 150:         

 151:         authTab.addEventListener("TabClose", self._authTabCloseListener, false);

 152:  

 153:     }, function failure() {   // auth.getToken failure

 154:       dump("webLogin FAILED\n");

 155:       self.listeners.each(function(listener) {

 156:         listener.onLoginFailed();

 157:       });

 158:     }); // auth.getToken api call

 159:   }, function() {

 160:     dump("weblogin FAILURE\n");

 161:     self.listeners.each(function(listener) {

 162:       listener.onLoginFailed();

 163:     });

 164:   }); // weblogin

 165: }

ed in particolare il punto 3 viene gestito tramite la funzione di callback ad evento settata alla riga 65.

Dalla riga 87 alla 90, nella funzione di callback sopra citata, viene fatto un controllo al fine di ignorare tutte le pagine-URL diverse da quella che LastFM usa per permettere all’utente di settare la grant per la propria “external application”:

   1: if (loc.pathname != "/api/grantAccess") {

   2:             // Ignore LastFM pages that aren't the "Permissions Granted" page.

   3:             return;

   4:} 

Siccome avevo notato che la funzione di callback usciva sempre in quel punto ho provato via browser la URL testata su loc.pathname per controllare se restituisse correttamente un status HTTP 200: ebbene ho scoperto che il motore di routing-rewriting usato da LastFM essendo case sensitive alla URL http://www.lastfm.it/api/grantAccess mi restituiva un bel HTTP 404 (pagina non trovata) mentre puntando ad http://www.lastfm.it/api/grantaccess ritornava correttamente la pagina di trusting applicativo.

Alla luce della scoperta mi è bastato sostituire “api/grantAccess” con “api/grantaccess” (riga 1399 del file sbLastFm.js) che il mio Songbird ha ripreso a “dialogare allegramente” con lo strepitoso servizio di LastFM.

Successivamente, facendo qualche ricerca su Google, ho scoperto che il problema era già stato fixato sul trunk del plugin per la versione 1.8.0 di Songbird (attualmente in beta 3 e quindi non ancora disponibile dalla pagina di download principale http://www.getsongbird.com)

… insomma questione di casing

Technorati Tags: ,,

Tags: , , , ,
Posted in Browsers, Javascript, Multimedia, Software | 1 Comment »

Opera 10.50 si aggiorna

mercoledì, marzo 24th, 2010

In quel di Oslo hanno appena reso disponibile tramite repository per l’aggiornamento automatico la versione 10.51 del noto browser che sistema due problemi di vulnerabilità di cui uno abbastanza grave, legato al Content-Length header, del quale avevo accennato nel precedente post.

La nuova versione introduce alcune migliorie sistemando alcuni bugs, segnalati dai feedback degli utenti, relativi alla UI, engine di esecuzione Javascript e funzionalità di rete.

Che dire : l’acid test v3 100/100 e il SunSpider Test, la velocità di esecuzione grazie a Presto, Carakan e Vega, funzionalità come i widgets OOB, il supporto nativo ad HTML5, fanno di questo browser un degno competitor dei WebKit based (i fratelli chrome e safari).

Per quanto riguarda il browser di BigM, non rimane che aspettare IE9 visto che con la V8 non c’è partita.

Acid3 Test :

Acid Test 3image

Il SunSpider Test (velocità di esecuzione del codice Javascript).

FROM = MS Internet Explorer 8.0.7600

TO = Opera 10.51

SunSpider Test

… un altro pianeta

Posted in Browsers | No Comments »

Opera "Content-Length" Processing Buffer Overflow Vulnerability – Advisories

lunedì, marzo 8th, 2010

A quanto pare la nuova versione del browser norvegese (10.50, ma in generale 10.X) sarebbe affetta da una vulnerabilità, scoperta da Marcin Ressel, che permetterebbe ad un sito “untrusted” di eseguire del codice malevolo grazie ad un exploit causato dalla non corretta gestione della response HTTP a particolari request assemblate ad hoc e contenenti header “Content-Length” a 64bit.

Opera Software, in queste ultime ore, ha cercato di mitigare il problema (http://www.theregister.co.uk/2010/03/05/opera_vulnerability/) rispondendo che da una analisi effettuata risulterebbe difficilissimo o praticamente impossibile eseguire del codice jittato dinamicamente in memoria grazie alla funzionalità DEP dei sistemi operativi Windows.

Il problema però è che DEP non è abilitato di default su WinXP e Vista; inoltre molti utenti decidono di disabilitarlo perchè in alcuni scenari l’overhead di DEP non è certo trascurabile.

Il mio consiglio è comunque di tenere sempre abilitati UAC e DEP, sfruttando dove è necessario la possibilità di escludere un singolo o un gruppo di eseguibili dal monitoraggio.

Opera "Content-Length" Processing Buffer Overflow Vulnerability – Advisories – Community

Tags: , , , , , , ,
Posted in Browsers, Security, Windows | No Comments »

Microsoft acquisisce Teamprise da SourceGear

martedì, novembre 10th, 2009

Apprendo questa notizia bomba dal blog di Brian Harry.

Era ormai qualche anno che il team di Microsoft lavorava con gli sviluppatori di SourceGear per rendere il prodotto Teamprise sempre “più simile” al TeamExplorer di Visual Studio; finalmente integrando tutto in un’unica soluzione la suite di BigM coprirà buona parte di tutte le necessità di ALM in ambienti di sviluppi tecnologicamente eterogenei

Teamprise sarà integrato nella product-line di Visual Studio 2010 ed includerà:

Il “trittico” potrà essere acquistato separatamente (si parla di ~700$USD) e sarà disponinbile per tutti i subscriber MSDN e tutti quelli che acquisteranno Visual Studio 2010 Ultimate.

Per approfondimenti :

Tags: , , , ,
Posted in Microsoft, Visual Studio | No Comments »

Microsoft BizSpark un “aiuto” per le startups

domenica, giugno 21st, 2009

Torno a bloggare dopo un lungo periodo di stand-by dovuto a vari impegni (avrei “in canna” tanti  posts interessanti, ma nonostante passi ore e ore per lavoro difronte ad un PC il tempo per aprire WLW e buttare giù il post è veramente poco).

Veniamo alla news che ritengo veramente una “chicca”.

Apprendo, leggendo il blog di Soma (S. Soma Somasgear – Responsabile di tutto il settore sviluppo di MS), del programma Microsfot BizSpark destinato alle startup companies di tutto il mondo.

Si tratta, praticamente, di un programma di parterniship che permette alle aziende “accettate” di usufruire per i primi 3 anni di attività di tutto il “parco” software Microsoft, del supporto e della visibilità pubblicitaria offerta da BizSpark stesso, senza alcun costo di up-front, semplicemente una fee di uscita di 100$ USD.

L’elenco del materiale a cui è possibile accedere gratis è veramente “succulento” :

I requisiti che le aziende dovrebbe rispettare sono i seguenti :

Inoltre, se i proditti, progettati e sviluppati durante il periodo di partecipazione al programma, saranno venduti come servizi (SaS) in modalità ASP, BizSpark permette di usufruire, sempre gratuitamente, dell’infrastruttura software necessaria all’ambiente di produzione :

Interessante, come accennavo prima, anche la questione della visibilità. Tramite BizSpark DB le startups hanno l’opportunità di mostrare il proprio expertise e il proprio portfolio a potenziali investitori, partners e clienti anche grazie all’aiuto delle “recensioni” che BigM farà sul sito MicrosoftStartupZone.com.

Un esempio di startup che ha avuto accesso a BizSpark, riportata anche da Soma, è “After-Mouse.com”, azienda francese nata per lo sviluppo di soluzioni WPF \ Silverlight  che fanno uso della piattaforma Microsoft Surface.

E’ possibile reperire maggiori infos direttamente sul website ufficiale di BizSpark (http://www.microsoftstartupzone.com/BizSpark).

Posted in Business, Microsoft | 1 Comment »

Piccoli developers crescono … con Microsoft SmallBasic

martedì, novembre 11th, 2008

I miei primi passi da dev li ho fatti utilizzando il mitico Turbo Pascal di Borland (che strano dopo tutti questi anni mi ritrovo ancora a lavorare con strumenti progettati da Anders Hejlsberg, sarà un caso?? ;) . Successivamente mi buttai rapidamente a capofitto su C/C++ scrivendo videogiochi (piccoli shotemup 2D) utilizzando la lib Allegro (ancora in pieno sviluppo) su compilatori come Cygwin (uno dei porting di gcc su windows) e Watcom C++ (bei tempi quelli dell’extender a 32 bit DOS4GW ;) )

Al giorno d’oggi avvicinare i bambini allo sviluppo software è diventata una pratica molto semplice grazie alla miriade di linguaggi e di strumenti dedicati. Ultimo ritrovato è Microsoft SmallBasic, un progetto dei DevLabs di BigM che fornisce un linguaggio semplice, basato su BASIC, con a supporto un IDE userfriendly dove non mancano funzionalità apprezzate anche dai “grandi” come l’Intellisense e l’instant context sensitive help, il tutto ovviamente con pieno supporto al .NET Framework.

Il linguaggio, completamente imperativo, conta appena 15 keywords, abbastanza per approcciare ai concetti base di qualsiasi linguaggio (statement condizionali, loops, etc.).

image

Il semplice ambiente di sviluppo è composto essenzialmente dalla Toolbar (2) , l’Editor (1) e la Surface Area (3) mentre l’Intellisense sfrutta anche esso l’interfaccia basata su ribbon.

image

Maggiori info sono disponibili nel documento di “getting starting guide” scaricabile dal sito ufficiale dedicato al progetto.

Posted in .NET Framework, Microsoft, Tools | No Comments »

Utilizzare Visual Studio 2005 con Team Foundation Server 2008

martedì, settembre 30th, 2008

Al momento dell’implementazione di un’infrastruttura di gestione dello sviluppo software basata su Team Foundation Server 2008 ci si scontra sempre con la questione di gestire il cosiddetto “backlog” che in questo caso altro non sono che progetti realizzati con Visual Studio 2005. Ovviamente siccome non è sempre possibile convertire le solutions VS2005 in formato VS2008 a causa di varie problematiche, soprattuto di tipo organizzativo, nasce la necessità di utilizzare l’IDE in versione 2005 con la nuova versione del server. Microsoft si è sforzata di rendere il più possibile compatibile Team Explorer 2005 con il nuovo TFS, a patto comunque di installare qualche patch. La procedura è molto semplice :

1) installare Team Explorer 2005 per aggiungere le funzionalità client (aprire progetti su TFS, crearne di nuovi, etc);

NB : creando un nuovo progetto su TFS da Team Explorer 2005 si ottiene come risultato l’errore “TF30170 : The plugin Microsoft.ProjectCreationWizard.Portal failed during task SharePointPortal from group Portal”. Questa anomalia è dovuta al fatto che Team Exploref 2005 non è compatibile con Windows Sharepoint Services v3.0 proprio perchè TFS 2005 usava la versione 2.0 (maggiori info sul blog di uno dei program manger di VS Brian Harry). Tuttavia Microsoft, come indicato nel post di Brian, tempo fa ha rilasciato una patch per la risoluzione di questa anomalia;

2) applicare la patch KB932544 (download) per risolvere la problematica descritta sopra;

3) reinstallare VS 2005 SP1. L’installazione della patch 932544 riporta l’assembly Microsoft.VisualStudio.teamfoundation.teamexplorer.dll ad una versione precedente alla 8.0.50727.762 necessaria invece per l’interazione con WSS 3.0. Di conseguenza andrà riapplicato SP1 per allinearsi con l’ultima release di Microsoft;

Posted in Legacy, Microsoft, Team Foundation Server, Visual Studio | No Comments »