rog php encrypter

  • Auteur de la discussion Auteur de la discussion rog
  • Date de début Date de début
WRInaute passionné
bon

j'ai fini de débugger mon système de cryptage de sources php

il n'est malheureusement pas incrackable mais ça évitera quand même au premier venu de modifier les sources d'un script

c'est la V1 et je ne crois pas qu'il y aura de V1xx

si ça intéresse quelqu'un je le prépare proprement et je le met en service online

rog
 
WRInaute passionné
nop

il est déjà sufisament simple à decrypter, si je l'explique, ça ne sert plus à rien de le faire

par contre je crois qu'il y aura des versions 1xx

je pense déjà à un cryptage en double clef

ce sera fini ce soir ou demain

je le developpe ici

-http://rgirardin.mine.nu/binder1.13/encode.php

rog
 
WRInaute accro
a quoi sert $_DECODE puisque cette variable n'est pas utilisée ?

n'est-ce pas un simple encodage / décodage ?

dans ce cas il est possible de récupérer la source...?!
 
WRInaute accro
kazhar a dit:
KOogar a dit:
pourquoi crypter du php qui est coté serveur ??
Pour la vente d'applications php sans autoriser la modification des sources par exemple ...

Et ils ont le decrypteur en sus !! 1 copyright avec clauses suffit dans ce cas. Comme la dit thierry8 ce n'est que de l'encodage/decodage. Pour que cela soit fonctionel il faudrait implementer le decrypteur directement sur le serveur. Sinon aucune portabilité.
 
WRInaute passionné
@KOogar
c'est sur que ce serait beaucoup mieux

néanmoins la contrainte est de pouvoir fonctionner dans un environnement standart (free - lycos - geocities etc...)

j'ai fait pas mal de scripts gratuits et j'aimerai bien crypter les releases

obs : personne ne respecte le copyright sur le net

rog
 
WRInaute passionné
stable

bon ça y est ça m'a l'air stable

http://rgirardin.mine.nu/encryptor/

vous pouver crypter jusqu'à 5 fichiers de +- 200 ko
vous pouver ajouter une date d'expiration à vos scripts
vous pouvez aussi le forcer vos scripts à s'executer sur un host bien précis

le reversing n'est pas très compliqué mais il faudra un minimum de notion car la fonction eval est hyper sensible voire même capricieuse

j'aimerai bien avoir quelques feed backs avant de le faire traduire en d'autres langues

rog
 
WRInaute discret
Pour ma part ça à l'air de fonctionner !

J'ai pas eu le temps de regarder en detail, je ferais ça ce soir !
 
WRInaute accro
J'insiste rog, mais l'utilisateur qui détient ce fichier peut très bien retrouver la source avec ça, non ?:

Code:
?>THIS HOST IS FORBIDDEN TO USE THIS SCRIPT ==> $_SERVER[HTTP_HOST]"); print("
# THIS THE ONLY HOST ALLOWED TO USE THIS SCRIPT ==> www.example.fr"); return; exit(); } $_CHAR=""; $_CHAR2=""; for($i=0;$i<255;$i++) { $_CHAR.=chr($i); } for($i=255;$i>=0;$i--) { $_CHAR2.=chr($i); } $_DECODE64=base64_decode($_DECODE); $_DECRYPT=strtr($_DECODE64,$_CHAR2,$_CHAR); eval($_DECRYPT); return; die();
 
WRInaute passionné
tu as raison d'insister

le processus est malheureusement reversible dans cette version

néanmoins j'aimerai que tu essaies de cracker ta source pour me donner ton avis sur la difficulté dans une échelle de 1 à 10

et de chronométrer le temps que tu vas passer dessus

si tu en as le temps bien sur

ça peut être par mp si tu préferes

les stats

-http://rgirardin.mine.nu/encryptor/visit.php

rog

sur la prochaine version je mettrais une double cle comme en ssl
 
WRInaute accro
ok je vais faire ça..

je donnerais le résultat ici !

ps: même s'il y a une double clé ce sera toujours réversible, plus chiant, mais toujours faisable à partir du moment ou l'utilisateur détient la "source".

enfin c'est déjà suffisant pour refroidir les petits malins.
 
WRInaute accro
rog a dit:
néanmoins j'aimerai que tu essaies de cracker ta source pour me donner ton avis sur la difficulté dans une échelle de 1 à 10

et de chronométrer le temps que tu vas passer dessus

que veux tu dire par là ? "cracker ta source"

Tu veux dire combien de temps je met pour reprendre la source d'origine à partir de ton encryptage ?
 
WRInaute passionné
yep c'est exactement ca

plus tu mettras de temps et plus je serais content (mon ego)

en plus ce sera cool de comparer avec la prochaine version

rog
 
WRInaute passionné
ouch

t'as mis 28s pour decrypter $_DECODE ? et chopper la source originale du fichier ?

effectivement c'est hard

lol
 
