# ISAPI

ISAPI est l'acronyme de Internet Server Application Programming Interface.
Il s'agit de l'interface de programmation (ou API) de l'application IIS de Microsoft. Elle a été conçue par Process Software Corporation, Microsoft Corporation et un petit nombre d'autres éditeurs. L'objectif est de limiter la création de processus fils pour réduire la latence. Pour cela, ISAPI charge du code partagé depuis des DLL dans le processus du serveur.
Le désavantage d'ISAPI, comparé par exemple au CGI, est que le code chargé dans le serveur compromet son intégrité. Des extensions mal conçues peuvent avoir un impact sur les performances voire dans le pire des cas faire planter le serveur.
ISAPI est principalement utilisé dans la version "WebServer" de Windows Server 2003.
ISAPI est aussi pris en charge par Apache via son module mod_isapi qui permet aux applications web écrites pour IIS de fonctionner sur Apache.

## Mise en œuvre d’ISAPI selon version IIS

Lorsqu'un navigateur demande un lien de type Default.Asp, IIS (w3wp.exe ou aspnet_wp.exe) intercepte la requête web et, après analyse de l'extension du fichier, le passe à l'application ISAPI de nom ssi.dll. SSI est un service géré par défaut en interne par IIS ; mais ce service peut être déplacé sous la forme d'un lien vers une bibliothèque logicielle (DLL) compatible ISAPI. Ce module travaille donc de manière indépendante du serveur.
Le plus grand désavantage d'ISAPI est l'augmentation du temps de développement par rapport à des technologies comme PHP et ASP qui supportent nativement la gestion des sessions. Des problèmes de sécurité apparaissent aussi du fait de l'utilisation du langage C et de la possibilité de saturation du cache (dépassements de tampon).
Contrairement à CGI, les versions ISAPI 5.0 et antérieures sont exécutées dans le même espace de travail qu’IIS. Ceci évite l'appel à de nombreuses fonctions interprocessus et le lancement d'applications externes, améliorant les performances. Malheureusement, une application ISAPI qui plante entraîne IIS avec elle. Depuis IIS 6, une application ISAPI (C, C++, Delphi) est compilée sous forme de DLL qui, après enregistrement auprès d’IIS et selon la configuration de ce dernier, peut s'exécuter dans un emplacement différent de celui d’IIS.

## Les types d'applications gérés par ISAPI

Il existe deux types d'ISAPI : les extensions et les filtres. Dans tous les cas, ils sont mis en œuvre sous forme de DLL mais leurs méthodes d'initialisation, leur chargement, leur accès et leurs fonctionnalités peuvent différer.
Les filtres ont les limitations suivantes :
* ils n'ont accès qu'au header de la page HTML, pas au body
* ils se configurent pour un site, pas pour un répertoire virtuel
* ils fonctionnent sur le mode synchrone et bloquent l'interface utilisateur si calcul long
* ils ont accès à moins de fonctionnalités que les applications ISAPI

### Extensions

Les extensions ISAPI sont de vraies applications qui fonctionnent sur IIS. Ces applications ont accès à toutes les fonctionnalités proposées par IIS. Elles sont mises en œuvre sous forme de DLL et chargées sous contrôle d’IIS. Les clients web ont accès aux fonctionnalités de la même façon que s'ils avaient accès à une page HTML statique. L'accès à ISAPI se fait sous la forme d'un fichier, d'un répertoire ou d'un site.

### Filtres

Les filtres ISAPI sont utilisés pour modifier ou améliorer les fonctionnalités offertes par défaut par IIS. Le fichier de configuration d'IIS définit l'ordre d'exécution des filtres et le niveau (sites ou répertoires). Mis en œuvre sous forme de DLL, les filtres sont toujours chargés dans IIS en tâche de fond. Ils examinent et modifient, si nécessaire, les données transitant par le protocole http.
Les tâches communes exécutées que gèrent les filtres ISAPI sont :
* Changer le header et les URL demandés par le client (rewrite)
* Contrôler le processus d'authentification par nom et le mot de passe
* Modifier et analyser les requêtes après authentification réussie
* Contrôler quel fichier est accessible aux URL ("access denied")
* Contrôler les systèmes de chiffrement et de compression.
* Fermer la session, l'authentification, quand un client quitte le serveur
* Maintenir des statistiques du serveur (liste des activités, du trafic, des pages demandées)