javascript - theme - site wordpress




Publication d'un blob de toile via AJAX: empêcher/supprimer le cache local (2)

Dans tous les cas, le blob est supprimé quand,

  1. il n'y a pas de références à cela (collecte des ordures)
  2. l'onglet / fenêtre est fermée

Dans ce contexte, le terme «cache» ne signifie pas sur une longue période, mais plutôt pas recalculé chaque fois qu'il est accédé.

La mise en cache du contenu à long terme serait un gaspillage d'espace de stockage, car une toile est conçue pour être dynamique. Si c'était un contenu statique, un <img> devrait être utilisé.

Je n'ai regardé aucun code source, mais c'est une conclusion logique. Après que jQuery arrête de référencer le blob (lorsque la requête est envoyée), il doit être récupéré par le garbage collector et jeté.

La suppression sécurisée est de très bas niveau et les navigateurs ne l'autoriseraient jamais. Il fonctionne essentiellement en écrivant à des adresses spécifiques sur le disque dur, ce qui pourrait être mal calculé et ruiner des milliers de fichiers (dans une partition fortement fragmentée). Si elles le stockent sur le disque, il sera récupérable par l'informatique judiciaire.

Je télécharge une image de toile sur mon serveur par AJAX en utilisant une méthode comme celle-ci:

myCanvas.toBlob( function( blob ) {
    var fdata = new FormData( );
    fdata.append( 'myFile', blob );
    $.ajax( {
        url: 'http://myScript.foo',
        type: 'POST',
        data: fdata,
        processData: false,
        contentType: false
    } );
}, 'image/jpeg', 0.9 );

(avec merci à https://stackoverflow.com/a/8244082/1180785 )

Mais d'après Mozilla,

toBlob [...] Renvoie un objet Blob représentant l'image contenue dans le canevas; ce fichier peut être mis en cache sur le disque ou stocké en mémoire à la discrétion de l'agent utilisateur

( https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement )

Il est très important pour mon programme que l'image ne soit pas conservée (pas comme une restriction, mais comme un problème de confidentialité). Donc j'ai besoin de savoir s'il y a une garantie que cette copie cachée possible sera supprimée, et quand. Il y a aussi un risque potentiel que les programmes non récupérés le trouvent, alors j'aimerais savoir si je peux écraser les données ou forcer une suppression sécurisée d'une autre manière.

S'il est possible d'obtenir le même résultat sans risquer une copie localement mise en cache, ce serait encore mieux. Le cryptage est également une option si c'est possible.

Je me soucie seulement des navigateurs modernes, prenant en getUserMedia spécifiquement getUserMedia , donc pas d'IE (j'ai une solution de repli Flash pour les anciens navigateurs qui traite tout en mémoire).


Si la confidentialité et la sécurité sont importantes, vous devriez envisager de générer un data-uri de data-uri partir du canevas au lieu d'un objet Blob .

Comme le blob peut être ou ne pas être stocké (mis en cache) temporairement sur le disque, le fichier sera soumis à des situations de sécurité (c'est-à-dire que vous devrez annuler la suppression ). Un fichier / une chaîne de mémoire sera bien sûr disponible pour un balayage de mémoire, mais il est aussi proche que possible de la "sécurisation" lorsque vous obtenez une image de canvas pour le transfert.

Un data-uri est habituellement * généré en mémoire seulement et contient typiquement une image codée en base64 (si votre image est très grande, il y a toujours le risque qu'elle soit paginée sur le disque).

*) dépendant de l'implémentation, par exemple, il est plus probable que les navigateurs mobiles utilisent un temp-to-file s'il y a peu de ressources mémoire disponibles - cependant, ce comportement possible n'est pas documenté.

Pour utiliser un data-uri place:

canvas.toDataURL();

Vous pouvez éventuellement spécifier un type d'image (la valeur par défaut est PNG):

canvas.toDataURL('image/jpeg'); //optional second parameter is quality [0.0, 1.0]

Une autre option consiste à extraire les pixels directement à partir de canvas et à les stocker dans un tableau (typé). Les données peuvent ensuite être transférées telles quelles ou on peut utiliser une bibliothèque de compression pour compresser par exemple avant d'envoyer les données.

Cependant, cette approche est la moins efficace.





html5-canvas