WRInaute passionné
<? $_DECODE='wMHDwI+Xj/L18vXQ0N+8kI+GjZaYl4vf17zW383Pz8rftpOGnt+s0d+zhoqdlpGMlJaG0d++k5Pf
jZaYl4uM342ajJqNiZqb0fL10NDfq5qcl5GWnJ6T34yKj4+QjYvF35eLi4/F0NCIiIjRj5eP0pua
iZqTkI+SmpGL0Y2K0PL10NDy9dDQ36awqt+yvqbfsbCr8vXQ0N/XztbfrZqSkIma35CN35KQm5aZ
ht+Ll5aM35yQj4aNlpiXi9+RkIuWnJrR8vXQ0N/Xzdbfu5aMi42WnYqLmt+Ll5aM35yQm5rT356R
ht+Pno2L35CN356Rht+SkJuWmZaam9+Jmo2MlpCR35CZ35aL0fL10NDf39/f37aRjIuanpvT34aQ
it+Snobfk5aRlN+LkN+Ll5rfl5CSmo+emJrfkJnfi5eWjN+ckJuaxfL10NDf39/f35eLi4/F0NCI
iIjRj5eP0puaiZqTkI+SmpGL0Y2K0JWeiZ6MnI2Wj4uM0IySno2L0pmQjZKM0Y+Xj9Hy9dDQ39fM
1t+qjJrfi5eWjN+ckJua356M34+ejYvfkJnfnpGQi5eajd+PjZCbipyL0fL10NDf39/f37aZ34aQ
it+InpGL34uQ35uQ35aL34aQit+Ml5CKk5vfjZqcmpaJmt+Sht+Pmo2SloyMlpCR0fL10NDy9dDQ
36awqt+yvqby9dDQ39fO1t+qjJrfi5eWjN+ckJua35CN356Rht+SkJuWmZaam9+Jmo2MlpCR35CZ
35aL35CR34aQio3fiJqdjJaLmtHy9dDQ8vXQ0N+xsN+ovq2tvrGrpvL10NDfq5eWjN+ckJua35aM
34+NkImWm5qb392ejN+WjN3fiJaLl5CKi9+Ino2NnpGLht+Qmd+ekYbflJaRm9PfmpaLl5qN8vXQ
0N+ah4+NmoyMmpvfkI3flpKPk5aam9PflpGck4qblpGY09+diovfkZCL35OWkpaLmpvfi5DT34uX
mt+Wko+Tlpqb34iejY2ekYuWmozy9dDQ35CZ35KajZyXnpGLnp2Wk5aLht+ekZvfmZaLkZqMjN+Z
kI3fnt+Pno2LlpyKk56N34+KjY+QjJrR36aQit+ah4+NmoyMk4by9dDQ356clJGQiJOam5ia356R
m9+emI2amt+Ll56L34qMmt+Qmd+Ll5aM35yQm5rflozfnovfhpCKjd+QiJHfjZaMlNHy9fL18vWM
mougi5aSmqCTlpKWi9fP1sTy9ZqNjZCNoI2aj5CNi5aRmNe6oL6zs9bE8vWWkZagjJqL192TkJig
mo2NkI2M3dPf39/f38/WxPL1lpGWoIyai9fdm5aMj5OehqCajY2QjYzd09/O1sTy9fL10NDf0tLS
0tLfr56NjJrft6uys9/S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS
0tLS0tLS0tLS0tLS0tLS0tLy9fL1mYqRnIuWkJHfmpGck5CMmtfbjIuejYvT39uakZvO09/bmpGb
zdby9YTy9d/fjZqLio2R393bjIuejYvX18DFpKHbmpGbzqKD25qRm87XwN7bmpGbzdbW1dbbmpGb
ztuakZvN3cTy9YLy9fL1mYqRnIuWkJHfj56NjJrX25eLkpPT39nbi5aLk5rT39nbi5qHi9Pf2due
kZyXkI2M1vL1hPL139/bj4yLjZaRmM7fwt/d2KSh2KLV2N3E8vXf39uPjIuNlpGYzd/C39jdpKHd
otXd2MTy9d/f24+RjIuNlpGY38Lf3aSh2KPdwaLdxPL139/bj5aRi56Y39/fwt/d18DF24+Mi42W
kZjOg9uPjIuNlpGYzYPbj5GMi42WkZjW1d3E8vXf39uPnouLjYzf39/C393XwMWjo4zbj5aRi56Y
1oTP086C3cTy9fL139/bj5yQkpKakYvfwt+akZyTkIya193D3tLS3dPf3dLd09/d0sHd1sTy9d/f
24+MnI2Wj4vf38LfmpGck5CMmtfdw4ycjZaPi9uPnouLjYzB3dPf3cPd09/do6PQjJyNlo+Lwd3W
xPL139/bj4yLhpOa39/fwt+akZyTkIya193DjIuGk5rbj56Li42Mwd3T393D3dPf3aOj0IyLhpOa
wd3WxPL139/bj5qHnJOKm5rfwt/d18DF24+ckJKSmpGLg9uPjJyNlo+Lg9uPjIuGk5rW3cTy9fL1
39/bj4uWi5Oa39/fwt+akZyTkIya193Di5aLk5rbj56Li42Mwd3T393D3dPf3aOj0IuWi5Oawd3W
xPL139/bj56RnJeQjd/fwt/dw57XwMWjo4zbj5aRi56Y1oTP086Cwd3E8vXf39uPl42amd/f39/C
392XjZqZo6OM1cKko6OM2KPdotXXpKGjo4zYo93BotXW3cTy9fL139/bl4uSk9/C34+NmpigjZqP
k56cmtfd0NuPmoeck4qbmtCWp93T393f3dPf25eLkpPWxPL18vXf35aZ39fbi5aLk5rf3sLC35me
k4ya1vL139/f39uLlouTmt/C34+Nmpigkp6LnJfX3dDbj4uWi5Oa0Jan3dPf25eLkpPT39uLlouT
mtbfwN/bi5aLk5qkzqLfxd/Y2MTy9fL139+Wmd/X24uah4vf3sLC35mek4ya1vL139+E8vXf39/f
24uah4vfwt+PjZqYoI2aj5OenJrX3dDD24+WkYuemMHQlqfd09/f393f3dPf25eLkpPWxPL139/f
39uLmoeL38Lfj42amKCNmo+Tnpya193Qo6OM1IPZkZ2Mj8TQlqfd09/d393T39uLmoeL1sTy9d/f
gvL18vXf35aZ39fbnpGcl5CNjN/ewsLfmZ6TjJrW8vXf34Ty9d/f39+PjZqYoJKei5yXoJ6Tk9fd
0NuPnpGcl5CN0Jan3dPf25eLkpPT39uekZyXkI2M1sTy9d/f39/bnpGcl5CNjN/C39uekZyXkI2M
pM+ixPL18vXf39/fjZqMmovX256RnJeQjYzWxPL139/f34iXlpOa39eTloyL19uW09/bh9bfwt+a
npyX19uekZyXkI2M1tby9d/f39/f39uekZyXkI2MpNuWot/C34+Nmpigkp6LnJfX3dDbj5eNmpnQ
lqfd09/bh9Pf24fW38Df24ekzqLfxd/Y2MTy9fL139/f39uekZyXkI2M38Lfno2NnoagipGWjoqa
19uekZyXkI2M1sTy9d/fgvL1gvL18vXy9dDQ39LS0tLS36qts9+5ipGci5aQkYzf0tLS0tLS0tLS
0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXy9dDQ39LS
0tLS36+ejYya36qts9/S0tLS0vL18vWZipGci5aQkd+KjZOgj56NjJrX24qNk9by9YTy9d/f25qN
jZCNoI2aj5CNi5aRmN/C35qNjZCNoI2aj5CNi5aRmNe6oLqtrbCt34PfuqCvvq2sutbE8vXf39uK
jZPfwt+Pno2MmqCKjZPX24qNk9bE8vXf35qNjZCNoI2aj5CNi5aRmNfbmo2NkI2gjZqPkI2LlpGY
1sTy9d/fjZqLio2R39uKjZPE8vWC8vXy9dDQ39LS0tLS37qHi42enIvfrJyXmpKa39LS0tLS8vXy
9ZmKkZyLlpCR34qNk6CMnJeakprX24qNk9Pf24ycl5qSmt/C39iXi4uP2Nby9YTy9d/flpnX3tfb
io2T38Lfio2ToI+ejYya19uKjZPW1tbfjZqLio2R39uMnJeakprE8vXf342ai4qNkd+WjIyai9fb
io2TpNiMnJeakprYotbfwN/bio2TpNiMnJeakprYot/F39uMnJeakprE8vWC8vXy9dDQ39LS0tLS
37qHi42enIvft5CMi9/S0tLS0vL18vWbmpmWkZrX2Kqts6C3sKyroL6vr7qxu9jT387WxPL1m5qZ
lpGa19iqrbOgt7Csq6Csq622r9jf09/N1sTy9fL1mYqRnIuWkJHfio2ToJeQjIvX24qNk9Pf25OQ
iJqN38Lfi42KmtPf24iIiN/C38/W8vWE8vXf35aZ197X24qNk9/C34qNk6CPno2Mmtfbio2T1tbW
342ai4qNkd/Y2MTy9d/f24qNk9/C39uTkIiajd/A34yLjYuQk5CImo3X24qNk6TYl5CMi9ii1t/F
39uKjZOk2JeQjIvYosTy9d/flpnf19uIiIjfwsLfqq2zoLewrKugvq+vurG739nZ34yLjY+QjNfb
io2T09/YiIiI0djW397Cwt/P1t+NmouKjZHf2IiIiNHY39Hf24qNk8Ty9d/flpnf19uIiIjfwsLf
qq2zoLewrKugrKuttq/f39nZ34yLjY+QjNfbio2T09/YiIiI0djW38LCwt/P1t+NmouKjZHfjIqd
jIuN19uKjZPT38vWxPL139+NmouKjZHf24qNk8Ty9YLy9fL10NDf0tLS0tLfuoeLjZ6ci9+vnouX
39LS0tLS8vXy9ZmKkZyLlpCR34qNk6CPnouX19uKjZPW8vWE8vXf35aZ197X24qNk9/C34qNk6CP
no2Mmtfbio2T1tbW342ai4qNkd/Y2MTy9d/f24qNk9/C35aMjJqL19uKjZOk2I+ei5fYotbfwN+a
h4+TkJua19jQ2NPf24qNk6TYj56Ll9ii1t/F376NjZ6G19bE8vXf35aZ39eNmoyai9fbio2T1t/C
wsLf2NjW356NjZ6GoIyXlpmL19uKjZPWxPL139+Wmd/XmpGb39/X24qNk9bfwsLC39jY34OD34yL
jY+QjNeakZvX24qNk9bT39jR2Nbf3sLC35mek4ya1t+ejY2ehqCPkI/X24qNk9bE8vXf342ai4qN
kd+Wko+TkJua19jQ2NPf24qNk9bE8vWC8vXy9dDQ39LS0tLS37qHi42enIvfuZaTmpGekprf0tLS
0tLy9fL1mYqRnIuWkJHfio2ToJmWk5rX24qNk9Pf25yQkYmajYvfwt++jY2ehtfW1vL1hPL139+W
mdfe19uKjZPfwt+KjZOgj56NjJrX24qNk9bW1t+NmouKjZHf2NjE8vXf39uKjZPfwt+WjIyai9fb
io2TpNiPnouX2KLW38DfmpGb15qHj5OQm5rX2NDY09/bio2TpNiPnouX2KLW1t/F39jYxPL139/b
io2T38Lf14yLjY+QjNfbio2T09/Y0djW397Cwt+ZnpOMmtbfwN/bio2T38Xf2NjE8vXf35mQjZqe
nJff19uckJGJmo2L356M39uW38LB39uH1t/bio2T38Lfj42amKCNmo+Tnpya19uW09/bh9Pf24qN
k9bE8vXf342ai4qNkd/bio2TxPL1gvL18vXy9dDQ39LS0tLS37qHi42enIvfuoeLmpGMlpCR39LS
0tLS8vXy9ZmKkZyLlpCR34qNk6Cah4vX24qNk9Pf25yQkYmajYvfwt++jY2ehtfW1vL1hPL139+W
mdfe19uKjZPfwt+KjZOgj56NjJrX24qNk9bW1t+NmouKjZHf2NjE8vXf39uKjZPfwt+WjIyai9fb
io2TpNiPnouX2KLW38DfmpGb15qHj5OQm5rX2NDY09/bio2TpNiPnouX2KLW1t/F39jYxPL139/b
io2T38Lf14yLjY+QjNfbio2T09/Y0djW397Cwt+ZnpOMmtbfwN+akZvXmoePk5CbmtfY0djT39uK
jZPW1t/F39jYxPL139+ZkI2anpyX39fbnJCRiZqNi9+ejN/blt/Cwd/bh9bf24qNk9/C34+Nmpig
jZqPk56cmtfbltPf24fT39uKjZPWxPL139+NmouKjZHf24qNk8Ty9YLy9fL10NDf0tLS0tLfuoeL
jZ6ci9+uipqNht/S0tLS0vL18vWbmpmWkZrX2Kqts6CuqrqtpqCxsLqsvL6vutjT38/WxPL1m5qZ
lpGa19iqrbOgrqq6raaguqy8vq+62N/f09/O1sTy9fL1mYqRnIuWkJHfio2ToI6Kmo2G19uKjZPT
39uajJyej5rfwt/P09/bmoeck4qbmt/C376NjZ6G19bW8vWE8vXf35aZ197X24qNk9/C34qNk6CP
no2Mmtfbio2T1tbW342ai4qNkd/Y2MTy9d/flpnf196WjIyai9fbio2TpNiOipqNhtii1tbfjZqL
io2R39jYxPL139/bio2T38Lfj42amKCMj5OWi9fY0NfZ18DenpKPxNaD2Z6Sj8TW0NjT39uKjZOk
2I6Kmo2G2KLWxPL18vXf35mQjZqenJff19uKjZPfnozf25bfwsHf24fW8vXf34Ty9d/f39/bh9/C
35qHj5OQm5rX2MLY09/bh9bE8vXf39/flpnf15aRoJ6NjZ6G19uHpM+i09/bmoeck4qbmtbW34qR
jJqL19uKjZOk25ai1sTy9d/fgvL18vXf342ai4qNkd+Wko+TkJua19uajJyej5rfwN/Y2Z6Sj8TY
38Xf2NnY09/bio2T1sTy9YLy9fL10NDf0tLS0tLfvJCRnJ6L39LS0tLS8vXy9ZmKkZyLlpCR34qN
k6CckJGcnovX252ejJrT39uNmpPW8vWE8vXf39uMnJeakprfwt+KjZOgjJyXmpKa19udnoya1sTy
9d/f25eQjIvf39/C34qNk6CXkIyL39/X252ejJrWxPL139/bj56Ll9/f38Lfio2ToI+ei5ff39fb
nZ6MmtbE8vXy9d/flpnf19uNmpOEz4LfwsLf2NDY1vL139/f39/f342ai4qNkd/d24ycl5qSmsXQ
0NuXkIyL242ak93E8vXf35qTjJrflpnf19uPnouX38LCwt/Y2Nby9d/f39/f39/f39/f342ai4qN
kd/d24ycl5qSmsXQ0NuXkIyL0NuNmpPdxPL139/f39/f35qTjJrfjZqLio2R393bjJyXmpKaxdDQ
25eQjIvQ24+ei5fQ242ak93E8vWC8vXy9dDQ39LS0tLS37GQjZKek5aFmt/S0tLS0vL18vWZipGc
i5aQkd+KjZOgkZCNkp6TloWa19uKjZPT8vXf39/f39/f39/f39/f39/f39/f39/f39uMnJeakprf
38Lf2JeLi4/Y0/L139/f39/f39/f39/f39/f39/f39/f39/biIiI39/f39/C38/T8vXf39/f39/f
39/f39/f39/f39/f39/f39uckJGJmo2L38Lfvo2NnobX1tPy9d/f39/f39/f39/f39/f39/f39/f
39/f25qMnJ6Pmt/fwt/P0/L139/f39/f39/f39/f39/f39/f39/f39/bmoeck4qbmt/C376NjZ6G
19bW8vWE8vXf39uMnJeakprfwt+KjZOgjJyXmpKa19uKjZPT39uMnJeakprWxPL139/bl5CMi9/f
38Lfio2ToJeQjIvf39fbio2T09+LjYqa09/biIiI1sTy9d/f24+ei5ff39/C34qNk6CPnouX39/X
24qNk9bE8vXf39uZlpOa39/fwt+KjZOgmZaTmt/f19uKjZPT39uckJGJmo2L1sTy9d/f246Kmo2G
39/C34qNk6COipqNht/X24qNk9Pf25qMnJ6PmtPf25qHnJOKm5rWxPL18vXf35aZ39fbjJyXmpKa
38LCwt/Y2N+Dg9/bl5CMi9/CwsLf2NjW342ai4qNkd/Y2MTy9fL139+Wmd/X24+ei5ffwsLC39jY
1vL139/f39/f342ai4qNkd/d24ycl5qSmsXQ0NuXkIyL0NuZlpOa3d/f39/f39/R39fbjoqajYbf
wN/dwNuOipqNht3fxd/d3dbE8vXf35qTjJrfjZqLio2R393bjJyXmpKaxdDQ25eQjIvQ24+ei5fQ
25mWk5rd39Hf19uOipqNht/A393A246Kmo2G3d/F393d1sTy9YLy9fL18vXQ0N/S0tLS0t+8l5qc
lN+zlpGU39LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS
0tLS0tLS0tLS0vL18vWWmd/X3pmKkZyLlpCRoJqHloyLjNfYkoagmJqLoJeanpuajYzY1tby9YTy
9d/fmYqRnIuWkJHfkoagmJqLoJeanpuajYzX24qNk9Pf25mQk5OQiN/C38rW8vXf34Ty9d/f39+W
md/X25mQk5OQiN/Dwt/P1t+NmouKjZHfmZ6TjJrE8vXy9d/f39/bio2T38Lfj56NjJqgio2T19uK
jZPWxPL139/f35aZ39feloyMmovX24qNk6TYl5CMi9ii1tbfjZqLio2R35mek4yaxPL139/f39uK
jZOk2I+ei5fYot/C35aMjJqL19uKjZOk2I+ei5fYotbfwN/bio2TpNiPnouX2KLfxd/d0N3E8vXy
9d/f39/bmY/fwt+ZjJCclJCPmpHX24qNk6TYl5CMi9ii09/Hz9Pf25qNjZGQ09/bmo2NjIuN09/K
1sTy9d/f39+Wmd/X3tuZj9bfjZqLio2R35mek4yaxPL18vXf39/f25CKi9/fwt/dt7q+u9+E24qN
k6TYj56Ll9iigt+3q6uv0M7RzqONo5HdxPL139/f39uQiovf0cLf3beQjIvF34Tbio2TpNiXkIyL
2KKCo42jkd3E8vXf39/f25CKi9/Rwt/dvJCRkZqci5aQkcXfvJOQjJqjjaORo42jkd3E8vXy9d/f
39+ZiI2Wi5rX25mP09/bkIqL1sTy9fL139/f35mQjd/X25eanpuajYzfwt/Y2MTf3pmakJnX25mP
1sTf1vL139/f34Ty9d/f39/f39uMi43fwt+ZmJqLjNfbmY/T38vPxsnW39Hf3aONo5HdxPL18vXf
39/f39+Wmd/Xj42amKCSnoucl9fd0KG3q6uvo6PQo6Ob1KOj0aOjm9Sjo4zUzc/Po6OM1LC0o6OM
1dvQlqfd09/bjIuN1tby9d/f39/f34Ty9d/f39/f39/fmZyTkIya19uZj9bE8vXf39/f39/f342a
i4qNkd+LjYqaxPL139/f39/fgvL18vXf39/f39+Wmd/Xj42amKCSnoucl9fd0KGzkJyei5aQkcWj
o4zV16OjrNTWo6OM1dDblqfd09/bjIuN09/bkp6LnJeajNbW8vXf39/f39+E8vXf39/f39/f35mc
k5CMmtfbmY/WxPL139/f39/f39+NmouKjZHfkoagmJqLoJeanpuajYzX25Kei5yXmoykzqLT39uZ
kJOTkIjSztbE8vXf39/f39+C8vXf39/fgvL18vXf39/fmZyTkIya19uZj9bE8vXf39/fjZqLio2R
35mek4yaxPL139+C8vWC8vXy9ZmKkZyLlpCR35yXmpyU19uKjZPT39uLjZ6cmt/C34uNiprW8vWE
8vXf35aZ39fbi42enJrW8vXf34Ty9d/f39+anJeQ35eLkpOakYuWi5aajNfbio2T1tPf2MOdjd/Q
wdjE8vXf39/fmZOKjJfX1sTy9d/fgvL139/bmo2NkI2gjZqPkI2LlpGY38Lfmo2NkI2gjZqPkI2L
lpGY17qguq2tsK3fg9+6oK++ray61sTy9d/f242ajIqTi9/C35KGoJiai6CXmp6bmo2M19uKjZPW
xPL139+ajY2QjaCNmo+QjYuWkZjX25qNjZCNoI2aj5CNi5aRmNbE8vXf35aZ39fbi42enJrW8vXf
34Ty9d/f39+anJeQ39uNmoyKk4vfwN/Y37C02N/F39jfvY2QlJqR2N/T39jDnY3f0MHYxPL139/f
35mTioyX19bE8vXf34Ly9d/fjZqLio2R39uNmoyKk4vE8vWC8vXy9fL10NDf0tLS0tLfvJeanJTf
s5aRlIzf0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS
0tLS0tLS0tLy9fL10NDftrGvqqvF8vXQ0PL10NDf242QkIuM39/f39/f0t+rl5rfmYqRnIuWkJHf
iJaTk9+Pno2Mmt+QkZOG34uXkIya36qts4zfi5eei9+Mi56Ni9+IlouX8vXQ0N/f39/f39/f39/f
39/f357fjIuNlpGY35mNkJLf242QkIuM356NjZ6G0fL10NDf24qNk4zf39/f39/f0t++jY2eht+c
kJGLnpaRlpGY36qts4zfmY2Qkt+Il5acl9+LkN+Mi56Ni9+LkN+Mj5abmo3fiJqdjJaLmtHy9dDQ
39uSnoff39/f39/f39Lfsp6HlpKKkt+RipKdmo3fkJnfj56Ymozfi5DfnZrfnJeanJSam9Hy9dDQ
39uIiIjf39/f39/f39Lfqq2zoLewrKugvq+vurG738Lfno+PmpGb392IiIjR3dPfqq2zoLewrKug
rKuttq/fwt+Mi42Wj9/diIiI0d3R8vXQ0N/bnJCRiZqNi9/f39/S376NjZ6G35CZ35mWk5rfnJCR
iZqNjJaQkYzR8vXQ0N/bmoeck4qbmt/f39/S376NjZ6G35CZ35GekpqM34uQ352a35qHnJOKm5qb
35mNkJLfjoqajYbR8vXQ0N/bmoeLmpGMlpCRjN/S376NjZ6G35CZ34ianY+emJrfmoeLmpGMlpCR
jNHy9dDQ8vXQ0N+wqquvqqvF8vXQ0PL10NDf25qNjZCNjN/f39/f0t+5kI2SnovF8vXQ0N/f39/f
39/f39/f39/f39uajY2QjYzfwt++jY2ehtfDj56Ymt+KjZPB38LB38OejY2eht+Qmd+djZCUmpHf
k5aRlIzB09/R0dHWxPL10NDf39/f39/f39/f39/f39/Dno2NnobfkJnfnY2QlJqR35OWkZSMwd/C
8vXQ0N/f39/f39/f39/f39/f39/fvo2NnobXw5yXmpyUmpvfio2Twd/Cwd/Dio2T356M35qHi42e
nIuam9+ZjZCS34ianY+emJrB09/R0dHWxPL10NDy9dDQ36y+sq+zut+8vrOz8vXQ0PL10NDf242a
jIqTi9/C35yXmpyUnpOT19uNkJCLjN/C376NjZ6G19iXi4uPxdDQm5CSnpaR0ZyQktDY1tPy9dDQ
39/f39/f39/f39/f39/f39/f39/bio2TjN/fwt++jY2ehtfYl4uLj8XQ0JuQkp6WkdGckJLQ2NbT
8vXQ0N/f39/f39/f39/f39/f39/f39/f25qNjZCNjNPy9dDQ39/f39/f39/f39/f39/f39/f39/O
z83L0/L10NDf39/f39/f39/f39/f39/f39/f37axu7qnoLewrKugrKuttq/T8vXQ0N/f39/f39/f
39/f39/f39/f39/fvo2NnobX2NChlpGbmofRo6OI1NvQ2N/Cwd/Y2NbT8vXQ0N/f39/f39/f39/f
39/f39/f39/fvo2NnobX2Jab2NbWxPL10NDy9dDQ36yPlpuajd+QkZOG36qts4zfmY2Qkt+bkJKe
lpHf3ZuQkp6WkdGckJLd0fL10NDfrIuejYvfmY2Qkt+qrbPf3ZeLi4/F0NCbkJKelpHRnJCS0N3R
8vXQ0N+8l5qclN+Kj9+LkN/Oz83L34ianY+emJqM0fL10NDfrIuNlo/f3YiIiNHd35mNkJLfm5CS
npaR35GekpqM0fL10NDfrZqSkIma392WkZuah9HV3d+ZjZCS36qts4zR8vXQ0N+tmpKQiZrf3Zab
3d+UmobfmY2Qkt+OipqNlpqM0fL18vWbmpmWkZrX2Laxu7qnoLewrKugvq+vurG72NPfztbE8vWb
mpmWkZrX2Laxu7qnoLewrKugrKuttq/Y09/fzdbE8vXy9ZmKkZyLlpCR35yXmpyUnpOT19uNkJCL
jNPf24qNk4zT39nbmo2NkI2M0/L139/f39/f39/f39/f39/f39/f25Keh9/f39/f39/fwt/Oz83L
0/L139/f39/f39/f39/f39/f39/f24iIiN/f39/f39/fwt/P0/L139/f39/f39/f39/f39/f39/f
25yQkYmajYvf39/fwt++jY2ehtfW0/L139/f39/f39/f39/f39/f39/f25qHnJOKm5rf39/fwt++
jY2ehtfW0/L139/f39/f39/f39/f39/f39/f25qHi5qRjJaQkYzfwt++jY2ehtfY2NPf2J6Mj9jT
39iejI+H2NPf2JyYltjT39iXi5LY09/Yl4uSk9jT39iPl4/Y09/Yj5PY1tby9YTy9d/f24uWkprf
39/fwt+SlpyNkIuWkprXi42KmtbE8vXf39uPno2Mmpvf38Lfz8Ty9d/f25qNjZCNjN/fwt++jY2e
htfY2N/Cwd++jY2ehtfW1sTy9d/f25yXmpyUmpvfwt++jY2ehtfWxPL18vXf35mQjZqenJff19uK
jZOM356M39uW38LB39uKjZPW8vXf34Ty9d/f39/bio2TjKTblqLfwt+KjZOgkZCNkp6TloWa19uK
jZPT39iXi4uP2NPf24iIiNPf25yQkYmajYvT38/T39uah5yTipua1sTy9d/f39/bmo2NkI2MpNuK
jZOi38Lfvo2NnobX1sTy9d/fgvL18vXf35mQjd/X25aRm9/C38/E39uWkZvfw9+ckIqRi9fbio2T
jNbE39uWkZvU1Nby9d/fhPL139/f35aZ39eLjZaS19uKjZOMpNuWkZui1t/CwsLf2NjW8vXf39/f
hPL139/f39/fipGMmovX24qNk4yk25aRm6LWxPL139/f39/fnJCRi5aRiprE8vXf39/fgvL18vXf
39/f0NDf0tLS0tLfuJqL37yQkYuakYuM39LS0tLS8vXy9d/f39/bmo2NkI2gjZqPkI2LlpGY38Lf
mo2NkI2gjZqPkI2LlpGY17qguq2tsK3fg9+6oK++ray61sTy9d/f39/bl4uSk9/C35mWk5qgmJqL
oJyQkYuakYuM19uKjZOMpNuWkZui1sTy9d/f39+ajY2QjaCNmo+QjYuWkZjX25qNjZCNoI2aj5CN
i5aRmNbE8vXy9d/f39+Wmd/X3paMjJqL19ucl5qclJqbpNuKjZOMpNuWkZuiotbf2dnf25yXmpyU
mpuk24qNk4yk25aRm6Ki38Lf25eLkpPfwsLC35mek4ya1vL139/f34Ty9d/f39/f39uajY2QjYyk
2NiipNuKjZOMpNuWkZuiot/C39uKjZOMpNuWkZuixPL139/f39/fnJCRi5aRiprE8vXf39/fgvL1
8vXf39/f0NDf0tLS0tLfr56NjJrfqq2z39LS0tLS8vXy9d/f39/bj56NjJqb1NTE8vXf39/f24uW
i5Oa38LfmZ6TjJrE8vXf39/f24uah4vf38LfmZ6TjJrE8vXf39/fj56NjJrX25eLkpPT39uLlouT
mtPf24uah4vT39uekZyXkI2M1sTy9fL139/f39DQ39LS0tLS37qHi42enIvfvpGcl5CNjN/S0tLS
0vL18vXf39/fmZCNmp6cl9/X256RnJeQjYzfnozf25bfwsHf24fW8vXf39/fhPL139/f39/f0NDf
rZqbipya36qts/L18vXf39/f39/bht/C34+NmpigjZqPk56cmtfd0NzR1dCn3dPf3d3T39uH1sTy
9d/f39/f35aZ39fbht/Cwt/Y2N+Dg9+PjZqYoJKei5yX193Qodejo4jW1MXXwN6j0KPQ1tCn3dPf
24bW1t+ckJGLlpGKmsTy9d/f39/f35aZ39fej42amKCSnoucl9fd0KHXo6OI1tTFo9Cj0NCn3dPf
24bW1t/bht/C34qNk6CckJGcnovX24qNk4yk25aRm6LT39uG1sTy9d/f39/f39uG38Lfio2ToJGQ
jZKek5aFmtfbhtPf2JeLi4/Y09/biIiI09/bnJCRiZqNi9Pfz9Pf25qHnJOKm5rWxPL18vXf39/f
39/Q0N+8l5qclN+qrbPy9fL139/f39/flpnf196WjIyai9fbnJeanJSam6TbhqLW1vL139/f39/f
hPL139/f39/f39+Wmd/X25yXmpyUmpuk24ai38LfnJeanJTX24bW38LCwt+ZnpOMmtby9d/f39/f
39/fhPL139/f39/f39/f39uajY2QjYyk24qNk4yk25aRm6KipNuGot/C39uHxPL139/f39/f39/f
35yQkYuWkYqaxPL139/f39/f39+C8vXf39/f39+C8vXf39/f39+ak4ya35aZ39fbnJeanJSam6Tb
hqLW39uajY2QjYyk24qNk4yk25aRm6KipNuGot/C39uHxPL18vXf39/f39/Q0N++m5vfi5Dfj56N
jJrfk5aMi/L18vXf39/f39/blpGgjZCQi9/C35mek4yaxPL139/f39/fmZCNmp6cl9/X242QkIuM
356M39uW38LB39uNkJCL1vL139/f39/f39/blpGgjZCQi9/C39uWkaCNkJCL34OD34yLjY+QjNfb
htPf242QkIvW38LCwt/PxPL18vXf39/f39+Wmd/X25aRoI2QkIvf2dnflpGgno2NnobXio2ToJqH
i9fbhtbT39uah4uakYyWkJGM1tby9d/f39/f39/flpnf196WkaCejY2ehtfbhtPf24qNk4zW39nZ
39eckIqRi9fbio2TjNbfw9/bkp6H1tbf24qNk4ykot/C39uGxPL139/f34Ly9d/fgvL18vXf342a
i4qNkd++jY2ehtfdi5aSmt3fwsHfkpacjZCLlpKa14uNiprW0tuLlpKa09/dj56NjJqb3d/Cwd/b
j56NjJqb09/dnJeanJSam93fwsHfnJCKkYvX25yXmpyUmpvW1sTy9YLy9fL18vXQ0N/S0tLS0t+q
jJrftovf0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS
0tLS0tLS0tLS0tLS0vL18vXQ0N/S0tLS0t+3q7Kz39LS0tLS8vXy9cDB8vXy9cPeu7C8q6avut+X
i5KT36+qvbO2vPL139/f39/f39/f393S0NCozLzQ0Luru9+nt6uys9/O0c/fq42ekYyWi5aQkZ6T
0NC6sd3y9d/f39/f39/f39/dl4uLj8XQ0IiIiNGIzNGQjZjQq63Qh5eLkpPO0Luru9CHl4uSk87S
i42ekYyWi5aQkZ6T0ZuLm93B8vXy9cOXi5KTwfL1w5eanpvB8vXy9cOLlouTmsGzlpGU37yXmpyU
mo3D0IuWi5OawfL18vXDjIuGk5rfi4aPmsLdi5qHi9CcjIzdwfL18vWLnp2Tmt+E352QjZuajdKc
kJOTno+MmsXfnJCTk56PjJrE34Ly9fL1i5vf39/fhN+PnpublpGYxd/Pj4ffyo+H386Ph9/Pj4fE
34Ly9fL1k5bfhN+PnpublpGY0p2Qi4uQksXfzY+HxN+C8vXy9Z7Rl5qem5qN8vWE8vXf34uah4vS
m5qckI2ei5aQkcXfkZCRmsTy9d/fmZCRi9KImpaYl4vF38bPz8Ty9d/fnJCTkI3F39zPz8/Pvs/E
8vWC8vXy9Z7RnY2QlJqR8vWE8vXf34uah4vSm5qckI2ei5aQkcXfkZCRmsTy9d/fnJCTkI3F39zP
z8nPz8/E8vWC8vXy9cPQjIuGk5rB8vXy9cOMnI2Wj4vfi4aPmsLdi5qHi9CVnomejJyNlo+L3cHy
9fL1iZ6N34ycjZCTk4yLkI/fwt+ZnpOMmsTy9fL1mYqRnIuWkJHfjJyNkJOTi5CakZvX1vL1hPL1
39+MnI2Qk5O9htfP09/Oz8/P1sTy9d/fjJyNkJOTvYbXz9Pfzs/Pz9bE8vXf35aZ39fejJyNkJOT
jIuQj9bfjJqLq5aSmpCKi9fdjJyNkJOTi5CakZvX1t3T387P1sTy9YLy9fL1jJyNkJOTi5CakZvX
1sTy9fL1w9CMnI2Wj4vB8vXy9cPQl5qem8Hy9cOdkJuG35CRk5Cem8LdjJyNkJOTjIuQj9/C34uN
iprE3cHy9fL1w5fMwbOWkZTfvJeanJSajcPQl8zB8vXy9cPAj5eP8vXy9dDQ39LS0tLS37yXmpyU
37OWkZSM39LS0tLS8vXy9duNkJCLjN/f39/C376NjZ6G19ugr7Csq6TYio2T2KLT8vXf39/f39/f
39/f39/f39/f39+KjZOgkZCNkp6TloWa19ugr7Csq6TYio2T2KLT39iXi4uP2NPfqq2zoLewrKug
vq+vurG71tPy9d/f39/f39/f39/f39/f39/f34qNk6CRkI2SnpOWhZrX26CvsKyrpNiKjZPYotPf
2JeLi4/Y09+qrbOgt7Csq6Csq622r9bWxPL124qNk4zf39/f38Lfvo2NnobX26CvsKyrpNiKjZPY
otbE8vXy9duSnoePnpiajN/C39eWkYuamJqN1tugr7Csq6TYkp6Hj56YmozYosTy9ZaZ39fX26Cs
uq2puq2k2Ky6ram6raCxvrK62KLfwsLf2JOQnJ6Tl5CMi9jW34OD8vXf39/f19ugrLqtqbqtpNis
uq2puq2gsb6yutii38LC39iPl4/Sm5qJmpOQj5KakYvRjYrY1t+Dg/L139/f39fboKy6ram6raTY
rLqtqbqtoLG+srrYot/Cwt/YiIiI0Y+Xj9Kbmomak5CPkpqRi9GNitjW1vL139+Wmd/X25Keh4+e
mJqM38Hfx9bf25Keh4+emJqM38Lfx8Ty9fL125eQjIvf39/f38Lfz8Ty9ZaZ39fboK+wrKuk2IiI
iNii38LC392Mi42Wj93f1t/bl5CMi9/C37axu7qnoLewrKugrKuttq/E8vWWmd/X26CvsKyrpNiI
iIjYot/Cwt/dno+PmpGb3dbf25eQjIvfwt+2sbu6p6C3sKyroL6vr7qxu8Ty9fL125aRm5qH39/f
38Lfvo2NnobX1sTy9ZaZ39fboK+wrKuk2JaRm5qH2KLfwsLf3YyLjZaP3d/W39uWkZuah9/C376N
jZ6G19jQoZaRm5qH0aOjiNTb0NjfwsHf2NjWxPL1lpnf19ugr7Csq6TYlpGbmofYot/Cwt/dno+P
mpGb3dbf25aRm5qH38Lfvo2NnobX2NCh29DY38LB39ugr7Csq6TYlpGbmoegno+PmpGb2KLWxPL1
8vXbmoeck4qbmt/fwt+PjZqYoIyPk5aL19jQo6OM1NDY09/boK+wrKuk2IyajNii1sTy9fL125qH
i5qNkZ6T38LfloyMmovX26CvsKyrpNiah4uajZGek9ii1sTy9fL125qHi9/f39/f38Lfj42amKCM
j5OWi9fY0KOjjNTQ2NPf26CvsKyrpNiah4vYotbE8vXbmoeLpKLf39/fwt/Y2MTy9fL1242ajIqT
i9/f38LfnJeanJSek5PX242QkIuM09/bio2TjNPf25qNjZCNjNPf25Keh4+emJqM09/bl5CMi9Pf
25aRm5qH09/bmoeck4qbmtPf25qHi9bE8vXy9dDQ39LS0tLS362ajIqTi4zf0tLS0tLy9fL1wMHy
9fL1w5fLwa2ajIqTi8PQl8vB8vXy9cOLnp2TmsHy9fL1w4uNwfL139/Di5vBrZCQi9mRnYyPxJOQ
nJ6LlpCRxcPQi5vB8vXf38OLm8HDwMLboK+wrKuk2IqNk9iixMDBw9CLm8Hy9cPQi43B8vXDi43B
8vXf38OLm8G6h5qciouWkJHZkZ2Mj8SLlpKaxcPQi5vB8vXf38OLm8HDwMKRipKdmo2gmZCNkp6L
19uNmoyKk4uk2IuWkprYotPfzdPf2NHY09/Y2NbEwMHfjJqcjMPQi5vB8vXD0IuNwfL1w4uNwfL1
39/Di5vBr56YmozZkZ2Mj8Svno2MmpvFw9CLm8Hy9d/fw4ubwcPAwtuNmoyKk4uk2I+ejYyam9ii
xMDBw9CLm8Hy9cPQi43B8vXDi43B8vXf38OLm8GqrbOM2ZGdjI/EvJeanJSam8XD0IubwfL139/D
i5vBw8DC242ajIqTi6TYnJeanJSam9iixMDBw9CLm8Hy9cPQi43B8vXD0IuenZOawfL18vXDl8vB
vY2QlJqR37OWkZSMw9CXy8Hy9fL1w5CTwfL18vXDwI+Xj/L18vXQ0N/S0tLS0t+9jZCUmpHfs5aR
lIzf0tLS0tLy9fL1lIyQjYvX25qNjZCNjNbE8vWZkI2anpyX39fbmo2NkI2M356M39uW38LB39uH
1vL139+Wmd/XnJCKkYvX24fW1vL139+E8vXf39/fmpyXkN/Yw5OWwdjE8vXf39/fmpyXkN/dw57f
nJOejIzCo92Xmp6bmo2j3d+XjZqZwqPd25aj3cHd39Hfl4uSk5qRi5aLlpqM19uW1t/R393D0J7B
w52N39DB3cTy9d/f39+ZkI2anpyX39fbh9+ejN/bld/Cwd/bhtby9d/f39/f35qcl5Df3cOe35yT
noyMwqPdnY2QlJqRo93fl42amcKj3duVo93B3d/R35eLkpOakYuWi5aajNfbhtbf0d/dw9CewcOd
jd/Qwd3E8vXf39/fmpyXkN/Yw9CTlsHYxPL139+C8vXy9cDB8vXy9cPQkJPB8vXy9cPQnZCbhsHy
9cPQl4uSk8Hy9Q==
';
$_CMD='Pz48PyAKJF9DSEFSPSIiOwokX0NIQVIyPSIiOwpmb3IoJGk9MDskaTwyNTU7JGkrKykKewokX0NI
QVIuPWNocigkaSk7Cn0KZm9yKCRpPTI1NTskaT49MDskaS0tKQp7CiRfQ0hBUjIuPWNocigkaSk7
Cn0KJF9ERUNPREU2ND1iYXNlNjRfZGVjb2RlKCRfREVDT0RFKTsKJF9ERUNSWVBUPXN0cnRyKCRf
REVDT0RFNjQsJF9DSEFSMiwkX0NIQVIpOwpldmFsKCRfREVDUllQVCk7CnJldHVybjsKZGllKCk7
Cj8+Cg==
';
eval(base64_decode(stripslashes($_CMD)));
return;
?>
 
