All posts by kastenblog

mysql unsecure password function removed

ok on le savait qu’elle était pas top cette fonction déterministe : https://blog.kastenbaum.net/dont-crypt-password-with-mysql-functions/
mais de là à la supprimer ….
c’est fait mysql8 c’est supprimé (mariadb aussi ? why??).

on veut bien changer , mais pour les anciens mots de passe, on fait comment ??

on émule car old_password c’est compliqué mais on connait, et password, c’est du sha1 de unhex de sha1 https://stackoverflow.com/questions/5654819/how-can-i-decrypt-mysql-passwords :

drop function if exists my5password;
 delimiter $$
 create function my5password (input varchar(250)) 
 returns varchar(50)
 deterministic
 begin 
  return concat('*',upper(sha1(unhex(sha1(input)))));
 end$$
 delimiter ;



 drop function if exists old_password;
 delimiter $$
 create function old_password (input char(250)) 
 returns char(16)
 deterministic
 begin 
   declare nr bigint;
   declare nr2 bigint;
   declare ad bigint;
   declare inlen int;
   declare i int;
   declare b char;
   declare tmp int;
   declare output char(16);
   set nr = 1345345333;
   set nr2 = 0x12345671;
   set ad = 7;
   set inlen = length(input);
   set i = 1;
   while i <= inlen do
     set b = mid(input, i, 1);
     if b != ' ' and b != '\t' then
       set tmp = ord(b);
       set nr = nr ^ ((((nr & 63) + ad) * tmp) + ((nr << 8) & 0xffffffff));
       set nr2 = nr2 + (((nr2 << 8) & 0xffffffff) ^ nr);
       set ad = ad + tmp;
     end if;
     set i = i + 1;
   end while;
   set nr  = nr  & ((1 << 31) - 1);
   set nr2 = nr2 & ((1 << 31) - 1);      
   set output = lower(concat(hex(nr), hex(nr2)));
   return output;
 end$$
 delimiter ;

select my5password('toto'),old_password('toto');

