raccourcisseur d'url

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : raccourcisseur d'url

Re: raccourcisseur d'url

par Allatric » 22 nov. 2013, 01:57

Je progresse beaucoup: j'ai crée mon système de connexion avec reconnexion automaque par COOKIE, l'inscription avec validation par mail...
Les fonctions que vous avez donnée pour encoder en base62 marche peut être, mais c'est aussi utile de savoir le décodé^^. Si on peut pas le décodé il faut comparer avec la dernière ligne en BDD et c'est pas pratique.

-----

Petite aparté:
Sur ce code, le $letter > 31 veut dire que sur une clé de de 50 caractères par exemple seulement 31 seront utilisé ?
	public static function crypter($maChaineACrypter) {
$maCleDeCryptage = md5($this->cle_crypter);
$letter = -1;
$newstr = '';
$strlen = strlen($maChaineACrypter);

	for($i = 0; $i < $strlen; $i++ )
	{
$letter++;
		if ( $letter > 31 )
			{
		$letter = 0;
			}
			
$neword = ord($maChaineACrypter{$i}) + ord($maCleDeCryptage{$letter});

		if ( $neword > 255 )
			{
		$neword -= 256;
			}
$newstr .= chr($neword);
	}

$newstr = serialize( array(1, "texte" => $newstr) );
	
return base64_encode($newstr);
}

Re: raccourcisseur d'url

par Allatric » 19 nov. 2013, 12:55

blof => c''est pour faire quoi ton truck ? le but de raccourcir une url c'est d'en obtenir une courte pour la poster ailleurs et pas de la rallonger^^ ou alors j'ai pas compris ce que tu souhaite me montrer dans ton commentaire.

Sinon pour mon .htaccess je comprend pas comment un simple - ou / après activation_compte peut faire que ma variable clé en url n’existe pas:
RewriteRule ^activation_compte/([0-9-a-z-A-Z]+)$ activation_compte.php?cle=$1 [QSA]
http://site.fr/activation_compte/cle_0001

Re: raccourcisseur d'url

par blof » 18 nov. 2013, 23:00

et comme ça ?
<?php
for($id=7403905; $id<=7403935; $id++)
{
	// avec une fonction de hachage (md5 ou autre)
	// + un "grain de sel" ('rgsdr' dans l'exemple) pour embrouiller un peu plus 
	echo $id, ' => ', md5($id . 'rgsdr'), "<br>\n";
} 
?>
Ce qui donne :

Code : Tout sélectionner

7403905 => c04c5f15ad347a585e8680060396dd41 7403906 => 45e78a2e995b27a47b70b6890c1f2639 7403907 => 0daef5691ffe6fa285591036c71dd4ba 7403908 => 7f663df1dda89a34de150d02ffce5a25 7403909 => 91b330c7ab430d25644c47f9ca1f8156 7403910 => 79547ae2f4f6dd57cbff74320d3a2bd2 7403911 => e0eb2594023e864e5c696e86258214ab 7403912 => 498d1e42ffb232c6e95697d50eb1153f 7403913 => 50372ea0a25aa5a2eea44ee56fbe6f63 7403914 => 338271de8c08da91d2dcd484610dbf56 7403915 => b6ed6168013996687bddd7d182f78769 7403916 => 88aa2bfe8d558af388cbbf3b3cfe374a 7403917 => ba7b11c5a4eca7cddcc9ed26d64c010c 7403918 => f6e0fbadebfee490b8dc1f00ee441bcc 7403919 => 2037bfa0719b0e8e9c0cc929c0ce48a1 7403920 => 8340b8d793bcd80d269c7b8cb5c84fca 7403921 => 5180330c00b86e43806320f7255b4843 7403922 => e9c813eb696fc8a25409d5b16bac8e64 7403923 => a103e84b2516b98b1f84636c5a032172 7403924 => ce25ff3aafb38f48b51ac9d105ed192a 7403925 => e4a8093a74b8985b164ce7da4989dab3 7403926 => f28e738de72a1f20d2686063cbbbf9d5 7403927 => cd107da8bc5736bcb70901d88e3efdcd 7403928 => 58deec7322e4796b9156292f35962208 7403929 => 79ee2ae22da1634c9306371f9f13bb07 7403930 => d71ac8bd5e8013d7209f594fea480d32 7403931 => 5fde926fbe85391607c250dfe9c458ad 7403932 => 4d6aa3b67371a43f99599c635885b915 7403933 => 420f33ea96002e638ffe7f1177220cf2 7403934 => 6855164587b22210842c0aee6097e85e 7403935 => 3fb31bcec7615fe78cf537896319395f
#-o

Re: raccourcisseur d'url

