X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fsecuriser_action.php;fp=www%2Fecrire%2Finc%2Fsecuriser_action.php;h=b5f946cbc05c3df26dfecb10a244a992c300621f;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c
diff --git a/www/ecrire/inc/securiser_action.php b/www/ecrire/inc/securiser_action.php
new file mode 100644
index 0000000..b5f946c
--- /dev/null
+++ b/www/ecrire/inc/securiser_action.php
@@ -0,0 +1,176 @@
+$action,'arg'=>$arg,'hash'=>$hash);
+ else
+ return generer_url_action($action, "arg=$arg&hash=$hash" . (!$r ? '' : "&redirect=$r"), $mode, $public);
+ }
+
+ $att .= " style='margin: 0px; border: 0px'";
+ if ($redirect)
+ $redirect = "\n\t\t";
+ $mode .= $redirect . "
+
+";
+
+ return generer_form_action($action, $mode, $att, $public);
+}
+
+// http://doc.spip.org/@caracteriser_auteur
+function caracteriser_auteur() {
+ global $visiteur_session;
+ static $caracterisation = array();
+
+ if ($caracterisation) return $caracterisation;
+
+ if (!isset($visiteur_session['id_auteur'])) {
+ // si l'auteur courant n'est pas connu alors qu'il peut demander une action
+ // c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie.
+ // S'il n'avait pas le droit de realiser cette action, le hash sera faux.
+ if (isset($_COOKIE['spip_session'])
+ AND (preg_match('/^(\d+)/',$_COOKIE['spip_session'],$r))) {
+ return array($r[1], '');
+ // Necessaire aux forums anonymes.
+ // Pour le reste, ca echouera.
+ } else return array('0','');
+ }
+ // Eviter l'acces SQL si le pass est connu de PHP
+ $id_auteur = $visiteur_session['id_auteur'];
+ if (isset($visiteur_session['pass']) AND $visiteur_session['pass'])
+ return $caracterisation = array($id_auteur, $visiteur_session['pass']);
+ else if ($id_auteur>0) {
+ include_spip('base/abstract_sql');
+ $t = sql_fetsel("id_auteur, pass", "spip_auteurs", "id_auteur=$id_auteur");
+ if ($t)
+ return $caracterisation = array($t['id_auteur'], $t['pass']);
+ include_spip('inc/minipres');
+ echo minipres();
+ exit;
+ }
+ // Visiteur anonyme, pour ls forums par exemple
+ else {
+ return array('0','');
+ }
+}
+
+// http://doc.spip.org/@_action_auteur
+function _action_auteur($action, $id_auteur, $pass, $alea) {
+ static $sha = array();
+ if (!isset($sha[$id_auteur.$pass.$alea])){
+ if (!isset($GLOBALS['meta'][$alea]) AND _request('exec')!=='install') {
+ include_spip('base/abstract_sql');
+ $GLOBALS['meta'][$alea] = sql_getfetsel('valeur', 'spip_meta', "nom=" . sql_quote($alea));
+ if (!($GLOBALS['meta'][$alea])) {
+ include_spip('inc/minipres');
+ echo minipres();
+ spip_log("$alea indisponible");
+ exit;
+ }
+ }
+ include_spip('auth/sha256.inc');
+ $sha[$id_auteur.$pass.$alea] = _nano_sha256($id_auteur.$pass.@$GLOBALS['meta'][$alea]);
+ }
+ if (function_exists('sha1'))
+ return sha1($action.$sha[$id_auteur.$pass.$alea]);
+ else
+ return md5($action.$sha[$id_auteur.$pass.$alea]);
+}
+
+// http://doc.spip.org/@calculer_action_auteur
+function calculer_action_auteur($action) {
+ list($id_auteur, $pass) = caracteriser_auteur();
+ return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere');
+}
+
+// http://doc.spip.org/@verifier_action_auteur
+function verifier_action_auteur($action, $valeur) {
+ list($id_auteur, $pass) = caracteriser_auteur();
+ if ($valeur == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'))
+ return true;
+ if ($valeur == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien'))
+ return true;
+ return false;
+}
+
+//
+// Des fonctions independantes du visiteur, qui permettent de controler
+// par exemple que l'URL d'un document a la bonne cle de lecture
+//
+
+// Le secret du site doit rester aussi secret que possible, et est eternel
+// On ne doit pas l'exporter
+// http://doc.spip.org/@secret_du_site
+function secret_du_site() {
+ if (!isset($GLOBALS['meta']['secret_du_site'])){
+ include_spip('base/abstract_sql');
+ $GLOBALS['meta']['secret_du_site'] = sql_getfetsel('valeur', 'spip_meta', "nom='secret_du_site'");
+ }
+ if (!isset($GLOBALS['meta']['secret_du_site'])
+ OR (strlen($GLOBALS['meta']['secret_du_site'])<64)) {
+ include_spip('inc/acces');
+ include_spip('auth/sha256.inc');
+ ecrire_meta('secret_du_site', _nano_sha256($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid()), 'non');
+ lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas
+ }
+ return $GLOBALS['meta']['secret_du_site'];
+}
+
+// http://doc.spip.org/@calculer_cle_action
+function calculer_cle_action($action) {
+ if (function_exists('sha1'))
+ return sha1($action . secret_du_site());
+ else
+ return md5($action . secret_du_site());
+}
+
+// http://doc.spip.org/@verifier_cle_action
+function verifier_cle_action($action, $cle) {
+ return ($cle == calculer_cle_action($action));
+}
+
+?>