alors bon ouais je n’ai pas réussi à créer la fonction qui s’appelle password() .
Enfin si on peut la créer mais il faut l’appeler mabase.password() donc ça revient au même, il faut repasser dans tous les SQL, et remplacer les where password(saisi)=champw par my5password(…

Quelle idée à la con de supprimer password(), ça va râler, c’est bien un coup d’oracle. On aurait pu rajouter un paramètre ‘salt’ optionnel, mais bon ça n’aurait pas fermé le trou de sécurité risqué par le transport de mot de passe non crypté vers mysql.

Les codes invisibles de gauche à droite rtl ltr 200e e2808e

Dans mon insertion sql de dates, elles n’étaient quelquefois pas reconnues, et du coup default now ou null. Quelquefois.
Et en cherchant sur quoi je tombe ?

06<200e>/<200e>07<200e>/<200e>19

Mais c’est quoi ces codes de m.. (en effet j’hésitais entre unicode et utf8).
Justement, c’est pas pareil, c’est des codes invisibles ltr rtl qui ne préviennent pas. Ils sont là si on veut mettre une citation en hébreu dans la phrase, mais למה לא?.
Justement l’unicode et l’utf8 sont différents. \u200e et \xe2808e
osef on veut les virer partout ?

function udb_clear_invisible($v_in)
{ //clear ltr rtl update udb_mta set mta_value=replace(mta_value,UNHEX('e2808e'),'') where mta_value like CONCAT('%', UNHEX('e2808e'),'%')
return(str_replace(array("\x20\x0e","\x20\x0f","\xe2\x80\x8e","\xe2\x80\x8f"),'',$v_in));
}

ntpdate rdate via http

Fatigué de ramer sur la mise en place de ntp, ntpd, port 123, et le message already used, trouver ntpdate -u, et voir qu’on ne trouve toujours pas les pool.ntp.org, et se dire que tout le monde est à l’heure sauf sa machine, et qu’on n’a que le http comme protocole, et qu’avec le http on a toujours l’heure dans le header, et que pourquoi qu’on n’utiliserait pas cette heure pour mettre à jour, hein ?

curl -X HEAD -s -i http://fr.pool.ntp.org|grep Date|sed -e 's/^Date:/--set="/' -e 's/$/"/'|xargs date

Fini les accents dans les URLs

Ouais, je sais, je devrais faire un “=”.urlencoding($val) à chaque fois mais bon hein, ça passe toujours. Non? 

Tomcat 8.5 et tomcat 9 (tomcat 8.0 aurait dû marcher mais pas chez moi) ça y est, ils n’acceptent plus d’accents dans les urls query_string. à peine s’ils acceptent les ([{|}]).

Utilisons l’apache en frontal pour transformer les accents reçus dans les URLs en leur équivalent %XX. Bonne idée au départ, mais je n’ai pas réussi à modifier la query string en lua. ça aurait été cool. Donc suivant la méthodologie QAD (euh.. quick and dirty …), voici la centaine de RewriteRule nécessaires : 


#used by : Include conf/rewriteacc.inc
echo "# UGLY : transcode real iso-8859-1 chars to %XX URL encoding " > /etc/httpd/conf/rewriteacc.inc
for L in a b c d e f;do
for C in 0 1 2 3 4 5 6 7 8 9 a b c d e f;do
X=$L$C
cat <<EOT>>/etc/httpd/conf/rewriteacc.inc
RewriteCond %{QUERY_STRING} ^(.*)\x$X(.*)$
RewriteRule ^(.*)\$ \$1?%1%$X%2 [N]
EOT
done
done
for X in 22 3c 3e 5b 5b 5c 5d 5e 7b 7c 7d 7e;do
cat <<EOT>>/etc/httpd/conf/rewriteacc.inc
RewriteCond %{QUERY_STRING} ^(.*)\x$X(.*)$
RewriteRule ^(.*)\$ \$1?%1%$X%2 [N]
EOT
done
cat <<EOT>>/etc/httpd/conf/rewriteacc.inc
RewriteRule ^(.*)\$ - [PT]
EOT

 

Je n’ose même pas commenter ces lignes. juste qu’il y a un proxypass derrière, d’où la bidouille du [PT] en fin de rewrites

Il y a des scripts quantiques schroedingeriens simultanément dans des états superposés de fierté et de honte.

Découpage de mbox, la vie des petits scripts

Nouveau serveur de mail, dilemne sur le choix du format de stockage, par fichier ou par boite, maildir ou mbox. Bon ok j’aurais du choisir maildir. Car maintenant je dois découper des très gros mbox qui ralentissent un peu les clients de mail.

j’ai retrouvé ce bout de perl mboxsplit.pl

my $part="off";
my $h=0;
while (<>) {
 my $l=$_;
 chomp;
 $part="arc" if (/^From MAILER.DAEMON/);
 $part="sent" if (/^From [a-z]*\@ledomaine.fr/);
  if ($part ne "off") {
  $c++;
  my $d=$_;
# From MAILER-DAEMON  Mon Feb 12 01:16:39 2018
  $d=~s/^From [^ ]* *[A-Za-z][A-Za-z][A-Za-z] //;
  $d=~s/\d\d \d\d:\d\d:\d\d //;
  $d=~s/ /_/g;
  if ($c > $m ) {
   close($h) unless ($h==0);
   $c=0;
   open($h,">".$part."_".$d);
  }
  $part="off";
 }
 print $h $l;
}
close($h);

on va manuellement trouver de gros mbox (inbox ou Sent généralement) et on tape

cat inbox|perl mboxsplit.pl

ce qui découpe le mbox en morceaux pas trop gros et pas trop petits, et les nommant pas trop mal arc_MMM_YYYY .

 

C’est intéressant la vie de tous ces bouts de codes qu’on n’utilisera qu’une ou deux fois, mais dont on est assez fiers de leur flexibilité.

Je pense à

une rotation de fichier

if [ -f $N ];then cp $N $N.0;fi
for i in 8 7 6 5 4 3 2 1 0;do
 if [ -f "$N.$i" ];then cp $N.$i $N.$(expr 1 + $i);fi
done

 

ou à une détection de connexion et d’envoi smtp douteuse, avec renvoi d’un ratio, pour zabbix

T=5000
L=$(tail -$T /var/log/maillog|wc -l)
P=0
if [ $L -gt 100 ];then
M=$(tail -$T /var/log/maillog|grep -c "ALLOWED .* origin_rdns: (unknown) auth: [a-z]")
P=$(expr $M \* 1000 / $L)
fi
echo $P

 

à tous ces codes qu’on se rappelle vaguement avoir fait, et qu’on n’arrive jamais à retrouver quand on en a besoin. En réalité, ils nous servent à savoir qu’on peut les refaire, très vite et mieux.

repackage solaris

un peu de code pour ouvrir un package solaris, y modifier des trucs, et le repackager.

#!/bin/sh
UNTRUC=":/home/"
UNAUTRE=":/export/home/"
P=$1
Q=`echo $P|sed -e 's/\.SunOS/SC.SunOS/'`
if [ ! -f "$P" ];then echo "$0 package";exit;fi
mkdir -p tmp/
rm -rf tmp/*
cd tmp
pkgtrans ../$P . all
D=`ls -d *`
cd $D
for F in $(ls install/*);do
if [ "`grep -c $UNTRUC $F`" != "0" ];then
cp $F $F.tmp
cat $F.tmp|sed -e "s|$UNTRUC|$UNAUTRE|" > $F
rm $F.tmp
G=`basename $F`
L=`wc -c $F|sed -e 's/^ *//' -e 's/ .*$//'`
S=`sum $F|sed -e 's/ .*$//'`
cp pkgmap pkgmap.tmp
cat pkgmap.tmp|sed -e "s/^1 i $G [0-9]* [0-9]* /1 i $G $L $S /" > pkgmap
rm pkgmap.tmp
fi
done
cd ..
pkgtrans -s . ../$Q all
cd ..
rm -rf tmp/*

 

en bref, lire la doc de pkgtrans, et recalculer les longueurs et checksums …

un jour comme un autre

 

don’t crypt password with mysql functions

Au début ça me paraissait une bonne idée, de déléguer le cryptage des mots de passe à mysql. Mais, non. Et c’est normal. Quoique.

Le cryptage doit bien sûr être asymétrique, genre md5 ou sha1, pour ne pas stocker de passe qui soit décryptable, juste stocker un hash qui valide un mot de passe. (select * from user where md5(“‘.$_POST[“pw”].'”)=passmd5) (oui, un petit coup d’électricité de rappel d’injection sql)

par contre la fonction password c’est juste une combinaison de deux sha1 (!!!)

https://unix.stackexchange.com/questions/44883/encrypt-a-password-the-same-way-mysql-does

python -c 'from hashlib import sha1; print "*" + sha1(sha1("right").digest()).hexdigest().upper()'
 
perl -MDigest::SHA1=sha1_hex -MDigest::SHA1=sha1 -le 'print "*". uc sha1_hex(sha1("right"))'
 
php -r 'echo "*" . strtoupper(sha1(sha1("right", TRUE))). "\n";'

 

Et donc 1 : ya pas de salt

mais bon, les gens ont la curieuse idée de stocker le salt avec le code, $X$salt$code$ = utilise le protocole X avec le salt en paramètre. Un peu comme de noter l’adresse et le digicode sur son porte clé. ou le code de CB. bref..

L’autre truc c’est que c’est pas random. password(‘toto’) donnera toujours la même chose. Et ce serait mieux qu’il donne à chaque fois des valeurs différentes. Le seul moyen de tester serait de le passer à la fonction de vérification pass_verif(pass saisi, contenu de la base).

C’est fourni par le vieux code crypt(), ou le nouveau http://php.net/manual/fr/function.password-verify.php , ou le code alternatif https://github.com/ircmaxell/password_compat/blob/master/lib/password.php , or shorter https://gist.github.com/odan/1d4ff4c4088e906a5a49

 

function create_password_hash($strPassword, $numAlgo = 1, $arrOptions = array())
{
if (function_exists('password_hash')) return(password_hash($strPassword, $numAlgo, $arrOptions));
$salt = mcrypt_create_iv(22, MCRYPT_DEV_URANDOM);
$salt = str_replace('+', '.', base64_encode($salt));
return(crypt($strPassword, '$2y$10$' . $salt . '$'));
}
function verify_password_hash($strPassword, $strHash)
{
if (function_exists('password_verify')) return(password_verify($strPassword, $strHash));
$strHash2 = crypt($strPassword, $strHash);
return( $strHash == $strHash2);
}
//TEST: $strHash = create_password_hash("secret", PASSWORD_DEFAULT);echo $strHash . "\n";
//echo (verify_password_hash('secret', $strHash)) ? 'Password is valid!':'Invalid password.';

Un jour il pourrait y avoir un portage de crypt() dans mysql .
Mais il n’y est pas, exprès, pour éviter de trop transporter un mot de passe non crypté, ce qui multiplierait les risques de sniff (snif!).

(merci Laurent)

Scripter comme un dinosaure

[original : http://guykastenbaum.blogspot.ch/2012/01/scripter-comme-un-dinosaure.html 27 janvier 2012]
comme j’aime bien cet article, je l’ai retrouvé sur blogger et réinjecté dans mon blog actuel.
Comment scripter (sh ou ksh) sur des environnements compatibles linux AIX Solaris ?
Je sais qu’il suffirait de changer de versions de sh ksh bash etc mais
Quelques recettes de cuisine :pour le if
if [ “x${var}” = “xyes” ]; then echo “yes”; fiRESPECTER les espaces, non il ne faut rien coller, ni [“, ni “=”, ah c’est dur…

ajouter le “x” pour éviter les if “-u” …=>; erreur sur l’opération -u

ajouter les guillemets car dans if [ $var =  $var pourrait être vide
(ça fait doublon avec “x” mais on est jamais assez prudent)

de temps en temps ajouter les accolades pour $var , soit ${var}, par pure paranoia

ajout récent : dans les tests d’égalité, il faut utiliser ‘=’ et non ‘ = = ‘(==), c’est pas compatible avec le vieux ‘sh’;

utiliser -eq plutôt que == , quoique on peut quand même oser. (en général, j’ose, c’est plus lisible)

je n’utilise pas le raccourci $a == “y” || $b=”n” , j’ai trop peur que ça soit trop moderne.

avec prudence les OR et AND sous forme de -o et -a ;

les jours de grande parano, utiliser des doubles crochets comme dans la doc
if [[ “x$a” != “xy” -a “x$a” != “xn” ]];then echo “maybe”; fi

pour faire un $x=~/toto/ [perl] ben d’à peu près lisible j’ai

if [ ” `echo $x|sed -e 's/toto//'`" != "$x" ];then ...

pour le sed 
en général il est sympa, sauf chez solaris

sur solaris sed -e ‘s/\t/ /g’ remplace les ‘t’ par des blancs.(oui,oui)
il faut remplacer sed -e “s/\t/ /g” par tr ‘\t’ ‘ ‘
c’est ce qui m’a décidé à écrire ce billet
d’ailleurs, tr marche assez bien : tr [:upper:] [:lower:] est bien compris
cadeau pour générer un mot de passe de 6 caractères :

$(head -n 100 /dev/urandom| tr -dc “[A-Z][a-z][0-9]”|cut -c1-6)

de même, si tu as des fichiers qui ne se termine pas par “\n” , le sed te zappe la dernière ligne. (oui,oui)
faire une boucle de réparation avant :

for instfile in $(find . -type f);do
if [ “$(tail -1 $instfile|od -t x1|tail -2|head -n 1|grep -c ‘ 0a’)” == “0” ];then
echo “” >> $instfile
fi
done

ah oui, oubliez le pratique -i, il faut revenir à sed -e ‘….’ a>b;mv b a
ou mieux car il conserve les attributs cp -p a b;sed -e ‘..’ b>a;rm -f b

[ajout de mai 2012]
Encore Solaris qui nous rappelle que sed -e “s/a/b/ s/c/d/” est un raccourci trop récent pour être supporté. Pour être 19k-compatible il faut écrire : sed -e “s/a/b/” -e “s/c/d/”

[ajout avril 2013]
Ah AIX se fait remarquer, on ne peut pas faire sed fichier -e ‘…’
car ça n’est pas dans le bon ordre. Soit sed -e ‘…’ fichier soit (c’est plus sûr)
cat fichier|sed -e ‘…’
ed
quelquefois on s’en sort en allant chez cet épicier discount, exemple
ed -s src/xmlrpc_introspection.h << EOD
/XMLRPC_ServerSetValidationLevel
i
XMLRPC_VALUE find_named_value(XMLRPC_VALUE list, const char* needle);
void describe_method(XMLRPC_SERVER server, XMLRPC_VALUE vector, const char* method);
.
w
q
EOD
shell (sh echo $* .)

ne pas utiliser le trop moderne ‘-n’ option d’echo, car
echo “echo -n toto” > /tmp/a ; sh /tmp/a ; ksh /tmp/a ; rm a
affiche bien “-n toto”

éviter les echo avec des passages à la ligne , même avec \

sh ne connait pas $(commande), il ne connait que `commande` , c’est pas pratique.

sh n’accepte pas export PIF=”paf” , il exige PIF=”paf” ; export PIF
de toutes façon j’utilise ksh (c’est les ordres de là haut)

$0 $1 $* $@
variables fragiles, elles peuvent s’effacer le long du script (suffit qu’elles soient utilisées en sous entendu dans un sous appel), donc les sauver dès le début du script

$0 des fois contient “-bash” au lieu de “bash” je sais pas d’où ça sort.

“source file” : utiliser “. ./file” ; c’est moins lisible mais plus archaique

cadeau, un complément de getopts

while getopts “n:t:m:a:u:s:h” opt; do
if [ “$OPTARG” = “” ]; then OPTARG=1; fi
if [ “$opt” != ‘?’ ] && [ “$opt” != ‘:’ ]; then
export OPTARG_${opt}=$OPTARG
fi
done

les fonctions s’écrivent

compilesys()
{
pas de ‘function’
des parenthèses vides (on chopera $1 $2 …)
accolade à la ligne
et ça s’appelle sans les parenthèses, compilesys unzip

pour id, uname
pour les fonctions borderline, qu’on croit qu’elles sont standards, eh ben moitié moitié.
faut vérifier les options de base. sur solaris j’utilise

if [ -f “/usr/xpg4/bin/id” ];then export GSCRIPT_BIN_ID=/usr/xpg4/bin/id;
else export GSCRIPT_BIN_ID=id; fi

sinon je ne m’en sors pas (besoin du id -gn -u -g ..)

uname -s est plus fiable que hostname (JYP)

grep

ne connait pas toujours -E (solaris) , par contre son équivalent egrep existe …

tar
oubliez le -z pour de copain gzip, retrouvez tar cf -|gzip -c|gzip -dc|tar xf –
pour les gros tar, ou avec des longs paths, utiliser gtar ou une version fraiche :

pour tar gzip zip bzip make … : RECOMPILEZ ! cadeau :

compilesys()
{
confplus=$2
gzip -dc ../zip/$i-*.gz 2> /dev/null | tar xf – #ou variante…
cd $i-*/ ;   ./configure –cache-file=config.cache –prefix=SOMEWHERE $confplus
make ;  make install ;  cd ..
}
compilesys tar “FORCE_UNSAFE_CONFIGURE=1”
for soft in xz bison flex m4 autoconf automake libtool make bash binutils;do compilesys $soft;done

