> For the complete documentation index, see [llms.txt](https://guide-api-rest.marmicode.fr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://guide-api-rest.marmicode.fr/securite-des-apis-rest/c.s.r.f.-and-media-type.md).

# C.S.R.F. & Media Type

L’une des erreurs classiques est d’accepter des *media types* autres que `application/*json` *(header `Content-Type`)*.

Sans aucune autre erreur de configuration C.O.R.S., l’acceptation du *media type*`application/x-www-form-urlencoded` permet à l’attaquant de créer un formulaire et de déclencher une simple requête POST.

```javascript
document.querySelector('form').submit()
```

Dans ce cas, la plupart des frameworks *(Ex. : expressjs)* récupèrent un objet :

```javascript
{
   email: 'pwned.by@attacker.io',
   grants: 'all'
}
```

{% hint style="danger" %}
**Il ne faut donc activer que le&#x20;*****parser*****&#x20;JSON.**
{% endhint %}

… mais supposons qu’il soit activé sur tous les "media types" et plus particulièrement `text/plain` pour simplifier la vie des développeurs "client-side".

1\. L’attaquant n’a plus qu’à adapter légèrement le formulaire précédent :

```markup
<form
    method="POST"
    action="https://app.vulnerable.com/api/products/0/admins"
    enctype="text/plain">
    <input
         name='{"email": "pwned.by@attacker.io", "grants": "all", "extra": "'
        value='"}'>
</form>
```

2\. Cela va alors envoyer le "body" suivant :

```javascript
{"email": "pwned.by@attacker.io", "grants": "all", "extra": "="}
```

3\. L’API va alors "parser" le contenu suivant :

```javascript
{
    email: 'pwned.by@attacker.io',
    grants: 'all',
    extrat: '='
}
```

{% hint style="danger" %}
**La vérification du&#x20;*****media type*****&#x20;des requêtes doit donc être rigoureuse.**
{% endhint %}
