CFWindow + DatePicker + IE …

Salut,
Je viens de tomber sur un petit problème et comme d’habitude je partage mon problème ainsi que la solution que j’ai trouvé.

L’origine de mon problème est la suivante:
Je créé une fenêtre avec cfwindow et à l’intérieur de celle-ci ce trouve plusieurs control dont certains
doivent recevoir

setTimeout(function(){
$(« #startDate »).datepicker({ dateFormat: « yy-mm-dd » });
},500);

On peut voir ici que pour aciver le datepicker j’ai du faire appel à la fonction javascript: setTimeout. la raison est simple l’appel à cette page via CFWindow est un appel ajax donc asynchrone, et pour être sur que le control soit bien de type datepicker.

Si je laisse comme ça le calendrier apparaitra derrière le fenêtre CFWindow donc j’ai ajouté ceci avant l’HTML

<style>
div.ui-datepicker {
z-index: 9999 !important;
}
</style>

Houra!!!!! Ca fonctionne avec Firefox mais pas avec IE (je ne le considère pas comme un browser).

Que faire …

He bien grace au site css-tricks j’ai trouvé la solution.

il faut ajouter ce code dans le setTimeout après la création du datepicker.
$(function() {
var zIndexNumber = 1000;
// Put your target element(s) in the selector below!
$(« div »).each(function() {
$(this).css(‘zIndex’, zIndexNumber);
zIndexNumber += 1;
});

La version du code complet avec le style et le JQuery qui va avec

<style>
div.ui-datepicker {
z-index: 9999 !important;
}
</style>

setTimeout(function(){
$(« #startDate »).datepicker({ dateFormat: « yy-mm-dd » });
$(function() {
var zIndexNumber = 1000;
// Put your target element(s) in the selector below!
$(« div »).each(function() {
$(this).css(‘zIndex’, zIndexNumber);
zIndexNumber += 1;
});
},500);

Référence
http://css-tricks.com/snippets/jquery/fixing-ie-z-index/ il propose des solutions sur les CSS.

Synchronisation avec Coldfusion Builder 2

Une fonctionalité intéressante de CFB 2 c’est la possibilité de synchroniser son code avec un serveur ftp où est hébergé le site de dev. cad que lorsque vous faites une modification dans votre code il upload la modification sur le serveur et à la bonne place ;-).

Pour ce faire vous devez d’abord créer une connexion ftp vers votre serveur dans dans l’onglet File. La choisissez ftp, ftps ou sftp et pointez vers le répertoire root de votre application.

Ceci fait allez dans l’onglet Navigator cliquez avec le bouton droit sur votre projet et choisissez Synchronize puis « Create New Synchronize Connection ».
Dans la boite de dialogue donnez un nom à cette connexion, choisissez votre projet et dans remote sélectionnez votre connexion ftp nouvellement créée. Voila votre synchornisation avec votre serveur ftp est faite. A présent chaque modification que vous effecturez sera remonté via ftp.

Maintenant comment faire pour retirer cette connexion si le besoin s’en fait sentir. Vous devez vous rendre dans la vue Sync Manager disponible via Window=>Show View=>Other=>HTML Standard Views=>Sync Manager. Vous verrez que dans cette fenêtre il y aura votre connexion ftp et votre sync connexion. Pour supprimer votre sync connexion sélectionnez la puis faite delete. Maintenant toutes les modifications apportés à votre code ne sera plus remonté.

Sécurité : social engineering

social engineering une vulnérabilité souvent oublié. En effet rien de plus simple que de remplir un faux formlulaire et l’envoyer vers la cible de votre formulaire avec les dégats que cela entrainent.

Pour palier à ça il y a une méthode toute simple qui consiste à ajouter un champs hidden qui contient un gui et de copier ce même gui dans la session de l’utilisateur. Dans la page cible vous testez si le gui de la session est le même que celui envoyé via le form.

si ce n’est pas le cas vous pouvez simplement rediriger vers une page par défaut de votre site.

un petit exemple:

<!--- page source --->
<cfset session.token = createuuid()>

<form action="target.cfm">
<input type="hidden" id="token" value="#session.token#">
<input type="text" id="prenom">
<input type="submit">
</form>

<!--- page cible --->
<cfif structKeyExists(form,"token") and structKeyExists(session,"token") and session.token is form.token>
<p>vous avez passé le test du token.</p>
<cfelse>
<p>il y a un problème avec votre token.</p>
</cfif>

<cfset structdelete(session,"token")>

Dans cf10 cette protection est incluse : CSRF attack.

J’espère que ce petit truc pourra vous aider dans la sécurisation de votre application.

Sécurité : Cross-site scripting

Aujourd’hui parlont de sécurité.

Qu’est-ce que le cross-site scripting ? définition de Wikipédia XSS.

Pour protéger correctement une application il y a plusieurs choses à faire. Je vous propose de voir ce qui est important de réaliser sur coldfusion ainsi que sur l’application.

Coté serveur
– Il faut activer l’option « Enable Global Script Protection » qui se trouve dans Server settings/settings. Cette option ce base sur un fichier de configuration qui se trouve dans \Coldfusion9\lib. Il faut donc modifier le fichier neo-security.xml en lui ajoutant iframe dans la liste des noms à valider ce qui aura pour effet de remplacer le tag interdit par InvalidTag

<var name='CrossSiteScriptPatterns'>
<struct type='coldfusion.server.ConfigMap'>
<var name='<\s*(object|embed|script|applet|meta|iframe)'>
<string>
<InvalidTag>
</string>
</var>
</struct>
</var>

Coté application
Au niveau de l’application il faut ajouter une petite ligne dans application.cfc :

<script>
this.scriptprotect="all";
</script>

Maintenant il reste à mettre en place une API qui permet d’encoder toutes les infos envoyées par l’utilisateur. pour ce faire il y a plusieurs étapes à suivre pour installer cette API et pour pouvoir l’utiliser.

  • Télécharger l’API à cette adresse : ESAPI 2.0.1
  • Copier le fichier esapi-2.0.1.jar du fichier zip téléchargé dans le répertoire /wwwroot/WEB-INF/lib
  • Télécharger un bon fichier de propriété ESAPI.properties vérifier que les répertoires mappé dans ce fichier pointe bien sur des répertoires existant
  • Modifier les deux paramètres suivant dans le fichier de properties avec des données plus facile à gérer pour vous puis sauvegarder ce fichier dans un répertoire (ex: c:\esapi\config)
  • Encryptor.MasterKey=placer votre clef ici
  • Encryptor.MasterSalt=placer votre clef salt ici
  • Vous devez modifier la configuration de démarrage de la JVM en ajoutant « -Dorg.owasp.esapi.resources=c:\esapi\config »
  • Ajouter dans le classpath de la JVM l’emplacement du fichier.

Voila vous pouvez redémarrer Coldfusion.

Maintenant comment faire pour utiliser cette API ? Très facile.

<cfset ojbEsapi = CreateObject("java","org.owasp.esapi.ESAPI")>
<cfset encoder = ojbEsapi.encoder()>

<form action="#cgi.script_name#" method="post">
txt: <input type="text" name="txt" id="txt">
<input name="btnsub" type="submit">
</form>

<cfif structkeyexist(form,"fieldnames")>
<cfoutput>
#encoder.encodeForHTML(form.txt)#
</cfoutput>

Voila j’espère que cette aide vous aura été utile autant que la recherche d’info l’a été pour moi.

Référence:
securing coldfusion applications vous trouverez d’autres trucs dans cette vidéo.

cffile copy au lieu de rename

Récemment j’ai dû faire du renommage en masse de fichier et parce que les fichiers contenaient des espaces je ne pouvais pas les renommer ne sais quelle raison l’action « rename » ne fonctionnait pas. Ennuyant, n’est-ce pas ?

Qu’à cela ne tienne l’option copy est une bonne solution. Je m’explique.
Quand vous copiez un fichier vous avez l’attribut source et destination, dans la source vous mettez l’adresse, sur votre disque, du fichier source et dans destination vous mettez le repertoire cible. Le petit truc pour que cela fonctionne c’est de mettre le nouveau nom du fichier à la fin du repertoire cible.


<cfset name="test 123.pdf">

<cfset newName="test_123.pdf">

<cffile action="copy" source="c:\temp\#name#" destination="c:\temp\#newName#">

<cffile action="delete" file="c:\temp\#name#">

Après on n’oublie pas d’effacer le fichier source.

Voila j’espère que ce petit truc vous aura aidé.