Jonhoo Skrevet 2. desember 2005 Del Skrevet 2. desember 2005 Heisann jeg har nettopp programmert min egen gjestebok i Perl/CGI, men må få på plass et eller annet filter for å hindre brukere å legge inn innlegg med HTML kode... Vet at det finnes en egen funksjon som gør dette i PHP, men finnes det noen lik funksjon for Perl? Jeg kunne jo kanskje brukt et general statement: s/<.+>/<-- Kode -->/ på hver linje i hvert innlegg for å fjerne alle tags, men dette ville vel kanskje ikke fungere på ønsket måte? Jon Lenke til kommentar
Torbjørn Skrevet 6. desember 2005 Del Skrevet 6. desember 2005 se på denne modulen: http://search.cpan.org/~kilinrax/HTML-Strip-1.04/Strip.pm Lenke til kommentar
Jonhoo Skrevet 6. desember 2005 Forfatter Del Skrevet 6. desember 2005 Jeg fikk det til ved å bruke s/<.+>// Fjerner ALLE tags http://jonhoo.web.surftown.nu/cgi-bin/gjestebok Lenke til kommentar
Torbjørn Skrevet 6. desember 2005 Del Skrevet 6. desember 2005 (endret) den fjerner også det du har i mellom taggene EDIT: slett mitt innlegg i din gjestebok Endret 6. desember 2005 av Torbjørn Lenke til kommentar
Jonhoo Skrevet 6. desember 2005 Forfatter Del Skrevet 6. desember 2005 Ja, men det er jo hele poenget... Man kan med andre ord ikke bruke tags på noen måte Lenke til kommentar
Jonhoo Skrevet 6. desember 2005 Forfatter Del Skrevet 6. desember 2005 BTW, hvis du vil ha source, så bare spør. Hvis noen andre ser igjennom så ser de kanskje feil og sikkerhetsmangler som jeg ikke har fått med meg.. All koden er kommentert godt Lenke til kommentar
Torbjørn Skrevet 6. desember 2005 Del Skrevet 6. desember 2005 paste her hvis det ikke er 20 sider Lenke til kommentar
Jonhoo Skrevet 6. desember 2005 Forfatter Del Skrevet 6. desember 2005 (endret) Prøvde, men det er for mye.. Legger kildekoden på http://jonhoo.web.surftown.nu/gjesteboksource.txt Endret 6. desember 2005 av Jonhoo Lenke til kommentar
Torbjørn Skrevet 6. desember 2005 Del Skrevet 6. desember 2005 (endret) Jeg tok med den frihet å lage noen kommentarer, arrester meg gjerne: for $_ ( <DATA> ) { # $_ er overflødig (implisitt $_ i denne sammehnegen). Ellers vanlig med: while(<DATA>){ og "chomp;" et eller annet sted i løkka. $fields[$i-1] = $cgi->param('input_'.$i); # hvis du kaller alle inputs med samme navn, f.eks <input name="something"> kan du gjøre: @fields = $cgi->param( 'something' ); # har du ellers sett funksjonen Vars() i CGI? @fields[1];# er bortkastede ressurser $fields[1]; # er bedre $num=0; #Kopierer alle innleggene i txt filen over i en array for $_ (<DATA>) { @data[$num] = $_; $num++; } close DATA; # her kan du enkelt gjøre: open DATA, ...; # med filnavn @data = <DATA>; close DATA; #Skriver alle de gamle postene så de nyeste kommer først foreach $post (@data) { print DATA "$post"; } close DATA; } her kan du enkelt gjøre: open... print DATA @data; close DATA; # ser at du har et selvkomponert templatsystem: s{<!-- database_results -->}{$database_results}; # vurder å f.eks istedet bruke HTML::Template, du lærer fort å like den! Men det aller verste: use strict; # !!alltid!! # gjerne også use warnings; EDIT: kom på en ting til, "File::Slurp" er fin for å lese filer. EDIT2: Ser du har et selvkomponert system for å lagre informasjon, med dine egne skilletegn, har du vurdert XML istedet? Eller SQLite? hva om noen poster et innlegg som inneholder ## eller ££ eller noe slikt? Endret 6. desember 2005 av Torbjørn Lenke til kommentar
Jonhoo Skrevet 7. desember 2005 Forfatter Del Skrevet 7. desember 2005 (endret) Mye gode forslag der Takker så mye Er ikke så god på Perl og CGI enda så alle forslag blir godt tatt i mot 1) # hvis du kaller alle inputs med samme navn, f.eks <input name="something"> kan du gjøre: @fields = $cgi->param( 'something' ); # har du ellers sett funksjonen Vars() i CGI? ? 2) # ser at du har et selvkomponert templatsystem:s{<!-- database_results -->}{$database_results}; # vurder å f.eks istedet bruke HTML::Template, du lærer fort å like den! Hvordan fungerer det? 3) File::Slurp? 4) Ser du har et selvkomponert system for å lagre informasjon, med dine egne skilletegn, har du vurdert XML istedet? Eller SQLite? hva om noen poster et innlegg som inneholder ## eller ££ eller noe slikt? Jeg er som sagt ikke spesielt god i hverken Perl eller CGI enda, men jeg ser poenget ditt Har sett det jeg og, men visste ikke hvordan jeg skulle fikse på det... Hvordan bruker jeg XML/SQLite til dette? Takk forresten Jon Endret 7. desember 2005 av Jonhoo Lenke til kommentar
Torbjørn Skrevet 9. desember 2005 Del Skrevet 9. desember 2005 Hei, forumet markerte denne som lest selv etter ditt svar, så fikk ikke dette med meg før nå! 1) hvis du kaller alle dine <inputs> som du vil ha i en liste med samme navn kan du enkelt putte dem i en array, f.eks: <form method="post"> Hvilke biler liker du: <input type="checkbox" name="car" value="audi"> Audi <br/> <input type="checkbox" name="car" value="saab"> Saab <br/> <input type="checkbox" name="car" value="volvo"> Volvo <br/> <input type="checkbox" name="car" value="lada"> Lada <br/> <input type="checkbox" name="car" value="subaru"> Subaru <br/> <input type="submit" value="send"> </form> -- og i perl: $cgi = new CGI; ## alle biler valgt: my @cars = $cgi->param('car'); 2) og 3) CPAN er din venn: http://search.cpan.org søk opp HTML::Template og File::Slurp, eller klikk her: http://search.cpan.org/~uri/File-Slurp-999...b/File/Slurp.pm http://search.cpan.org/~samtregar/HTML-Tem...2.7/Template.pm 4) XML og SQLite er generelle begreper som ikke er knyttet til perl eller cgi. XML vil i enkelhet si at du lagrer dine data som tags. f.eks slik: <gjestebok> <innlegg> <forfatter> Truls </forfatter> <emne> Hei på deg </emne> <melding> Hei, hvordan går det?? kul gjestebok </melding> </innlegg> <innlegg> .... annet innlegg med tags </innlegg> </gjestebok> Dette kan se tungvindt ut, men fordelen er at XML er standardisert og det finnes allerede ferdiglagede metoder for enkelt og robust å håndtere dette, søk bare etter XML på http://search.cpan.org ! SQLite krever at du kan SQL, som er et database-spørring språk. Du vil i en SQLite database (som er en fil) f.eks ha en tabell som heter "gjestebok", i denne tabellen har du feltene "forfatter", "emne" og "melding", en spørring for å sette inn data i denne kan se slik ut: insert into gjestebok (forfatter,emne,melding) valuse ("Truls", "Hei på deg", "hei, kul gjestebok!"); for å hente ut brukse select syntaks: select emne, forfatter,melding from gjestebok; dette blir mye å sette seg inn i, men det er som å sykle, har du først lært det... SQL er også meget standardisert og meget utbredt. Fordelen med begge disse, er at du slipper å bry deg med ting som rekkefølger i din fil, skilletegn og andre formaliteter. Spør gjerne hvis det er noe mer du lurer på rundt dette! Lenke til kommentar
trtrtr Skrevet 10. desember 2005 Del Skrevet 10. desember 2005 (endret) Heisann, en annen kjapp måte å lagre data på om du ikke vil igang med XML eller database er å bruke Data::Dumper modul som muligjør at hash kan dumpes ut på disk og enkelt leses inn igjen. Eksempel: use Data::Dumper; #Last hash fil fra disk ved oppstart i script, når data skal #skrives ut, OG rett før du skal lagre også, slik at du får #sync'et med evnt. andre poster som kan være lagt inn #mens bruker har skrevet inn kommentar. my $HashRef = do $HashFile if (-e $HashFile); #Sjekk at hash virkelig ble lastet..hvis ikke sett #opp en ny tom hash. $HashRef = {} if (ref $HashRef ne "HASH"); #Lagre data i hash. #Merk at vi benytter to dimensjonal hash #her slik at vi slipper noen "lure" template systemer. #Først henter vi key hvor siste post ble #lagret og øker med 1 for ny post my $Key = $HashRef->{LastIndex}+1; #Deretter er det bare å stuffe inn data som #vi ønsker å lagre. $HashRef->{$Key}{IP} = $cgi->remote_host(); $HashRef->{$Key}{Innlegg} = "hei hei"; $HashRef->{$Key}{Forfatter} = "trtrtr"; $HashRef->{$Key}{Dato} = localtime(); ... ... #Tilslutt..lagre hash til disk vha Dumper #methoden fra Data::Dumper if (open OUT, ">", $HashRef) { print OUT Dumper $HashRef; close OUT; } Gjentstår så å redigere inn disse bitene til å passe sammen med logikken i ditt eget script. Utfordringen her er (kanskje) bruken av referanser ($HashRef). Du kommer ikke unna referanser om du skal kode i perl, så lær det først som sist. Ta også en titt på escapeHTML() funksjonen i CGI-modulen i forbindelse med ditt spørsmål om å fjerne HTML-kode fra gjestebok-innlegg: You should call escapeHTML() yourself on untrusted data in order to protect your pages against nasty tricks that people may enter into guestbooks, etc.. Endret 13. desember 2005 av trtrtr Lenke til kommentar
Jonhoo Skrevet 10. desember 2005 Forfatter Del Skrevet 10. desember 2005 Hei igjen 1) Men jeg bruker ikke checkboxes, jeg bruker tekstsfelt med navnene input_1, input_2 osv... 2) Hvorfor skal jeg bruke File::Slurp? Hvilke fordeler har det over den jeg nå bruker (Altså en foreach loop) 3) Jeg kan ikke bruke HTML::Template fordi det ikke er installert på serveren Jeg bruker surftown.nu.. 4) Så hvordan kan jeg bruke XML til å skrive/lese denne gjesteboken? Jeg skønte ikke det helt Jon Lenke til kommentar
Torbjørn Skrevet 10. desember 2005 Del Skrevet 10. desember 2005 Fint at du spør! 1) ditt cgi-skript kan ikke se forskjell på checkbokser og vanlige tekstinput. samme regel gjelder altså også for tekstfelt. poenget er at hvis du likevel skal dytte 4 tekstfelt inn i samme array, kan du like gjerne gi dem samme navn i form'en, istedet for å drive en mer kompleks nummerering slik du gjør. uten at det er noen stor sak, men det hørte med å nevne. 2) tatt fra CPAN: "They (metodene i modulen) are designed to be simple to use, have flexible ways to pass in or get the file contents and to be very efficient" I ditt relativt enkle tilfelle (en flat databasefil) har det sannsynligvis liten eller ingen merkbar effekt. Men jeg har gått over til å konsekvent bruke File::Slurp for å lese inn filer med mindre de er så store at jeg må ta dem linje for linje. 3) Det var synd, du kan kanskje sende en melding til dem og høre om du kan få denne installert? å installere slike moduler er gjor i en håndvending. 4) Lek litt med XML på egen hånd først, så du ikke ødelegger gjesteboken. Jeg skal se om jeg kan komme opp med et enkelt eksempel med XML::Simple (se om du har denne modulen installert på webserveren!) Lenke til kommentar
Jonhoo Skrevet 10. desember 2005 Forfatter Del Skrevet 10. desember 2005 1) Så stregt tatt så vil det ikke være noe poeng å bruke dette i mitt script? 2) Så nok en gang, ikke nødvendig for mitt bruk? 3) Jeg så på det, og det virket jo faktisk ganske smart 4) Har du noen gode guider på XML? Og hvordan kan jeg få testet om serveren støtter XML::Simple? Takk for hjelpen Jon PS: Jeg har nå også laget et CGI script som henter et tilfeldig sitat fra en tekstfil med sitater som jeg har spart opp over et par år nå.. Side: www.quote.moo.no Source: http://jonhoo.web.surftown.nu/quotessource.txt Lenke til kommentar
Torbjørn Skrevet 10. desember 2005 Del Skrevet 10. desember 2005 Jeg vet ikke om jeg uten videre vil la meg avfeie av at det ikke er noe poeng - ditt opprinnelige script virket som det skulle, dette er mer forslag og utfyllende kommentarer! 1) du klarer å legge dine 4 inputfelter i en array, men ved en noe omstendelig nummerering (som selvsagt fungerer), min forenklende kommentar var bare at siden du likevel skal legge disse 4 feltene i et array, kan du like gjerne gi dem samme navn til å begynne med, og dermed lettere få dem inn i arrayet 2) det er mer en god vane! en eller annen gang kommer du til et tidspunkt der det vil lønne seg. XML er opphauset. Det er så kjempeenkelt som det ser ut som selvom alle snakker om det med store ord. google litt etter XML::Simple ting og lese her er en god start: http://search.cpan.org/~grantm/XML-Simple-...b/XML/Simple.pm jeg skal se om jeg kan komme opp med en demonstrasjonskode. merk at datastrukturen som XML::Simple gir deg er noe innfløkt Lenke til kommentar
Jonhoo Skrevet 10. desember 2005 Forfatter Del Skrevet 10. desember 2005 Nok en gang, takk så mye for hjelp 1) er nå tatt i bruk Jeg leste litt på dokumentasjonen til File::Slurp, men må innrømme at jeg skjønte ikke stort.. Demonstrasjonskode hadde vært konge Lenke til kommentar
Torbjørn Skrevet 10. desember 2005 Del Skrevet 10. desember 2005 PS: Jeg har nå også laget et CGI script som henter et tilfeldig sitat fra en tekstfil med sitater som jeg har spart opp over et par år nå.. Side: www.quote.moo.no Source: http://jonhoo.web.surftown.nu/quotessource.txt 5277582[/snapback] jeg tar meg den frihet og lirer av meg litt besserwissen her og Du har: if ( grep /$currentIP/, @IPs ) {} else { open IPout, ">>../IP.txt" or die "Kan ikke aapne IP fil"; print IPout "$currentIP\n"; close IPout; } en tom blokk etter if() ser litt snodig ut, et forslag: unless( grep /^\Q$currentIP\E$/, @IPs ){ unless() er det samme som if( ! ( ) ) ved å legge inn ^og $ i din regexp matcher du fra start til slutt hvis ikke vil 192.168.1.1 matche 192.168.1.101 \Q gjør at det ikke tolkes meta chars i din regex (f.eks punktum!) Ser ellers at du bruker qq operatoren, hvilket er bra (du skjenner sikkert forskjellen på q og qq) Kan være et poeng og også se på printf (eller sprintf) funksjonen, selvom det ikke er noen grunn til å gjøre dette annerledes. Også bra at du bruker use strict - jeg tar ikke i software som ikke har denne Lenke til kommentar
Jonhoo Skrevet 10. desember 2005 Forfatter Del Skrevet 10. desember 2005 Takker og bukker, endringer gjort Forskjellen på qq og q? Nei, kjente ikke til q jeg.. Hva gjør \E på slutten i regex? PS: Ser frem til XML demo Jon Lenke til kommentar
Torbjørn Skrevet 10. desember 2005 Del Skrevet 10. desember 2005 Nok en gang, takk så mye for hjelp 1) er nå tatt i bruk Jeg leste litt på dokumentasjonen til File::Slurp, men må innrømme at jeg skjønte ikke stort.. Demonstrasjonskode hadde vært konge 5277680[/snapback] ah, skjønner f.eks slik: use File::Slurp; # vil bl.a. gi deg funksjonen read_file my @lines_from_file = read_file( "filnavn" ); # kan også brukes slik, hvis du noen gang skulle trenge det: # ( vil gi deg hele innholdet i en streng ) my $file_contents = read_file( "filnavn" ); Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå