Gå til innhold

Fjerne kode fra innlegg i gjestebok


Anbefalte innlegg

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
Videoannonse
Annonse

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 av Torbjørn
Lenke til kommentar

Mye gode forslag der :D

Takker så mye :p 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 av Jonhoo
Lenke til kommentar

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

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 av trtrtr
Lenke til kommentar

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

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

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å.. :p

Side: www.quote.moo.no

Source: http://jonhoo.web.surftown.nu/quotessource.txt

Lenke til kommentar

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
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å.. :p

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
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...