## (2020) read

oh oh une nouvelle m.. subtilité

read de bash tourne dans un subprocess, au contraire de ksh,
subtil hein, c’est grave ? ben…

echo “a b c”|read A B C && echo “A=$A B=$B C=$C”

cat file|while read LINE;do A=$($A + 1) done;echo $A

ben en ksh ça fait ce qu’on attend. en bash non

pour retrouver la compatibilité, abracadabra

shopt -s lastpipe

J’en ai sûrement oublié, dites moi

Millions d’années, distances astronomiques, mnémotechnie

Comment bien visualiser des millions d’années, et un système solaire ? en ramenant tout à une échelle de distances humaines : 1000ans=>1m, 1000km=>1mm

On passe par la méthode mnémothechnique du palais de mémoire, ou méthode des loci.

Rien à voir avec l’informatique, mais j’essayais juste de me rappeler des distances terre lune etc de façon plus facile à retenir.

L’idée vient de la conversion entendue à la radio de 1000 ans = 1m (1millon d’année = 1km) :

notre civilisation est à 2m de nous,
l’antiquité à 5m avec le début de l’écriture,
le cro-magnon à 50m, sapiens à 300m, néanderthal à 500m, érectus à 1km,
l’australopithèque est à 4km, le premier primate à 85km
les dinosaures s’éteignent à 65km et ont commencés à 235km,
les reptiles 300km, les poissons, les moustiques 400km, les plantes 500km,
l’oxygène à 1300km (Paris-Madrid)
la terre : 4 550km (Paris-Dakar)
l’univers : 14 000 km (France-Australie..)

