{"id":259,"date":"2012-12-05T08:26:32","date_gmt":"2012-12-05T08:26:32","guid":{"rendered":"http:\/\/bdenisb.wordpress.com\/?p=238"},"modified":"2012-12-05T08:26:32","modified_gmt":"2012-12-05T08:26:32","slug":"javascript-faille-de-securite","status":"publish","type":"post","link":"https:\/\/lig-membres.imag.fr\/denisb\/javascript-faille-de-securite\/","title":{"rendered":"Javascript &#8211; Faille de s\u00e9curit\u00e9 ?"},"content":{"rendered":"<p>Javascript a de nombreux avantages (open, ind\u00e9pendant d&#8217;un os, beaucoup utilis\u00e9, &#8230;), c&#8217;est pourquoi je milite pour que les d\u00e9veloppements dans le monde de l&#8217;\u00e9ducation puissent aussi reposer dessus c&#8217;est possible, (j&#8217;en ai fait la preuve avec <a title=\"EDBA, nouvelle adresse =&gt; edba.imag.fr\" href=\"https:\/\/edba.imag.fr\/index_EDBA_Full.html\">edba<\/a>, lire cet <a title=\"EIAH\u20192011\" href=\"http:\/\/bdenisb.wordpress.com\/2012\/02\/21\/eiah2011\/\">article<\/a>) et donnent lieu \u00e0 des applications sous forme de pages web autonomes (seul besoin pour les faire fonctionner cot\u00e9 utilisateur : un navigateur web et une connexion au r\u00e9seau ; cot\u00e9 d\u00e9veloppeur, une fois d\u00e9velopp\u00e9e, la page web peut \u00eatre d\u00e9pos\u00e9e sur un serveur web minimal). Cependant, jusqu&#8217;\u00e0 maintenant, j&#8217;avais un doute : tr\u00e8s souvent, l&#8217;utilisation de javascript ne prends pas en compte les possibles tentatives de fraude et il s&#8217;av\u00e8re qu&#8217;il est assez souvent facile d&#8217;arriver \u00e0 r\u00e9pondre \u00e0 un quizz, un qcm, &#8230; sans connaitre la r\u00e9ponse mais en allant chercher dans le code quelle est la r\u00e9ponse attendue. C&#8217;est particuli\u00e8rement vrai pour des pages reposant uniquement sur javascript. Une solution pour \u00e9viter cela consiste \u00e0 introduire un peu de PHP dans l&#8217;application, code d\u00e9pos\u00e9 sur le serveur pour y faire l&#8217;analyse des r\u00e9ponses (laisser le javascript sur le poste client analyser les r\u00e9ponses, c&#8217;est prendre le risque de laisser la main \u00e0 l&#8217;utilisateur pour qu&#8217;il regarde comment l&#8217;analyse se fait, ou la simuler pour voir le r\u00e9sultat, ou &#8230; -toute m\u00e9thode de reverse engineering qui permet de retrouver les r\u00e9ponses), le code sur le serveur est inattaquable (enfin, presque &#8230;) et assure la s\u00e9curit\u00e9 du syst\u00e8me. L&#8217;inconv\u00e9nient, c&#8217;est que le projet n&#8217;est plus totalement open, qu&#8217;il ne peut plus tenir dans une page web unique et qu&#8217;il faut connaitre javascript+php pour le d\u00e9velopper. Cela fait beaucoup.<\/p>\n<p>Un autre soucis avec Javascript concerne des projets plus gros qui auraient besoin d&#8217;un base de\u00a0 donn\u00e9es centralis\u00e9e sur un serveur (il y en a, et particuli\u00e8rement dans le domaine de la recherche o\u00f9 l&#8217;on veut conserver une trace de l&#8217;activit\u00e9 pour en faire l&#8217;analyse). Tout faire en javascript semble difficile car l&#8217;acc\u00e8s aux bases de donn\u00e9es se fait en g\u00e9n\u00e9ral \u00e0 partir des serveurs et non des clients (et donc \u00e0 nouveau en php, par exemple), ou \u00e0 partir d&#8217;application standard (hors navigateur) pour avoir des droits \u00e9tendus sur l&#8217;acc\u00e9s au r\u00e9seau (ou au disque dur). Pour les applications web tenant dans une page web, c&#8217;est \u00e0 dire pour les application web fonctionnant dans un navigateur, cela passe par une partie du code sur le client (en g\u00e9n\u00e9ral javascript), et une partie sur le serveur (en g\u00e9n\u00e9ral php). Pour diverses raisons, et en particulier des raisons de s\u00e9curit\u00e9, la part php est in\u00e9vitable et ne se r\u00e9duit pas \u00e0 laisser rebondir la demande javascript directement vers le serveur. Pour certaines requ\u00eates sur la base de donn\u00e9es, le simple rebond est possible : pour la consultation des parties publiques de la base, par exemple ; pour d&#8217;autres requ\u00eates un petit probl\u00e8me de confidentialit\u00e9 peut surgir : consultation d&#8217;informations personnelles ; pour d&#8217;autre encore, c&#8217;est un trop gros probl\u00e8me pour imaginer utiliser un simple rebond : par exemple pour l&#8217;acc\u00e8s en \u00e9criture\/modification\/suppression sur l&#8217;ensemble de la base (par erreur ou \u00e0 dessein, un utilisateur peut alors alt\u00e9rer\/d\u00e9truire le contenu de la base).<\/p>\n<p>Faut-il se r\u00e9soudre \u00e0 apprendre php &#8230; ? Non, pas n\u00e9cessairement &#8230; Pour les probl\u00e8mes de triches aux QCM, il y a moyen de compliquer un peu le code d&#8217;\u00e9valuation d&#8217;une r\u00e9ponse \u00e0 un test pour que le reverse engineering soit difficile (sans que le travail demand\u00e9 pour la modification de code soit tr\u00e8s importante) : ne pas mettre en clair la r\u00e9ponse (\u00e9ventuellement la coder, mais cela ne suffit pas toujours), au lieu d&#8217;analyser une seule r\u00e9ponse \u00e0 la fois, il est pr\u00e9f\u00e9rable d&#8217;en prendre plusieurs en m\u00eame temps (la combinatoire des r\u00e9ponses possibles est alors plus grande et ne peut \u00eatre test\u00e9e par essai\/erreur), et utiliser une fonction asym\u00e9trique (type MD5) pour voir les r\u00e9sultats. Ce sera un r\u00e9sultat global, avec un m\u00e9canisme de type code-correcteur, on peut \u00e0 partir de plusieurs r\u00e9sultats globaux de ce genre identifier le nombre d&#8217;erreur, et selon la m\u00e9thode employ\u00e9e localiser les erreurs (mais alors il y a moyen de faire du reverse engineering). Pour l&#8217;acc\u00e8s au base de donn\u00e9es, la solution vient d&#8217;un travail d&#8217;identification de la demande avec mot de passe, mais attention, un vrai identification, et qui prend en compte le fait que le code javascript est visible : cela peut se faire avec un syst\u00e8me \u00e0 cl\u00e9 publique (comme pour rsa). La bonne nouvelle, dans un cas comme dans l&#8217;autre, c&#8217;est que les algorithmes un peu compliqu\u00e9s (MD5, RSA) sont disponibles en javascript (il y a beaucoup de choses en javascript, c&#8217;\u00e9tait d\u00e8j\u00e0 une <a title=\"Des interpr\u00e9teurs javascript \u2026\" href=\"http:\/\/bdenisb.wordpress.com\/2012\/02\/20\/117\/\">bonne nouvelle<\/a> il y a quelques ann\u00e9es) :<\/p>\n<ul>\n<li>MD5 : <a href=\"http:\/\/actuel.fr.selfhtml.org\/articles\/javascript\/md5\/index.htm\"> http:\/\/actuel.fr.selfhtml.org\/articles\/javascript\/md5\/index.htm<\/a> (utilis\u00e9 dans <a href=\"https:\/\/edba.imag.fr\/index_EDBA_Full.html\">EDBA<\/a>)<\/li>\n<li>RSA : http:\/\/www.ohdave.com\/rsa\/ (pas encore test\u00e9)<\/li>\n<\/ul>\n<p>exemple : essayer de trouver les dates de naissance\/mort de <a href=\"https:\/\/c9.io\/denisb\/qcm-js\/workspace\/date-1.html\">Alan <\/a> (pour la naissance, aide : regarder le code, pour la mort, aide ???). Autre exemple avec des r\u00e9ponses bool\u00e9ennes : essayer de trouver le<a href=\"https:\/\/c9.io\/denisb\/qcm-js\/workspace\/mf-1.html\"> sexe de ces anges<\/a> (aide : regarder le code), ou de savoir si <a href=\"https:\/\/c9.io\/denisb\/qcm-js\/workspace\/cs-1.html\">ceux-ci<\/a> ont fait avancer l&#8217;informatique ( aide ???). Quand il n&#8217;y a pas d&#8217;aide imm\u00e9diate (&#8220;aide ???&#8221;), i.e. quand regarder le code ne suffit pas, il reste toujours la m\u00e9thode dite &#8220;brutale&#8221; qui consiste \u00e0 <em>tout<\/em> tester &#8230; lorsque le &#8220;tout&#8221; ne comporte qu&#8217;une dizaine de cas, l&#8217;\u00e9tude exhaustive peut se faire \u00e0 la main ; lorsque le &#8220;tout&#8221; comporte plusieurs milliers de cas, un programme peut le faire ; lorsqu&#8217;il y a des milliards de milliards de cas \u00e0 voir, &#8230; ???<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Javascript a de nombreux avantages (open, ind\u00e9pendant d&#8217;un os, beaucoup utilis\u00e9, &#8230;), c&#8217;est pourquoi je milite pour que les d\u00e9veloppements [&hellip;]<\/p>\n","protected":false},"author":42,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[101,42,51,7,5,52,33],"tags":[148,150,152,154,156,161,162,163,169],"class_list":["post-259","post","type-post","status-publish","format-standard","hentry","category-101","category-breve","category-brouillon","category-edba-recherche","category-enseignement","category-html","category-javascript","tag-javascript-2","tag-md5","tag-navigateur-web","tag-php-2","tag-poste-client","tag-reverse-engineering","tag-rsa","tag-securite","tag-triche"],"_links":{"self":[{"href":"https:\/\/lig-membres.imag.fr\/denisb\/wp-json\/wp\/v2\/posts\/259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lig-membres.imag.fr\/denisb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lig-membres.imag.fr\/denisb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lig-membres.imag.fr\/denisb\/wp-json\/wp\/v2\/users\/42"}],"replies":[{"embeddable":true,"href":"https:\/\/lig-membres.imag.fr\/denisb\/wp-json\/wp\/v2\/comments?post=259"}],"version-history":[{"count":0,"href":"https:\/\/lig-membres.imag.fr\/denisb\/wp-json\/wp\/v2\/posts\/259\/revisions"}],"wp:attachment":[{"href":"https:\/\/lig-membres.imag.fr\/denisb\/wp-json\/wp\/v2\/media?parent=259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lig-membres.imag.fr\/denisb\/wp-json\/wp\/v2\/categories?post=259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lig-membres.imag.fr\/denisb\/wp-json\/wp\/v2\/tags?post=259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}