par blof » 18 nov. 2013, 22:52

Pour ton RewriteRule c'est [0-9a-zA-Z]
=> http://lumadis.be/regex/tuto_pcre.php


En reprenant l'idée de Mazarini, si tu utilises la fonction que j'ai postée, tu peux mélanger la chaine qui sert au codage :
par exemple : 'KUy4oIvm7R1qiFhtZ5xJNOuELGcMTps9jCAS2en0bWVw8zDH6Qkg3fPdlXBrYa'

Re: raccourcisseur d'url

par Allatric » 18 nov. 2013, 18:03

Moi j'ai vu plus complexe: un statut: si l'url a été supprimé ou signalé et donc va devoir être vérifié, la date de création de l'url...

Sinon tu peux me répondre pour mon .htaccess ? C'est assez embêtant comme problème.

Re: raccourcisseur d'url

par Mazarini » 18 nov. 2013, 15:50

Bonjour,

Je verrais bien un array qui fait correspondre un nombre entre 0 et 61 à un caractère et réciproquement.
Ensuite, tu découpes l'auto-incrément en base 62 et tu transformes en caractères suivant le tableau et réciproquement.
Tu n'a besoin que d'une table de 2 colonnes : id (auto-incrément) et url.

Re: raccourcisseur d'url

par Allatric » 18 nov. 2013, 12:27

J'ai pas tester ta fonction, mais elle a l'air bien plus simple que celle que j'ai donnée.

Sinon mon regex est juste ? Je veux vérifier qu'il y est au moins une lettre majuscule et minuscule et un chiffre:
	
	if ( preg_match("#[A-Z]#", $_POST['mot_de_passe']) AND preg_match("#[0-9]#", $_POST['mot_de_passe'])  AND preg_match("#[a-z]#", $_POST['mot_de_passe']) ) 
		{
// Tous les caractères demandé
		}
	else
		{
echo 'erreur';
		}

Autre chose:

J'ai un fichier activation_compte.php et j'aimerais des lien du style:
http://site.fr/activation_compte/13Bu70 ... 1040pE33oM
Sa m'affiche bien ma page, sauf que ma clé ne fonctionne pas(Notice: Undefined index: cle in ):

Code : Tout sélectionner

RewriteRule ^activation_compte/([0-9-a-z-A-Z]+)$ activation_compte.php?cle=$1 [L]
Par contre avec un - ça fonctionne, comment régler le problème ?

Code : Tout sélectionner

RewriteRule ^activation_compte-([0-9-a-z-A-Z]+)$ activation_compte.php?cle=$1 [L]

Re: raccourcisseur d'url

par blof » 16 nov. 2013, 20:42

Je trouve juste dommage qu'au début ça commence a un caractère
Tu peux fixer une taille minimum et utiliser str_pad() pour compléter avec des "0" à gauche pour atteindre cette taille.
Par exemple pour une taille mini de 3 caractères : str_pad('ab', 3, 0, STR_PAD_LEFT)


J'avais bricolé une fonction pour passer en base 62 :
<?php