si on fait pareil pour les planètes, avec 1000km => 1mm (*10^9)

La Lune est une miette de 3mm de diamètre, qui tourne autour d’une Terre bille de 1cm,
le tout à 150m du Soleil presque humain de 1m40 de diamètre,
les planètes s’étendent jusqu’à 7km, pour l’étoile la plus proche il faut faire le tour de la Terre

Lune 3mm <–30cm(1s)–> Terre 1cm …… 150m ….. Soleil 1m40
Mercure 70m
Vénus 110m
Terre 150m (8mn)
Mars 250m
Jupiter 800m (45mn)
Saturne 1500m
Uranus 3km
Neptune 4.5km
Pluton 7km
Proxima-Centauri : 42000km (4 annees lumières)
entre parenthèses, la distance en temps de propagation de la lumière,
qui marche tranquillement à 30cm/s soit 1km/h,
et qui mettrait 4 ans à faire le tour de la terre.

Il suffit de se rappeler de ces distances et de changer
‘m’ en ‘milliers de km’ et ‘km’ en ‘millions de km’
ou ‘m’ en ‘milliers d’années’ et ‘km’ en ‘millions d’années’

En espérant que ça vous permette de briller en société.

 

http://www.astronoo.com/fr/articles/histoire-terre.html
http://trustmyscience.com/maquette-systeme-solaire-desert-nevada/

