
bluemonday : un assainisseur HTML rapide en golang (inspiré de l'OWASP Java HTML Sanitizer) pour nettoyer le contenu généré par les utilisateurs des XSS
bluemonday est un assainisseur HTML implémenté en Go. Il est rapide et hautement configurable.
bluemonday prend en entrée du contenu généré par l'utilisateur non fiable et renvoie du HTML qui a été assaini en fonction d'une liste blanche d'éléments et d'attributs HTML approuvés, afin que vous puissiez inclure ce contenu en toute sécurité dans votre page web.
Si vous acceptez du contenu généré par l'utilisateur et que votre serveur utilise Go, vous avez besoin de bluemonday.
La politique par défaut pour le contenu généré par l'utilisateur (bluemonday.UGCPolicy().Sanitize()) transforme ceci :
Hello <STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>World
En un inoffensif :
Hello World
Et transforme ceci :
<a href="javascript:alert('XSS1')" onmouseover="alert('XSS2')">XSS<a>
En ceci :
XSS
Tout en permettant toujours ceci :
<a href="http://www.google.com/">
<img src="https://ssl.gstatic.com/accounts/ui/logo_2x.png"/>
</a>
À passer presque inchangé (il a gagné un rel="nofollow", ce qui est une bonne chose pour le contenu généré par l'utilisateur) :
<a href="http://www.google.com/" rel="nofollow">
<img src="https://ssl.gstatic.com/accounts/ui/logo_2x.png"/>
</a>
Il protège les sites contre les attaques XSS. Il existe de nombreux vecteurs d'attaque XSS et la meilleure façon d'atténuer le risque est d'assainir les entrées utilisateur par rapport à une liste connue et sûre d'éléments et d'attributs HTML.
Vous devez toujours exécuter bluemonday après tout autre traitement.
Si vous utilisez blackfriday ou Pandoc, bluemonday doit être exécuté après ces étapes. Cela garantit qu'aucun HTML non sécurisé n'est introduit plus tard dans votre processus.
bluemonday est fortement inspiré à la fois du OWASP Java HTML Sanitizer et du HTML Purifier.
Basé sur une liste blanche, vous devez soit construire une politique décrivant les éléments et attributs HTML à autoriser (et les motifs regexp des attributs), soit utiliser l'une des politiques fournies qui représentent de bons réglages par défaut.
La politique contenant la liste blanche est appliquée à l'aide d'un analyseur rapide, non validant, en avant uniquement, basé sur des jetons, implémenté dans la bibliothèque Go net/html par l'équipe centrale de Go.
Nous nous attendons à recevoir du HTML bien formaté (éléments fermants pour chaque élément ouvrant applicable, imbrication correcte) et nous ne nous concentrons donc pas sur la réparation d'un HTML mal imbriqué ou incomplet. Nous nous concentrons simplement sur le fait que tous les éléments qui existent sont décrits dans la liste blanche de la politique et que les attributs et les liens sont sûrs pour une utilisation sur votre page web. GIGO s'applique ; si vous lui fournissez du mauvais HTML, bluemonday n'a pas pour mission de trouver comment le rendre à nouveau correct.
Oui
Nous utilisons bluemonday en production après avoir migré depuis le OWASP Java HTML Sanitizer, largement utilisé et testé sur le terrain.
Nous passons notre vaste suite de tests (y compris les tests AntiSamy ainsi que des tests pour tout problème soulevé). Vérifiez s'il y a des problèmes non résolus pour voir si quelque chose peut vous bloquer.
Nous invitons les pull requests et les signalements de problèmes pour nous aider à garantir une protection complète contre diverses attaques via du contenu généré par l'utilisateur.
Installez avec go get github.com/microcosm-cc/bluemonday
Puis appelez-le :
package main
import (
"fmt"
"github.com/microcosm-cc/bluemonday"
)
func main() {
// Faites cela une fois pour chaque politique unique et utilisez la politique pour la durée de vie du programme
// La création/édition de politique n'est pas sûre à utiliser dans plusieurs goroutines
p := bluemonday.UGCPolicy()
// La politique peut ensuite être utilisée pour assainir beaucoup d'entrées et il est sûr d'utiliser la politique dans plusieurs goroutines
html := p.Sanitize(
`<a onblur="alert(secret)" href="http://www.google.com">Google</a>`,
)
// Sortie :
// <a href="http://www.google.com" rel="nofollow">Google</a>
fmt.Println(html)
}
Nous offrons trois façons d'appeler Sanitize :
p.Sanitize(string) string
p.SanitizeBytes([]byte) []byte
p.SanitizeReader(io.Reader) bytes.Buffer
Si vous êtes obsédé par les performances, p.SanitizeReader(r).Bytes() renverra un []byte sans effectuer de conversion inutile des entrées ou sorties. Bien que la différence soit si négligeable que vous ne devriez jamais avoir à vous en soucier.
Vous pouvez construire vos propres politiques :
package main
import (
"fmt"
"github.com/microcosm-cc/bluemonday"
)
func main() {
p := bluemonday.NewPolicy()
// Exiger que les URL soient analysables par net/url.Parse et soient soit :
// mailto: http:// ou https://
p.AllowStandardURLs()
// Nous n'autorisons que <p> et <a href="">
p.AllowAttrs("href").OnElements("a")
p.AllowElements("p")
html := p.Sanitize(
`<a onblur="alert(secret)" href="http://www.google.com">Google</a>`,
)
// Sortie :
// <a href="http://www.google.com">Google</a>
fmt.Println(html)
}
Nous fournissons deux politiques par défaut :
bluemonday.StrictPolicy() qui peut être considérée comme équivalente à la suppression de tous les éléments HTML et de leurs attributs car elle n'a rien dans sa liste blanche. Un exemple d'utilisation serait les titres de billets de blog où les balises HTML ne sont pas du tout attendues et si elles le sont, les éléments et le contenu des éléments doivent être supprimés. C'est une politique très stricte.bluemonday.UGCPolicy() qui autorise une large sélection d'éléments et d'attributs HTML sûrs pour le contenu généré par l'utilisateur. Notez que cette politique n'autorise pas les iframes, object, embed, styles, script, etc. Un exemple d'utilisation serait le corps de billets de blog où une variété de formatage est attendue ainsi que la possibilité de TABLEs et IMGs.L'essence de la construction d'une politique est de déterminer quels éléments et attributs HTML sont considérés comme sûrs pour votre scénario. OWASP fournit une antisèche de prévention XSS pour aider à expliquer les risques, mais essentiellement :
script, style, iframe, object, embed, base qui permettent l'exécution de code par le client ou l'inclusion de contenu tiers pouvant exécuter du codeEn gros, vous devez être capable de décrire quel HTML est acceptable pour votre scénario. Si vous n'êtes pas sûr de pouvoir décrire votre politique, envisagez d'utiliser l'une des politiques fournies comme bluemonday.UGCPolicy().
Pour créer une nouvelle politique :
p := bluemonday.NewPolicy()