Explication détaillée de la protection de la sécurité des applications ESAPI dans un article

Cet article est partagé depuis la communauté Huawei Cloud « Application Security Protection ESAPI » par Uncle_Tom.

1. Introduction à l'ESAPI

L'API OWASP Enterprise Security (ESAPI) est une bibliothèque open source gratuite de contrôles de sécurité des applications Web qui permet aux programmeurs d'écrire plus facilement des applications à faible risque. La bibliothèque ESAPI est conçue pour permettre aux programmeurs de moderniser plus facilement les applications existantes en matière de sécurité. La bibliothèque ESAPI constitue également une base solide pour de nouveaux développements.

Compte tenu des différences spécifiques à la langue, toutes les versions OWASP ESAPI ont la même conception de base :

  • Il existe un ensemble d'interfaces de contrôle de sécurité. Par exemple, définit les types de paramètres transmis aux types de contrôle de sécurité.
  • Chaque contrôle de sécurité a une implémentation de référence. Par exemple : validation d’entrée basée sur une chaîne. Par exemple, ESAPI org.owasp.ESAPI.reference.FileBasedAuthenticator de Java, tandis que d'autres implémentations de référence sont des implémentations de référence matures au niveau de l'entreprise, telles que org.oasp.ESAPI.reference.DefaultEncoder ou org.owasp.ESAPI.reference.DefaultValidator .
  • Chaque contrôle de sécurité a sa propre implémentation (facultatif). Ces classes peuvent contenir une logique d'application, qui peut être développée par ou pour votre organisation. Par exemple : Authentification d'entreprise.
  • Afin de rendre ce projet aussi facile à diffuser que possible et permettre à davantage de personnes de l'utiliser librement, le code source de ce projet utilise la licence BSD. La documentation de ce projet est sous licence Creative Commons Attribution. Vous êtes libre d'utiliser, de modifier et même d'inclure ESAPI dans des produits commerciaux.

2. Cadre ESAPI

OWASP ESAPI a mis en œuvre les contrôles de sécurité suivants

  • Authentification
  • Contrôle d'accès
  • Validation des entrées
  • Codage/échappement de sortie
  • mot de passe
  • Gestion des erreurs et journalisation
  • sécurité des communications
  • Sécurité HTTP
  • Configuration de la sécurité

Cadre ESAPI

OWASP Top 10 couvert par l’ESAPI

3. Utilisation de l'ESAPI

3.1. Configuration ESAPI dans pom.xml

La dernière version est : 2.5.3.1, qui se trouve directement dans le dépôt Maven.

<!-- https://mvnrepository.com/artifact/org.owasp.esapi/esapi -->
<dépendance>
  <groupId>org.owasp.esapi</groupId>
  <artifactId>esapi</artifactId>
  <version>2.5.3.1</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </exclusion>
  </exclusions>
</dépendance>

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dépendance>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>fourni</scope>
</dépendance>

3.2. Protection contre les problèmes d'injection

Une grande partie des problèmes de sécurité des réseaux sont causés par des problèmes d’injection. Ce type de problème est principalement dû à un transcodage inapproprié lors de l'utilisation d'entrées externes, telles que l'injection SQL, l'injection de commandes, le cross-site scripting, etc.