pandoc markdown powerpoint

Quelle plaie la doc, hein ….

Le seul moyen de la faire passer c’est de la faire en MarkDown ;

avec les astuces de :

un espace en fin de ligne pour forcer le passage à la ligne,

utiliser les “` avec suffisamment de lignes vides autour pour bien comprendre que c’est du code ; (indenter tout un bloc par une tabulation, des fois, ça ne marche pas sur certains paragraphes)

bien ranger les h1 h2 h3 h4 (# ## ### ####), pour générer un powerpoint

pandoc -f markdown -t docx -o doc.docx doc.md
pandoc -f markdown -t latex -o doc.pdf doc.md

pour les “powerpoints”  on peut le faire avec s5, dzslides, slidy, ou slideous ( ref  )

j’ai choisi slidy, et ajouté des CSS

 

pandoc -s -f markdown -t slidy --slide-level 4 -H doc.hdr -o doc.htm doc.md
 
avec doc.hdr = 
<style>
h4 {padding:5px 10px;background-color:#edf;}
h1,h2,h3,h4{text-align: center;}
h1,h2,h3{margin-top: 20%;font-size: 200%;}
div.toolbar::before{content:url(footer_bar.png);}
</style>
<div style="border-bottom:1px solid grey;text-align:right;">Titre de ma présentation</div>
 
#rien à voir mais si on veut inclure une image en mode data: , c'est très simple
mimetype=$(file -bN --mime-type "$1")
content=$(base64 -w0 < "$1")
echo "url('data:$mimetype;base64,$content')"