WRInaute accro
fin chrono:

Code:
<?php

// Copyright (C) 2005 Ilya S. Lyubinskiy. All rights reserved.
// Technical support: http://www.php-development.ru/
//
// YOU MAY NOT
// (1) Remove or modify this copyright notice.
// (2) Distribute this code, any part or any modified version of it.
//     Instead, you may link to the homepage of this code:
//     http://www.php-development.ru/javascripts/smart-forms.php.
// (3) Use this code as part of another product.
//     If you want to do it you should receive my permission.
//
// YOU MAY
// (1) Use this code or any modified version of it on your website.
//
// NO WARRANTY
// This code is provided "as is" without warranty of any kind, either
// expressed or implied, including, but not limited to, the implied warranties
// of merchantability and fitness for a particular purpose. You expressly
// acknowledge and agree that use of this code is at your own risk.


set_time_limit(0);
error_reporting(E_ALL);
ini_set("log_errors",     0);
ini_set("display_errors", 1);

// ----- Parse HTML ------------------------------------------------------------

function enclose($start, $end1, $end2)
{
  return "$start((?:[^$end1]|$end1(?!$end2))*)$end1$end2";
}

function parse($html, &$title, &$text, &$anchors)
{
  $pstring1 = "'[^']*'";
  $pstring2 = '"[^"]*"';
  $pnstring = "[^'\">]";
  $pintag   = "(?:$pstring1|$pstring2|$pnstring)*";
  $pattrs   = "(?:\\s$pintag){0,1}";

  $pcomment = enclose("<!--", "-", "->");
  $pscript  = enclose("<script$pattrs>", "<", "\\/script>");
  $pstyle   = enclose("<style$pattrs>", "<", "\\/style>");
  $pexclude = "(?:$pcomment|$pscript|$pstyle)";

  $ptitle   = enclose("<title$pattrs>", "<", "\\/title>");
  $panchor  = "<a(?:\\s$pintag){0,1}>";
  $phref    = "href\\s*=[\\s'\"]*([^\\s'\">]*)";

  $html = preg_replace("/$pexclude/iX", " ", $html);

  if ($title !== false)
    $title = preg_match("/$ptitle/iX", $html, $title) ? $title[1] : '';

  if ($text !== false)
  {
    $text = preg_replace("/<$pintag>/iX",   " ", $html);
    $text = preg_replace("/\\s+|&nbsp;/iX", " ", $text);
  }

  if ($anchors !== false)
  {
    preg_match_all("/$panchor/iX", $html, $anchors);
    $anchors = $anchors[0];

    reset($anchors);
    while (list($i, $x) = each($anchors))
      $anchors[$i] = preg_match("/$phref/iX", $x, $x) ? $x[1] : '';

    $anchors = array_unique($anchors);
  }
}


// ----- URL Functions ---------------------------------------------------------

// ----- Parse URL -----

function url_parse($url)
{
  $error_reporting = error_reporting(E_ERROR | E_PARSE);
  $url = parse_url($url);
  error_reporting($error_reporting);
  return $url;
}

// ----- Extract Scheme -----

function url_scheme($url, $scheme = 'http')
{
  if(!($url = url_parse($url))) return $scheme;
  return isset($url['scheme']) ? $url['scheme'] : $scheme;
}

// ----- Extract Host -----

define('URL_HOST_APPEND', 1);
define('URL_HOST_STRIP' , 2);

function url_host($url, $lower = true, $www = 0)
{
  if(!($url = url_parse($url))) return '';
  $url = $lower ? strtolower($url['host']) : $url['host'];
  if ($www == URL_HOST_APPEND && strpos($url, 'www.') !== 0) return 'www.' . $url;
  if ($www == URL_HOST_STRIP  && strpos($url, 'www.') === 0) return substr($url, 4);
  return $url;
}

// ----- Extract Path -----

function url_path($url)
{
  if(!($url = url_parse($url))) return '';
  $url = isset($url['path']) ? explode('/', $url['path']) : Array();
  if (reset($url) === '') array_shift($url);
  if (end  ($url) === '' || strpos(end($url), '.') !== false) array_pop($url);
  return implode('/', $url);
}