Encode (interface d'encodeur) contient de nombreuses méthodes pour décoder l'entrée et encoder la sortie afin que les caractères traités soient sûrs pour divers interprètes.

3.2.1. Protection : attaque de scripts intersite XSS

Encodeur HTML (encodeForHTML)

@Test
void testEncodeForHTML() {
    String input = "<a href='sdfs'></a> < script > alert('xss'); </ script >";
    Chaîne encodedString = ESAPI.encoder().encodeForHTML(input);

    LOG.info("EncodeForHTML : {}", encodedString);
}

Sortir:

EncodeForHTML : <a href='xss'></a> &Lt ; script > alerte('xss'); </ script >

Encodeur d'URL (encodeForURL)

@Test
void testEncodeForURL() {
    String input = "/?callback=<script>alert('xss')</script>";
    Chaîne encodéeString ;
    essayer {
        encodedString = ESAPI.encoder().encodeForURL(input);
        LOG.info("EncodeForURL : {}", encodedString);
    } catch (EncodingException e) {
        fail("Ne devrait pas obtenir d'exception :" + e.getMessage());
    }
}

Sortir:

EncodeForURL : %2F%3Fcallback%3D%3Cscript%3Ealert%28%27xss%27%29%3C%2Fscript%3E

3.2.2. Protection : injection SQL

@Test
void testEncodeForSQL() {
    String userId = "tom" ou "1=1"" ;
    Chaîne sql = "sélectionnez * de l'utilisateur où utilisateur ='"
            + ESAPI.encoder().encodeForSQL(new MySQLCodec(MySQLCodec.Mode.STANDARD), userId) + "'";

    LOG.info("sql = {}", sql);
}

Sortir:

sql = select * from user où user='tom\' ou \'1\=1\''

3.2.3. Protection : injection de commandes

@Test
annuler testEncodeForOS() {
    Entrée de chaîne = "dir & dir /s" ;
    Chaîne cmd = ESAPI.encoder().encodeForOS(new WindowsCodec(), input);

    LOG.info("cmd = {}", cmd);
}

Sortir:

cmd = rép^ ^&^ rép^ ^/s

3.3. Protection contre les problèmes de validation des entrées

La plus grande menace pour la sécurité du réseau réside dans les entrées externes. La vérification des entrées externes joue donc le plus grand rôle de protection dans la sécurité des applications.

3.3.1. Vérification des entrées ESAPI

ESAPI a une configuration de validation d'entrée : validation.properties donne les validations couramment utilisées.

validation.propriétés

Validator.SafeString=^[.\\p{Alnum}\\p{Espace}]{0,1024}$
Validator.Email=^[A-Za-z0-9._%'-]+@[A-Za-z0-9.-]+\\.[a-zA-Z]{2,4}$
Validator.IPAddress=^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.) {3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Validator.URL=^(ht|f)tp(s?)\\:\\/\\/[0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z ])*(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\:\\'\\/\ \\\\\+=&;%\\$#_]*)?$
Validator.CreditCard=^(\\d{4}[- ]?){3}\\d{4}$
Validator.SSN=^(?!000)([0-6]\\d{2}|7([0-6]\\d|7[012]))([ -]?)(?!00 )\\d\\d\\3(?!0000)\\d{4}$

Interface de vérification

/**
  * Vérification des entrées
  *
  * Contenu de vérification du contexte @param
  * Entrée de vérification d'entrée @param  
  * Type de vérification de type @param, correspondant au type dans validation.properties
  * @param maxLength vérification de la longueur maximale du caractère d'entrée
  * @param allowNull caractère d'entrée Vérification de la valeur nulle, false - non autorisé ; true - autorisé
  * @return Si la vérification échoue, elle renvoie false ; si la vérification réussit, elle renvoie true.
  */
booléen ESAPI.validator().getValidInput (contexte de chaîne, entrée de chaîne, type de chaîne, int maxLength, booléen allowNull);
@Test
void testValidatorEmail() {
    Entrée de chaîne = "xxxx.com" ;
    if (!ESAPI.validator().isValidInput("", input, "Email", 11, false)) {
        LOG.error("Échec de la validation de l'e-mail !");
    } autre {
        LOG.info("L'e-mail est validé.");
    }
}

Sortir:

Échec de la validation de l'e-mail !

4. Problèmes courants rencontrés lors de l'utilisation et de la mise à niveau d'ESAPI

4.1. org.owasp.esapi.reference.DefaultEncoder CTOR a levé une exception provoquée par ExceptionInInitializerError

org.owasp.esapi.errors.ConfigurationException : java.lang.reflect.InvocationTargetException Classe d'encodeur (org.owasp.esapi.reference.DefaultEncoder) CTOR a levé une exception.
 sur org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:129)
 sur org . owasp . esapi . ESAPI . encode ( ESAPI . java : 101 )
 sur com.test.esapi.EsapiTest.testUpdateJulietInfo_good(EsapiTest.java:19)
 sur java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
 sur java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Causé par : java.lang.reflect.InvocationTargetException

 sur org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:86)
 ... 71 de plus
Causé par : java.lang.ExceptionInInitializerError
 sur java.base/java.lang.Class.forName0 (méthode native)
 sur java.base/java.lang.Class.forName(Class.java:375)
 à org.owasp.esapi.util.ObjFactory.loadClassByStringName(ObjFactory.java:158)
 sur org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:81)
 sur org.owasp.esapi.ESAPI.logFactory(ESAPI.java:139)
 sur org.owasp.esapi.ESAPI.getLogger(ESAPI.java:155)
 sur org.owasp.esapi.reference.DefaultEncoder.(DefaultEncoder.java:85)
 sur org.owasp.esapi.reference.DefaultEncoder.(DefaultEncoder.java:109)
 sur org.owasp.esapi.reference.DefaultEncoder.getInstance(DefaultEncoder.java:68)
 ... 76 de plus
Causé par : org.owasp.esapi.errors.ConfigurationException : impossible de localiser la ressource : esapi-java-logging.properties
 sur org.owasp.esapi.logging.java.JavaLogFactory.readLoggerConfiguration(JavaLogFactory.java:128)
 sur org.owasp.esapi.logging.java.JavaLogFactory.(JavaLogFactory.java:96)
 ... 85 de plus

