$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] ?? []; }