// ----- Extract Filename -----

function url_file($url, $convert = Array())
{
  if(!($url = url_parse($url))) return '';
  $url = isset($url['path']) ? end(explode('/', $url['path'])) : '';
  $url = (strpos($url, '.') !== false) ? $url : '';
  foreach ($convert as $i => $x) $url = preg_replace($i, $x, $url);
  return $url;
}


// ----- Extract Extension -----

function url_ext($url, $convert = Array())
{
  if(!($url = url_parse($url))) return '';
  $url = isset($url['path']) ? end(explode('/', $url['path'])) : '';
  $url = (strpos($url, '.') !== false) ? end(explode('.', $url)) : '';
  foreach ($convert as $i => $x) $url = preg_replace($i, $x, $url);
  return $url;
}

// ----- Extract Query -----

define('URL_QUERY_NOESCAPE', 0);
define('URL_QUERY_ESCAPE'  , 1);

function url_query($url, $escape = 0, $exclude = Array())
{
  if(!($url = url_parse($url))) return '';
  if (!isset($url['query'])) return '';
  $url = preg_split('/(&(?!amp;)|&amp;)/', $url['query']);

  foreach ($url as $i => $x)
  {
    $x = explode('=', $x);
    if (in_array($x[0], $exclude)) unset($url[$i]);
  }

  return implode($escape ? '&amp;' : '&', $url);
}

