Content Security Policy (CSP) - sécurité d'emploi dangereux-eval?
Nous utilisons le CSP suivant l'en-tête:
default-src 'self' *.ourdomain.com; script-src 'self' *.ourdomain.com 'sha256-[...]' 'unsafe-eval';
connect-src 'self' *.ourdomain.com;
style-src 'unsafe-inline' * 'self' data:; font-src *;
img-src * 'self' data:
La recommandation par notre équipe de sécurité n'est pas l'utilisation non sécuritaire-eval.
Ma question est la suivante: tant que nous sommes à l'aide de sha256-[...] de limiter les script que nous n'avons pas déployé de nous-mêmes, quel est le risque pour la sécurité de toujours garder dangereux-eval dans le DSP-tête? En quoi la situation serait-ce toujours nous exposer à la croix-attaques contre les sites?
Vous devez vous connecter pour publier un commentaire.
Car eval est littéralement dangereux. Eval dans chaque langue signifie "prendre de cette chaîne et d'exécuter ce code." Bien sûr, vous pouvez être en utilisant eval dans un semi-sûre, mais aussi longtemps que vous laissez à tous, vous dites "personne n'est autorisé à exécuter du code arbitraire dans mon application donnée, un point d'entrée".
C'est mon avis qu'il n'y a aucune raison d'utiliser la fonction eval. Montrez-moi un cas où eval est nécessaire dans utile réelle de code et je parie que je peux réécrire le code sans utiliser eval ou de la déclarer comme incroyablement code sécurisé.
Interdisant de script en ligne est seulement la moitié de la bataille, surtout si vous utilisez jquery.
Quiz: le code de déclencher un script en ligne de violation ou d'un eval violation?
Vous pourriez être surpris.
Spoiler:
eval()
permet d'accélérer l'exécution du code dans les cas où le code dépend de certaines données d'exécution. Pour une utilisation plus spécifique de cas, imaginez un site où l'utilisateur fournit l'URL pour les données, et une expression arbitraire dans les données. L'expression doivent être évalués à des millions de fois. Faire interpretively (par exemple, l'expression "un.b.c" est converti en un tableau ['a','b','c'], et la boucle de l'accès de l'enfant d'un enfant d'un enfant de l'objet) est clairement plus lent que x=eval('(a) => un.b.c') et l'appel x(a).unsafe-eval
est nécessaire pour utiliser le WASM, pour l'instant.Le risque de sécurité est qu'il ne s'agit pas de protéger votre propre code qui peut être vulnérable en raison
eval
est utilisé.Si vous utilisez
eval
dans votre propre code, vous devriez poser la question pourquoi. Est-il une alternative plus sûre qui peut être utilisé à la place?Voir ici pour un (fictive) exemple de la façon dont le code peut être injecté par un attaquant. Bien sûr, si cela peut être fait à votre site dépend beaucoup de votre code.
Le résultat est que, il y a presque toujours une alternative à l'utilisation de
eval
.