$b) {
if (in_array(extraire_attribut($b, "type"), array("hidden", "file")))
unset($balises[$k]);
}
$balises = array_merge($balises,
extraire_balises($form, 'textarea'),
extraire_balises($form, 'select'));
if (is_null($jeton)) {
$jeton = "";
if (preg_match(",,Uims", $form, $m))
$jeton = $m[1];
}
foreach ($balises as $k => $b) {
if ($name = extraire_attribut($b, "name")
AND (!$preserve_sessions_name or strncmp($name, "session_", 8) !== 0)) {
// cas des truc[chose] : on ne brouille que truc
$crypted_name = explode("[", $name);
$crypted_name[0] = nospam_name_encode($crypted_name[0], $jeton);
$crypted_name = implode("[", $crypted_name);
$b_e = inserer_attribut($b, "name", $crypted_name);
$form = str_replace($b, $b_e, $form);
}
}
if ($isbot) {
$form = str_replace(nospam_encrypt_html_hidden(), nospam_encrypt_html_checkbox(), $form);
}
return $form;
}
function nospam_encrypt_html_hidden() {
return "";
}
function nospam_encrypt_html_checkbox() {
return "";
}
/**
* Verifier/preparer les valeurs sur un formulaire crypte
* injecte un _encrypt en hidden, et gere le cas particulier ou l'on cohabite avec les fonctions autosave
* @param $valeurs
* @param $args
* @return array
*/
function nospam_encrypt_check_valeurs($valeurs, $args) {
$valeurs['_hidden'] .= nospam_encrypt_html_hidden();
// recuperer les autosave encryptes si possible
if (is_array($valeurs)
AND isset($valeurs['_autosave_id'])
AND $cle_autosave = $valeurs['_autosave_id']
AND include_spip("inc/cvt_autosave")
AND function_exists("autosave_clean_value")) {
$je_suis_poste = $args['je_suis_poste'];
$cle_autosave = serialize($cle_autosave);
$cle_autosave = $args['form'] . "_" . md5($cle_autosave);
// si on a un backup en session et qu'on est au premier chargement, non poste
// on restitue les donnees
if (isset($GLOBALS['visiteur_session']['session_autosave_' . $cle_autosave])
AND !$je_suis_poste) {
parse_str($GLOBALS['visiteur_session']['session_autosave_' . $cle_autosave], $vars);
if (isset($vars['_jeton'])
AND $jeton = $vars['_jeton']) {
foreach ($vars as $name => $val) {
if (($dname = nospam_name_decode($name, $jeton)) !== $name
AND isset($valeurs[$dname]))
$valeurs[$dname] = (is_string($val) ? autosave_clean_value($val) : array_map('autosave_clean_value', $val));
}
}
}
}
return $valeurs;
}
/**
* Decrypter les name d'un POST (idempotent)
*
* @param $form
* optionel, on peut se reposer sur formulaire_action pour avoir le nom du form
* @return bool|string
* string : message d'erreur
* bool : indique si des names ont ete decodes ou non
*/
function nospam_encrypt_decrypt_post($form=null) {
if (is_null($form)) {
$form = _request('formulaire_action');
if (!$form) {
spip_log("SPAM_ENCRYPT_NAME active mais pas de formulaire_action pour utiliser nospam_encrypt_decrypt_post", 'nospam' . _LOG_INFO_IMPORTANTE);
#$ua = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'undefined');
#spip_log("Suspect SPAMMEUR (_nospam_encrypt) UA:$ua POST:" . json_encode($_POST), 'nospam_suspects' . _LOG_INFO_IMPORTANTE);
return _T('nospam:erreur_jeton');
}
}
// si l'encrypt a ete active depuis l'affichage initial de ce form, on rebalance l'erreur technique
// pour reforcer un POST
// si pas de _nospam_encrypt poste, on refuse la saisie => erreur
if (!_request('_nospam_encrypt')) {
spip_log("SPAM_ENCRYPT_NAME active mais _nospam_encrypt manquant sur formulaire $form", 'nospam' . _LOG_INFO_IMPORTANTE);
$ua = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'undefined');
spip_log("Suspect SPAMMEUR (_nospam_encrypt) UA:$ua POST:" . json_encode($_POST), 'nospam_suspects' . _LOG_INFO_IMPORTANTE);
return _T('nospam:erreur_jeton');
}
if (!$jeton = _request('_jeton')){
spip_log("SPAM_ENCRYPT_NAME active mais _jeton manquant sur formulaire $form", 'nospam' . _LOG_INFO_IMPORTANTE);
$ua = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'undefined');
spip_log("Suspect SPAMMEUR (_jeton) UA:$ua POST:" . json_encode($_POST), 'nospam_suspects' . _LOG_INFO_IMPORTANTE);
return _T('nospam:erreur_jeton');
}
$re_verifier = false;
foreach ($_POST as $k => $v) {
$kd = nospam_name_decode($k, $jeton);
if ($kd !== $k and _request($kd) !== $v) {
nospam_encrypt_posted($form, $kd, $v);
$re_verifier = true;
}
}
if ($re_verifier){
return true;
}
return false;
}
/**
* Lister les valeurs que l'on a bien recue cryptees pour un formulaire donne
* Permet aux formulaires de verifier qu'une valeur critique n'a pas ete postee en clair par un spammeur
* * si $key et $value sont fournies, peuple le tableau et fait un set_request en meme temps
* @param string $form
* @param string $key
* @param mixed $value
* @return array
* liste des valeurs postees pour ce formulaire
*/
function nospam_encrypt_posted($form, $key = null, $value = null) {
static $posted = [];
if (!is_null($key)) {
if (!isset($posted[$form])) {
$posted[$form] = [];
}
$posted[$form][$key] = $value;
set_request($key, $value);
}
return $posted[$form] ?? [];
}