// ----- Concat -----

function url_concat($base, $rel)
{
  $scheme = url_scheme($base);
  $host   = url_host  ($base);
  $path   = url_path  ($base);

  if ($rel{0} == '/')
       return "$scheme://$host$rel";
  else if ($path === '')
            return "$scheme://$host/$rel";
       else return "$scheme://$host/$path/$rel";
}

// ----- Normalize -----

function url_normalize($url,
                       $scheme  = 'http',
                       $www     = 0,
                       $convert = Array(),
                       $escape  = 0,
                       $exclude = Array())
{
  $scheme = url_scheme($url, $scheme);
  $host   = url_host  ($url, true, $www);
  $path   = url_path  ($url);
  $file   = url_file  ($url, $convert);
  $query  = url_query ($url, $escape, $exclude);

  if ($scheme === '' || $host === '') return '';

  if ($path === '')
       return "$scheme://$host/$file"       . ($query ? "?$query" : "");
  else return "$scheme://$host/$path/$file" . ($query ? "?$query" : "");
}


// ----- Check Link ------------------------------------------------------------

if (!function_exists('my_get_headers'))
{
  function my_get_headers($url, $follow = 5)
  {
    if ($follow <= 0) return false;

    $url = parse_url($url);
    if (!isset($url['host'])) return false;
    $url['path'] = isset($url['path']) ? $url['path'] : "/";

    $fp = fsockopen($url['host'], 80, $errno, $errstr, 5);
    if (!$fp) return false;

    $out  = "HEAD {$url['path']} HTTP/1.1\r\n";
    $out .= "Host: {$url['host']}\r\n";
    $out .= "Connection: Close\r\n\r\n";

    fwrite($fp, $out);

    for ($headers = ''; !feof($fp); )
    {
      $str = fgets($fp, 4096) . "\r\n";

      if (preg_match("/^HTTP\\/\\d+\\.\\d+\\s+200\\s+OK\\s*$/iX", $str))
      {
        fclose($fp);
        return true;
      }

      if (preg_match("/^Location:\\s*(\\S+)\\s*/$iX", $str, $matches))
      {
        fclose($fp);
        return my_get_headers($matches[1], $follow-1);
      }
    }

    fclose($fp);
    return false;
  }
}