function base62($v_base10) {
	$v_base62 = '';
	while($v_base10 > 0)
	{
		$v_base62 = substr('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $v_base10%62, 1) . $v_base62;
		$v_base10 = floor($v_base10 / 62);
	}
	return $v_base62;
}

$v = 7403905;

echo $v, ' => ', base62($v);

?>

Re: raccourcisseur d'url

par Allatric » 16 nov. 2013, 12:13

Le but d'y faire aléatoirement c'était pour que ça soit unique avec chiffres et lettres pour avoir toute les combinaison possible, mais ton idée est génial!!! Je trouve juste dommage qu'au début ça commence a un caractère, mais c'est pas grave^^.
En plus même pas de contrôle a faire en BDD si j'utilise l'id qui est forcément unique!!! On peut même tester la class sur l'id de la table et donc ça évite d'avoir une colonne avec la clé, c'est encore mieux.

J'ai trouvé cette fonction:
<?php
/**
 * Base n encode /decode
 * @author CrazyCat
 * @package Mephisto::Maths
 */
class NBase {
 
    /**
     * Array of chars to use
     * @var array
     */
    private $vals = array(
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
    );
 
    /*
     * Base to use
     * @var int
     */
    private $base = 10;
 
    /**
     * Constructor
     * @param int $n Base to use
     */
    public function __construct($n=10) {
        $this->setBase($n);
    }
 
    /**
     * Sets the destination base
     * @param int $n Base to use
     */
    public function setBase($n=10) {
        if ($n < 2 || $n > count($this->vals)) {
            $n = count($this->vals);
        }
        $this->base = $n;
    }
 
    /**
     * Gets the destination base
     * @return int
     */
    public function getBase() {
        return $this->base;
    }
 
    /**
     * Encodes integer to new base
     * @param integer $b10 Integer in base 10
     * @return string
     */
    public function encode($b10) {
        $bn = '';
        $current = $b10;
        while($current > 0) {
            $rest = $this->modulo($current, $this->base);
            $bn .= $this->vals[$rest];
            $current = floor($current/$this->base);
        }
        return strrev($bn);
    }
 
    /**
     * Decodes string from base
     * @param string $bn String in base n
     * @return integer
     */
    function decode($bn) {
        $bn = strrev($bn);
        $b10 = 0;
        for($i=0; $i<strlen($bn); $i++) {
            $item = substr($bn, $i, 1);
            $pos = array_search($item, $this->vals);
            $b10 += $pos * pow($this->base, $i);
        }
        return $b10;
    }
 
    /**
     * Calculates a modulus
     * To use because native "%" is buggy
     * for big values
     * @param integer $val
     * @param integer $div Divisor
     * @return integer remainder
     */
    function modulo($val, $div) {
        $r = $val - (floor($val/$div)*$div);
        return $r;
    }
}

// Un petit test:
	for($i=1; $i<=100; $i++)
	{
$test = $i;
$bn = new NBase(62);
$try1 = $bn->encode($test);
$try2 = $bn->decode($try1);
echo $test, ' gives in base ', $bn->getBase(), ': <b>', $try1, '</b> decoded as ', $try2, '<br>';
	}
?>

Re: raccourcisseur d'url

par blof » 16 nov. 2013, 07:14

Si on incrémente une variable et qu'on la passe en base 62 (en utilisant les chiffres, les minuscules et les majuscules pour le codage)

par exemple :

7403905 en base 62 => v45P
+1
7403906 en base 62 => v45Q
+1
7403907 en base 62 => v45R
+1
etc ...

- on est sûr que la valeur n'a jamais été prise.
- l'augmentation du nombre de caractères se fait automatiquement si besoin.

Ça conviendrait ? ou tu veux absolument que ce soit aléatoire ?

Re: raccourcisseur d'url

par Allatric » 15 nov. 2013, 21:39

Par contre c'est bien beau de comparer si le nombre de possibilité est atteint et d'augmenter d'un caractère... mais comment voir si la combinaison n'est pas déjà utilisé ?
Je me vois mal comparer presque toute la BDD pour voir si je peux utiliser la combinaison, car si j'ai 100 liens ça sera pas pareil par rapport a 100 000...

----

Question bête: mysql peut pas faire en sorte d'avoir une clé unique qui soit avec des lettres(majuscules/minuscules) et des chiffres d'une certaine taille et l'augmenter quand toute les possibilité sont utilisé ?

Re: raccourcisseur d'url

par moogli » 15 nov. 2013, 18:15

pour le nombre de combinaison une petite question à google et on a des exemples http://forums.futura-sciences.com/mathe ... ffres.html

donc 62 possibilités sur un digits sur X digits tu auras 62^X (62 "puissance" X) combinaison.
Dans l'exemple c'est 10 chiffres sur 4 digits.
en php tu peux utiliser la fonction bcpow

bon test :)

@+

Re: raccourcisseur d'url

par Allatric » 15 nov. 2013, 17:44

Les A1A, A1a, Aa1, a1a, a1A est différent^^.

Merci, j'ai trouvé, mon erreur^^, par contre quand je fais ton calcul je trouve 61: echo $calcule = ((26*2)+10)^3;
Mais si je fais ça je trouve le même nombre:
$calcule = ((26*2)+10);
echo $calcule*$calcule*$calcule;

Re: raccourcisseur d'url

par blof » 15 nov. 2013, 14:22

Bonjour,

- Il y a 10 chiffres et pas 9 (de 0 à 9 => 10 chiffres)
- Ce n'est pas "multiplier par 3" mais "puissance 3"

donc ((26*2)+10)^3=238328

(sinon il me semble que les url sont insensibles à la casse => je ne différencierais pas les majuscules/minuscules)

Re: raccourcisseur d'url

par Allatric » 15 nov. 2013, 13:27

C'est peut être bête, mais parfois on met des lien du genre google.fr alors j'ai voulu avec une petite condition rajouté un petit http:// devant et ça teste l'url. Par contre si j'ai juste un google, ça va faire: http://google et ça dit que l'url est valide.

Pour le calcule: j'ai fait:
26 pour les lettres(majuscules/minuscules) et 9 chiffre multiplier par le nombre de caractère que l'on veut: ((26*2)+9)*3.
Mais c'est forcément faux