Il s'agit du problème le plus courant rencontré lors de la mise à niveau d'ESAPI vers des versions ultérieures à 2.5.0.0.

2.5.0.0 est une version modifiée importante d'ESAPI. Nous pouvons voir à partir des informations de changement de version :

  • Cette version d'ESAPI abandonne complètement la prise en charge de Log4J, qui souffre des vulnérabilités constantes de Log4J, et utilise à la place SLF4J. Si votre propriété ESAPI.Logger est définie pour utiliser Log4J, des exceptions ou erreurs obscures seront générées, généralement ExceptionInInitializerError, si vous ne la modifiez pas.
  • AntiSamy a été mis à niveau vers la version 1.7.0 et le fichier AntiSamy-sapi.xml personnalisé d'AntiSamy est pris en charge.
  • Comme dans la version précédente, cette version ne prend en charge que Java 8 ou supérieur.

De là, vous pouvez voir que ExceptionInInitializerError devrait être provoqué par le composant du journal des modifications. Les amis familiers penseront immédiatement au fichier de configuration d'ESAPI, ESAPI.properties, qui donne la configuration de tous les composants.

Comme vous pouvez le voir des lignes 69 à 72 de la figure, ligne 69 :

ESAPI.Logger=org.owasp.esapi.logging.java.JavaLogFactory

Il pointe toujours vers org.owasp.esapi.logging.java.JavaLogFactory. Les commentaires suivants nous rappellent également qu'il faut le remplacer par la ligne 71 :

ESAPI.Logger=org.owasp.esapi.logging.slf4j.Slf4JLogFactory

Le problème est résolu après modification.

4.2. java.lang.NoClassDefFoundError : javax/servlet/http/HttpServletRequest

java.lang.NoClassDefFoundError : javax/servlet/http/HttpServletRequest
 sur java.base/java.lang.Class.getDeclaredMethods0 (méthode native)
 sur java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3402)
 sur java.base/java.lang.Class.getMethodsRecursive(Class.java:3543)
 sur java.base/java.lang.Class.getMethod0(Class.java:3529)
 sur java.base/java.lang.Class.getMethod(Class.java:2225)
 sur org.owasp.esapi.util.ObjFactory.loadMethodByStringName(ObjFactory.java:196)
 sur org.owasp.esapi.util.ObjFactory.findSingletonCreateMethod(ObjFactory.java:173)
 sur org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:84)
 sur org.owasp.esapi.ESAPI.validator(ESAPI.java:192)
 sur com.huawei.hwe.esapi.EsapiTest.testEsapi_encodeForURL(EsapiTest.java:23)
 sur java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
 sur java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

Causé par : java.lang.ClassNotFoundException : javax.servlet.http.HttpServletRequest
 sur java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
 sur java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
 sur java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
 ... 79 de plus

Ce problème manque évidemment de bibliothèques dépendantes. Nous pouvons afficher la définition de la bibliothèque Maven et les informations sur les dépendances concernant ESAPI.
https://mvnrepository.com/artifact/org.owasp.esapi/esapi/2.5.3.1

Dépendances de compilation

Dépendances d'exécution

À partir des dépendances en cours d'exécution, vous pouvez voir les exigences : javax.servlet » javax.servlet-api.
Cliquez sur le numéro de version : 3.1.0 pour obtenir la configuration des dépendances mvn de javax.servlet-api 3.1.0. Ajoutez cette configuration à le fichier pom.xml du projet dessus.

Après avoir ajouté la configuration javax.servlet-api dans pom.xml, le problème est résolu.

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dépendance>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>fourni</scope>
</dépendance>

Cliquez pour suivre et découvrir les nouvelles technologies de Huawei Cloud dès que possible~

npm est abusé - quelqu'un a téléchargé plus de 700 vidéos de tranches de Wulin Gaiden "Linux Chine" La communauté open source a annoncé qu'elle cesserait ses activités Microsoft a formé une nouvelle équipe pour aider à réécrire la bibliothèque principale de Windows avec l'assistant d'IA fourni avec Rust JetBrain qui a provoqué le mécontentement des utilisateurs Deutsche Bahn recrute des personnes familiarisées avec MS - Les administrateurs informatiques de DOS et Windows 3.11 VS Code 1.86 entraîneront l'indisponibilité de la fonction de développement à distance. FastGateway : une passerelle qui peut être utilisée pour remplacer Nginx. Sortie de Visual Studio Code 1.86 . Sept départements dont le Le ministère de l'Industrie et des Technologies de l'information a publié conjointement un document : Développer le système d'exploitation de nouvelle génération et promouvoir la technologie open source. , Construire un écosystème open source Windows Terminal Preview 1.20 publié
{{o.name}}
{{m.nom}}

Je suppose que tu aimes

Origine my.oschina.net/u/4526289/blog/11029214
conseillé
Classement