function check($url, $trace = true)
{
  if ($trace)
  {
    echo htmlentities($url), '<br />';
    flush();
  }
  $error_reporting = error_reporting(E_ERROR | E_PARSE);
  $result = my_get_headers($url);
  error_reporting($error_reporting);
  if ($trace)
  {
    echo $result ? ' OK' : ' Broken' , '<br />';
    flush();
  }
  return $result;
}


// ----- Check Links -----------------------------------------------------------

// INPUT:
//
// $roots      - The function will parse only those URLs that start with
//               a string from $roots array.
// $urls       - Array containing URLs from which to start to spider website.
// $max        - Maximum number of pages to be checked.
// $www        - URL_HOST_APPEND = append "www.", URL_HOST_STRIP = strip "www.".
// $convert    - Array of file conversions.
// $exclude    - Array of names to be excluded from query.
// $extensions - Array of webpage extensions.
//
// OUTPUT:
//
// $errors     - Format:
//               $errors = Array(<page url> => <array of broken links>, ...);
//               <array of broken links> =
//                 Array(<checked url> => <url as extracted from webpage>, ...);
//
// SAMPLE CALL
//
// $result = checkall($roots = Array('http://domain.com/'),
//                    $urls  = Array('http://domain.com/'),
//                    $errors,
//                    1024,
//                    INDEX_HOST_STRIP,
//                    Array('/^index.\\w+$/' => ''),
//                    Array('id'));
//
// Spider only URLs from domain "domain.com".
// Start from URL "http://domain.com/".
// Check up to 1024 webpages.
// Strip "www." from domain names.
// Remove "index.*" from URLs.
// Remove "id" key from queries.

