update-alternatives –set php /usr/bin/php7.X
update-alternatives –set phar /usr/bin/phar7.X
update-alternatives –set phar.phar /usr/bin/phar.phar7.X
update-alternatives –set phpize /usr/bin/phpize7.X
update-alternatives –set php-config /usr/bin/php-config7.X
Archivio Categoria: Php
Trucchi e segreti, script e spunti :-)
NewSCript notizie gratis sul sito
Procede la fase di migrazione di tutti i miei piccoli script sparsi sui vari tex[.*].altervista.org verso il nuovo dominio texilee.it
Oggi è terminato lo spostamento degli NewSCript, alcuni semplici script php che ti permettono di “abbellire” il sito (php) con semplicità, inoltre cliccando sui link si apriranno dei popup contententi altre informazioni
Per il momento sono disponibili 3 script:
Visualizza l’oroscopo del giorno, io personalmente non lo leggo 🙂
Mostra l’elenco delle ultime $n notizie prelevandole dal sito di Repubblica, per essere sempre aggiornati
Mostra a caso un’immagine di un film in uscita al ciname questa settimana, click sull’immagine porta a filmup.com , click sul titolo a un popup con altre immagini e trama
Download , FAQ , e modulo contatti
PS: non c’è input sanitizing, questi script possono essere “pericolosi” e in alcuni casi “rompervi” il sito, usateli a vostro rischio e pericolo!
Guida da perl a php e php vs python
Una ottima pagina per gli sviluppatori che si trovano a dover affrontare per le prime volte uno di questi due linguaggi conoscendo l’altro. Le comparazioni sintattiche fra i due linguaggi di scripting variano dall’utilizzo degli array, alle funzioni di hashes, formattazione del testo, variabili GET e POST, all’interfacciamento a Mysql
http://www.cs.wcupa.edu/~rkline/perl2php/
Per conoscere le principali differenze fra php e python questa pagina
http://wiki.w4py.org/python-vs-php.html
offre notevoli spunti per prediligere un linguaggio o l’altro a seconda della applicazione che si intende realizzare. Appena avrò un pò di tempo vedrò di realizzare lo stesso scriptino ( inutile come sempre) nei 3 linguaggi, magari un motore di ricerca di mp3 trance.
Top rbl email blacklist graph
Qmail section:
Per visualizzare un elenco del tipo
763 list.dsbl.org: 97 bl.spamcop.net: 26 relays.ordb.org:
utilizzare il comando
grep rblsmtpd /var/log/mail.log | awk '{ print $11}'| sort |uniq -c | sort -r
Postfix section :
Il comando è molto simile al precedente, per rendermi la vita più difficile ho modificato la struttura dei campi del maillog, precedentemente nel campo n° 19 veniva scritta l’url della lista nera, dopo le mie modifiche al n° 20, quindi li devo analizzare entrambi, fino al prossimo logrotate.
grep "blocked using" /var/log/maillog | awk '{if ($20 ~ /^[a-z./]+..*..*;$/) print $20; if ($19 ~ /^[a-z./]+..*..*;$/) print $19; }' | sort |uniq -c | sort -r
Il risultato è
9396 cbl.abuseat.org; 3137 dul.dnsbl.sorbs.net; 1620 list.dsbl.org; 1368 dnsbl.njabl.org; 825 korea.services.net; 485 combined.njabl.org; 27 sbl.spamhaus.org; 13 dnsbl.antispam.or.id; 5 relays.ordb.org; 1 spamsources.fabel.dk;
Come potete vedere questo sito è un museo della grafica, dallo sfondo ai menù per arrivare alle decine di animazioni Flash. Per rendere ancora più artistico il sito ho pensato di provare PHP4: JpGraph
Necessita delle GD e di una semplice modifica per funzionare sotto Debian.
$vi /path/jpgraph/jpg-config.inc DEFINE("TTF_DIR","/usr/share/fonts/truetype/msttcorefonts/");
Questo tool serve a creare grafici tramite l’ausilio di classi e estensioni delle stesse.
Un ottimo tool per monitorare il funzionamento delle RBL potrebbe essere:
Salvare i risultati del comando grep+awk in un database quotidianamente.
Generare un grafico giornaliero , settimanale e mensile con tempi di aggiornamento proporzionali e salvarli sul filesystem, creare un form web per ottenere via DB i valori di un determinato range temporale.
Ma come esempio basta soffermarsi sui valori ottenuti precedentemente. Per comodità visiva raccolgo il seguente insieme di elementi in “Altro”
sbl.spamhaus.org; dnsbl.antispam.or.id;relays.ordb.org;spamsources.fabel.dk;
per un totale di 46 elementi
Genero il grafico a “torta” con l’opzine 3D (guarda il sorgente php)
Hardening Debian Linux LAMP Servers
Hardening Debian Linux Web PHP Servers
L’aspetto più rilevante nella configurazione di un web server è senza dubbio la completa collaborazione fra sviluppatori di codice e sistemisti (gli sviluppatori grafici non hanno voce in questione 😛 )
Inutile preparare una macchina dalla configurazione hardware ottimale con RAID 5 o 10 su 4 dischi SCSI e un firewall di 3000 righe per scoprire di lunedì mattina che il DB è vuoto. Motivo? Account di amministratore settato con USER: “Admin” e Password indovinate un po’… 😐 … “Admin” ovvio!
Sprecare quel paio d’ore in più a chiacchierare con lo sviluppatore non è male, ma cosa buona e giusta! Prendetevi tutto il tempo per rendere stabili e congruenti le modifiche e non abbiate nè fretta nè timore di far osservare qualche policy di sicurezza in più al vostro collega cresciuto su manuali che danno per scontato il non effettuare input sanitazing.
Per la preparazione del kernel (personalmente pendo dalla parte degli amanti di conf monolitiche con le giuste patch applicate vedi grsecurity) penso di scrivere qualcosina più avanti.
Security is a process, not a result (sia chiaro in partenza…)
Security a livello di sistema
Questo è il compito del sistemista … effettivamente c’è bisogno di parecchio tempo per raffinare la tecnica e centralizzare le politiche in un layer di controllo non troppo invasivo.
Prima di iniziare a stilare qualche linea di codice e iniziare a riconfigurare mezza /etc è un consiglio confrontarsi con lo sviluppatore. Bisogna tener conto delle effettive esigenze del developer: upload (accesso ftp per lo spostamento di file) , directory con permessi di scrittura lato utenza apache (chmod www-data dir ), parametri dimensionali (massimo tempo di esecuzione script), necessità di reloadare servizi (accesso ssh), accettare traffico da e verso determinati ip e porte.
Il bello della configurazione di un server è che ogni volta che ne andrete a creare uno nuovo vi verrà sempre più naturale orientarlo verso sicurezza e performance, ovviamente se avete voglia di imparare e tenervi aggiornati!
Stilata la lista delle necessità dello sviluppatore iniziamo a modificare le configurazioni più “critiche”.
Dividiamo in due rami il nostro compito: network security e file system security, iniziamo a leggere le specifiche e trarre le conclusioni. Il server web ospiterà un cms php/mysql, dovrà essere permesso l’invio di mail, il webmaster dovrà modificare i file della htdocs, e restartare o stoppare apache e mysql. Installiamo una LAMP e phpmyadmin per l’amministrazione del DB, qmail per l’invio delle mail, il demone ssh per permettere “ftp” over SSH (quindi niente proftpd o simili) e la gestione dei demoni (via sudo darete la possibilità all’utente webmaster di compiere quelle determinate operazioni…)
Network security
#netstat -l -n -p -t -u -w Active Internet connections (only servers) Proto Local Address PID/Program name tcp 127.0.0.1:3306 31920/mysqld tcp 192.168.168.168:80 15695/apache tcp 192.168.168.168:22 26850/sshd tcp 127.0.0.1:25 15809/tcpserver
L’elenco delle porte in ascolto sul server, comprende i vari protocolli ma esclude i socket unix (canali di comunicazione fra ad esempio apache e mysql) e qualche colonna poco utile a fini didattici.
#nmap -sS 192.168.168.168 PORT STATE SERVICE 22/tcp open ssh 80/tcp open http
Nmap finished: 1 IP address (1 host up) scanned in 0.578 seconds
Perfetto (siamo ancora sprovvisti di firewall) vengono riconosciute da nmap le porte dei servizi che saranno contattabili dal segmento pubblico e nn solo da localhost: apache sulla 80 e ssh sulla 22
Come fare a disabilitare i servizi di default? Semplicemente commentate le entry relative nei file di configurazione sotto /etc e sotto /etc/init.d per i file di configurazione come quello di qmail. E’ inutile lasciare servizi che non dovranno essere raggiungibili dal mondo esterno in ascolto. Meglio bindarli su localhost. Su Debian date uno sguardo /etc/inetd.conf /etc/init.d/* e /etc/default
IPTABLES
Per completare la nostra configurazione di rete non rimane che scrivere un piccolo firewall da mettere sulla macchina, che rimarrà cmq. in dmz dietro a un altro firewall un po’ più corposo. La politica che preferisco è quella del DROP, check del set di regole e in caso di pacchetto non contemplato loggo e droppo. Loggo cmq. tutti i tentativi di accesso verso ssh, molti cambiano porta per l’accesso ssh ( sempre molta fantasia.. 220,2200,222,2222), tuttavia non sento questa necessità perchè permetto l’accesso solo da determinati IP o classi se dinamici.
#policy in drop
/sbin/iptables -t filter -P INPUT DROP
#loggo tentativi ssh
/sbin/iptables -t filter -A INPUT -p tcp -m state –state NEW –dport 22 -j LOG –log-prefix ***SSH*** –log-level ERR
#permetto in input connessioni già “fidate”
/sbin/iptables -t filter -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
#permetto http da tutti
/sbin/iptables -t filter -A INPUT -p tcp –dport 80 -j ACCEPT
#permetto ssh da client fidati
/sbin/iptables -t filter -A INPUT -s 192.168.168.169 -p tcp –dport 22 -j ACCEPT
/sbin/iptables -t filter -A INPUT -s 45.98.45.98 -p tcp –dport 22 -j ACCEPT
#loggo input con dest non ok
/sbin/iptables -t filter -A INPUT -j LOG –log-level ERR –log-prefix “input: ”
#e droppo
/sbin/iptables -t filter -A INPUT -j DROP
Il firewall da mettere direttamente sul server è abbastanza completo, megli lavorare più massicciamente sul firewall con eth con ip esterno, anche per effettuare analisi sulla rete senza dover disattivarlo ogni volta.
Per salvare le nostre regole
#iptables-save > /root/fw
#chmod 600 /root/fw
ed eventuale restore
iptables-restore < /root/fw oppure crearsi uno script bash iniziando con #!/bin/sh Per quanto riguarda SSH modificate le seguenti entries nelfile /etc/ssh/sshd_config
Port 22 ListenAddress 192.168.168.168 Protocol 2 PermitRootLogin no AllowUsers texilee webmaster
e reload
/etc/init.d/ssh restart
File System
E’ cosa buona non creare una sola partizione / ma suddividere in base alle esigenze il FS in diverse partizioni e montarle in maniera diversa. Le più critiche sono la /tmp e la /var, se nella prima è di moda parcheggiarci rootkit nella seconda il problema può essere causa di DOS per log “impazziti” che nel giro di poco tempo riempiono il filesystem. Appurato che non lanceremo nulla dalla /tmp poichè i nostri script e binari risiedono da tutt’altra parte possiamo impedire a livello di filesystem l’esecuzione di codice dall’interno di tmp modificando il file /etc/fstab in questa maniera
/dev/hda2 /tmp ext3 nodev,nosuid, noexec 0 0
Può capitare (tipico esempio uno dei centinaia bachi di tipo “esecuzione di codice arbitrario” di prodotti php open source) che un attaccante ti sfondi la macchina e parcheggi nella /tmp il suo simpatico rootkit, ti hanno appena modificato ls e netstat e non te ne puoi accorgere se non facendo delle analisi da un’altra macchina messa in eth promiscous mode… tornano utili un paio di tools: samhain chkrootkit
Samhain crea un database con “firme” di file di sistema presenti al momento della esecuzione del tool, record contenenti valori quali data dimensione inode. Il demone controlla periodicamente l’integrità dei file sul FS con le informazioni contenute nel suo DB ed in caso di incongruenza si occupa di mandare una mail all’indirizzo specificato nel file di configurazione. Su Debian apt-get install samhain chkrootkit , i file di configurazione come al solito sotto /etc.
Per concludere trovo estremamente interessante costruire qualche script bash per tracciare quelle situazioni di gravità (disco pieno, troppe connessioni dallo stesso ip, carico di lavoro troppo elevato… argomento di prossimi post ) e l’utilizzo di atsar (apt-get install atsar) per avere uno storico del carico di lavoro e poter rintracciare con facilità nei log i motivi di “sbalzi” particolarmente elevati di carico.
REGEX Espressione regolare controlla e valida indirizzo EMAIL
Espressione regolare per controllare la validità di un indirizzo email, utile per il sanitizing dei form.
/^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+-+)|([A-Za-z0-9]+.+)|([A-Za-z0-9]+++))*[A-Za-z0-9]+@((w+-+)|(w+.))*w{1,63}.[a-zA-Z]{2,6}$/
Apache 1.3 stato dei processi figli script PHP
Apache 1.3 su Unix è un server Web basato su processi. Il programma Apache, al suo avvio, genera (fork) svariati processi figli; con il fork un processo primario genera copie identiche di se stesso, chiamate figli. Ognuno di tali figli può servire una richiesta indipendente dalle altre, con il vantaggio di migliorare la stabilità: se uno di tali figli ha un comportamento anomalo (va fuori controllo o ha perdite di memoria) può essere interrotto senza alcun effetto sugli altri. La stabilità è conseguita a spese delle prestazioni. Nella maggior parte dei sistemi Unix, la creazione di processi e il cambiamento del contesto (assegnazione di tempo del processore a ogni processo) sono operazioni costose in termini di risorse di sistema, dal momento che i processi sono isolati gli uni dagli altri e non possono quindi facilmente condividere codice e dati. [www.pluto.it]
Per controllare lo “stato” di ognuno dei processi figli di apache via php si può utilizzare questo semplice script, la consultazione dello stato dei processi risulta estremamente rapida.
<?php echo "<h3>Apache Forked Status Viewer< /h3>"; $cmd = '/bin/ps --User www-data -o \'%p %C\''; exec($cmd,$status); foreach ($status as $val) echo '<br />'.$val; ?>
JAVASCRIPT Andare a capo alert da variabili PHP
Immaginate di dover mostrare via alert (javascript) il contenuto di una variabile php. Per formattare correttamente l’output potete prendere spunto da questo codice:
$descrizione_JS = ereg_replace("(\r\n|\n|\r)", "\\n'+\n' ", $descrizione); <script language="JavaScript"> <!-- desc='<?=$descrizione_JS?>' if (!confirm(" Conferma l'inserimento o premi annulla per tornare indietro \n\n"+ desc)) { history.back(); } //--> </script>
Workaround php restriction include external files
Questo how-to propone un semplicissimo metodo per raggirare le restrizioni imposte (giustamente) dai fornitori di spazi web php riguardante l’inclusione di file esterni.
La direttiva che inibisce l’inclusione è allow_url_fopen = Off
Viene impostata a livello globale nel file di configurazione di php (php.ini) Mi trovo completamente d’accordo con la politica di Altervista.org che non permette l’inclusione di contenuto non locale via php. Trovo altrettanto giusto informare gli utilizzatori del servizio di hosting gratuito di come si raggira questa restrizione. Per gli utenti Linux non dovrebbero esserci problemi, per gli utenti windows penso seriamente di si 🙂 perciò mi soffermo esclusivamente sulla configurazione Windows
Iniziamo: gli strumenti “necessari” sono tre e nell’ordine
1) http://www.kalab.com/freeware/cron/cron.zip -> permette di eseguire operazioni ad orari e tempi prestabiliti senza intervento umano
2) http://www.interlog.com/~tcharron/wgetwin-1_5_3_1-binary.zip -> permette il download di pagine o file da riga di comando
3) ftp -> client ftp da linea di comando già presente su windows
Su sistemi Linux questi strumenti sono presenti di default, su windows ovviamente no! Scaricateli ed estraete il contenuto degli zip in una directory ad esempio c:\Programmi\cron
Per rendere l’esercitazione più reale prendiamoci come obiettivo la pubblicazione della foto in prima pagina della sezione sport di Repubblica. Oggi 5 giugno 2006 è dedicata al mitico Valentino Rossi fresco vincitore del GP del Mugello. Pagina target da inviare via ftp: http://www.repubblica.it/sport/index.html
Prepariamo lo script per inviare la pagina, chiamatelo cron_repubblica.bat e salvatelo sempre in c:\Programmi\cron
<<<<<<< cron_repubblica.bat >>>>>>>
@echo off
wget -O index_sport_rep.html -o logfile.txt http://www.repubblica.it/sport/index.html echo open texilee.altervista.org> upload.ftp
echo texilee>> upload.ftp
echo password>> upload.ftp
echo cd /_php_script>> upload.ftp
echo del index_sport_rep.html>> upload.ftp
echo put index_sport_rep.html>> upload.ftp
echo quit>> upload.ftp
ftp.exe -v -s:upload.ftp
del upload.ftp
del index_sport_rep.html
<<<<<<</ cron_repubblica.bat >>>>>>>
Collegatevi via ftp al vostro spazio e create la direcotry /_php_script, dopodichè lanciate lo script con doppio click e refreshate la directory appena creata.
Se vi appare una finestrella del firewall di windows con avvertimenti vari riguardo al programmino che cerca di accedere alla rete rispondete con “SBLOCCA”. Ora che abbiamo la nostra paginetta uppata sul nostro spazio non ci rimane che scrivere poche linee di codice per trovare il percorso della foto di Valentino Rossi e automatizzare il tutto.
<<<<<< sport_repubblica.php >>>>>
<? // la var $img_url contiene il percorso della img…
$file = file_get_contents(‘index_sport_rep.html’);
$content = explode (‘<!– start cover –>’,$file);
$content = explode (‘” width=’,$content[1]);
$content = explode (‘src=”‘,$content[0]);
$img_url = “http://www.repubblica.it”.$content[1]; ?>
<img xsrc=”<?=$img_url?>” mce_src=”<?=$img_url?>” />
<<<<<< sport_repubblica.php >>>>>
Salvatelo come sport_repubblica.php e mettetelo nel vostro spazio ftp http://texilee.altervista.org/_php_script/sport_repubblica.php
Ultimo passo automatizzare la procedura: cron. Aprite il file “crontab” nella directory c:\Programmi\cron con un editor qualsiasi e commentate le entries di esempio. Aggiungete quella relativa al nostro script.
49 10 * * * c:\Programmi\cron\cron_repubblica.bat
Ogni giorno alle ore 10:49 del mattino verrà eseguito il nostro script. Se volete cambiare orario il primo il formato è * * * * * dove il primo * indica il minuto , il secondo * l’ora.
Se volete farlo eseguire a mezzanotte
0 0 * * * c:\Programmi\cron\cron_repubblica.bat
Se volete una volta ogni mezzora
0,30 * * * * c:\Programmi\cron\cron_repubblica.bat
Copiate un collegamento a cron.exe in Esecuzione Automatica in modo da farlo ripartire ad ogni riavvio.
phpMyAdmin was unable to read your configuration file!
Mi è capitato, dopo un aggiornamento di phpmyadmin su Sarge di trovarmi di fronte a questo errore. La macchina client che utilizzo è spesso e volentieri customizzata secondo le esigenze del momento.
Questo è il simpatico errore…
phpMyAdmin – Error
phpMyAdmin was unable to read your configuration file!
This might happen if PHP finds a parse error in it or PHP cannot find the file.
Please call the configuration file directly using the link below and
read the PHP error message(s) that you receive. In most cases a quote
or a semicolon is missing somewhere.
If you receive a blank page, everything is fine.
Dopo un quarto d’ora di sclero finalmente capisco di cosa si trattava: una impostazione del php.ini impostata ad On per motivi di testing…
magic_quotes_runtime = Off