Conversion de fragment HTML en codes UTF-8 encapsulés en Javascript
Le 28 octobre 2007, à 1:18 par Ulhume...
Une petite procédure PHP qui permet d'encoder un fragment de texte (généralement un formulaire HTML à protéger des spammeurs ou de Google) en son équivalent numérique/UTF en javaScript.
Les deux fonctions qui suivent sont un exemple d'utilisation pour l'encodage respectivement des formulaires et des liens avec Drupal.
function riddle_javascript_encode($html)
{
// Encodage du formulaire
$result='<script>';
{
$block=substr($html,0,BLOCK_SIZE
);
$html=substr($html,BLOCK_SIZE
);
$result.="\ndocument.write(String.fromCharCode(";
$nbCodes=0;
$iChar=0;
while ($iChar<$len)
{
$h = ord($block{$iChar});
if ($h <= 0x7F) {
$code=$h;
$iChar++;
} else if ($h < 0xC2) {
$code=0;
$iChar++;
} else if ($h <= 0xDF && $iChar < $len - 1) {
$code=($h & 0x1F
) << 6 | (ord($block{$iChar + 1}) & 0x3F
);
$iChar+=2;
} else if ($h <= 0xEF && $iChar < $len - 2) {
$code=($h & 0x0F
) << 12 | (ord($block{$iChar + 1}) & 0x3F
) << 6 | (ord($block{$iChar + 2}) & 0x3F
);
$iChar+=3;
} else if ($h <= 0xF4 && $iChar < $len - 3) {
$code=($h & 0x0F
) << 18 | (ord($block{$iChar + 1}) & 0x3F
) << 12 | (ord($block{$iChar + 2}) & 0x3F
) << 6 | (ord($block{$iChar + 3}) & 0x3F
);
$iChar+=4;
} else {
$code=0;
$iChar++;
}
if ($code != 0)
{
if ($nbCodes>0)
$result.=',';
$result.=$code;
$nbCodes++;
}
else
}
$result .= "));";
}
$result .= "\n</script>";
return $result;
}
function phptemplate_form($element)
{
// Génération du formulaire (copie du code drupal)
$html=theme_form($element);
// condition de by-pass de l'encodeur
if ($user->uid!=0 || $element['#id']=='search-block-form')
return $html;
// Affichage d'un message d'avertissement
$path= karmaLab_common_images_path();
$temp="<img src='$path/attention.png' class='bullet'/><div class='inline-box attention'>Attention, ce formulaire pour fonctionner demande à ce que <b>javascript soit activé</b>. Si vous avez le montre problème, veuille m'envoyer un courriel à $ (en enlevant le <b>bad_</b>)</div>";
$temp.=riddle_javascript_encode($html);
return $temp;
}
/**
fonction utilisée pour "hacker" un thème donné pour les liens. Utilisé de manière indirecte.
@param $theme nom du theme à hacker
@param $links liens à thémer
@return code HTML
*/
function phptemplate_links
($links, $attributes = array('class' => 'links'))
{
$html = theme_links($links, $attributes);
// condition de by-pass de l'encodeur
if ($user->uid!=0)
return $html;
return riddle_javascript_encode($html);
}
Poster un nouveau commentaire