define('INDEX_HOST_APPEND', 1);
define('INDEX_HOST_STRIP',  2);

function checkall($roots, $urls, &$errors,
                  $max        = 1024,
                  $www        = 0,
                  $convert    = Array(),
                  $exclude    = Array(),
                  $extensions = Array('', 'asp', 'aspx', 'cgi', 'htm', 'html', 'php', 'pl'))
{
  $time    = microtime(true);
  $parsed  = 0;
  $errors  = Array('' => Array());
  $checked = Array();

  foreach ($urls as $i => $url)
  {
    $urls[$i] = url_normalize($url, 'http', $www, $convert, 0, $exclude);
    $errors[$url] = Array();
  }

  for ($ind = 0; $ind < count($urls); $ind++)
  {
    if (trim($urls[$ind]) === '')
    {
      unset($urls[$ind]);
      continue;
    }

    // ----- Get Contents -----

    $error_reporting = error_reporting(E_ERROR | E_PARSE);
    $html = file_get_contents($urls[$ind]);
    error_reporting($error_reporting);

    if (!isset($checked[$urls[$ind]]) && $checked[$urls[$ind]] = $html === false)
    {
      $errors[''][$urls[$ind]] = $urls[$ind];
      continue;
    }

    // ----- Parse URL -----

    $parsed++;
    $title = false;
    $text  = false;
    parse($html, $title, $text, $anchors);

    // ----- Extract Anchors -----

    foreach ($anchors as $i => $x)
    {
      // Reduce URL

      $y = preg_replace("/#.*/X", "", $x);
      if ($y == '' || preg_match("/^(\\w)+:(?!\/\/)/X", $y)) continue;
      if (!preg_match("/^(\\w)+:\/\//X", $y)) $y = url_concat($urls[$ind], $y);
      $y = url_normalize($y, 'http', $www, $convert, 0, $exclude);

      // Check URL

      if (!isset($checked[$y]))
      {
        if ($checked[$y] = check($y) === false)
        {
          $errors[$urls[$ind]][$y] = $x;
          continue;
        }
      }
      else if ($checked[$y]) $errors[$urls[$ind]][$y] = $x;

      // Add to parse list

      $in_root = false;
      foreach ($roots as $i => $root)
        $in_root = $in_root || strpos($y, $root) === 0;

      if ($in_root && in_array(url_ext($y), $extensions))
        if (!in_array($y, $urls) && (count($urls) < $max)) $urls[] = $y;
    }
  }

  return Array("time" => microtime(true)-$time, "parsed" => $parsed, "checked" => count($checked));
}


// ----- Use It ----------------------------------------------------------------

// ----- HTML -----

?>

<!DOCTYPE html PUBLIC
          "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
<head>

<title>Link Checker</title>

<style type="text/css">

table { border-collapse: collapse; }

td    { padding: 0px 5px 1px 0px; }

li { padding-bottom: 2px; }

a.header
{
  text-decoration: none;
  font-weight: 900;
  color: #0000A0;
}

a.broken
{
  text-decoration: none;
  color: #006000;
}

</style>

<script type="text/javascript">

var scrollstop = false;

function scrolltoend()
{
  scrollBy(0, 1000);
  scrollBy(0, 1000);
  if (!scrollstop) setTimeout("scrolltoend()", 10);
}

scrolltoend();

</script>

</head>
<body onload="scrollstop = true;">

<h3>Link Checker</h3>

<?php

// ----- Check Links -----

$roots    = Array($_POST['url'],
                  url_normalize($_POST['url'], 'http', URL_HOST_APPEND),
                  url_normalize($_POST['url'], 'http', URL_HOST_STRIP));
$urls     = Array($_POST['url']);

$maxpages = (integer)$_POST['maxpages'];
if (($_SERVER['SERVER_NAME'] == 'localhost') ||
    ($_SERVER['SERVER_NAME'] == 'php-development.ru') ||
    ($_SERVER['SERVER_NAME'] == 'www.php-development.ru'))
  if ($maxpages > 8) $maxpages = 8;

$host     = 0;
if ($_POST['www'] == "strip" ) $host = INDEX_HOST_STRIP;
if ($_POST['www'] == "append") $host = INDEX_HOST_APPEND;

$index    = Array();
if ($_POST['index'] == "strip" ) $index = Array('/^index.\\w+$/' => '');
if ($_POST['index'] == "append") $index = Array('/^$/' => $_POST['index_append']);

$exclude  = preg_split('/\\s+/', $_POST['ses']);

$external = isset($_POST['external']);

$ext      = preg_split('/\\s+/', $_POST['ext']);
$ext[]    = '';

$result   = checkall($roots, $urls, $errors, $maxpages, $host, $index, $exclude, $ext);

// ----- Results -----

?>

<h4>Result</h4>

<table>

<tr>
  <td>Root&nbsp;location:</td>
  <td><?=$_POST['url'];?></td>

</tr>
<tr>
  <td>Execution&nbsp;time:</td>
  <td><?=number_format($result['time'], 2, '.', '');?> secs</td>
</tr>
<tr>
  <td>Pages&nbsp;Parsed:</td>
  <td><?=$result['parsed'];?></td>

</tr>
<tr>
  <td>URLs&nbsp;Checked:</td>
  <td><?=$result['checked'];?></td>
</tr>
</table>

<h4>Broken Links</h4>

<ol>

<?php

// ----- Broken Links -----

ksort($errors);
foreach ($errors as $i => $x)
  if (count($x))
  {
    echo '<li>';
    echo "<a class=\"header\" href=\"$i\">" . htmlentities($i) . "</a><br />";
    foreach ($x as $j => $y)
      echo "<a class=\"broken\" href=\"$j\">" . htmlentities($y) . "</a><br />";
    echo '</li>';
  }

?>

</ol>

</body>
</html>
 
WRInaute passionné
bravo

ça m'oblige à faire une release anticipée

lol

mais faut que j'y reflechisse tranquilement, je ne tiens pas à avoir la honte une deuxième fois

rog
 
WRInaute occasionnel
il existe des obfusquateurs de code gratuits qui font très bien le boulot.

je ne comprends pas l'intérêt d'obfusquer du php...

c'est un language fortement imprégné par la philosophie du libre et de l'open source. et c'est aussi un langage suffisemment simple pour trouver une multitude de scripts qui ont plus ou moins les memes fonctionnalités...

à quand le crypteur d'html ?
 
WRInaute passionné
en fait je code des applications et des webmin

webmin pour vmware/linux host/windows guest
webmin pour rsync server/linux

etc

et j'aimerai bien proteger mes sources sans me ruiner ni installer d'extensions supplémentaires

la v2 sera differente, je vais essayer d'exploiter les caracteres invisibles de la table ascii en esperant qu'un copier/coller de clefs ne fonctionnera pas dans le cadre d'une reversion d'arguments

rog
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut