PDA

Visualizza la versione completa : FormMail.pl e redirect a links dinamici


svedish
14-03-2007, 19:23
Ciao ragazzi,

questo e' il mio primo post in quest' area. Siate pazienti :)

Volevo sapere una piccola cosa. Si possono usare links dinamici come redirect di FormMail.pl?
Sto provado, ma sia se metto una bella & nel mio URL, sia se ci metto andamp; FormMail prova sempre ad accedere a

pagina.php?area=1andamp;page=34

che ovviamente non porta da nessuna parte (beh, nel mio caso alla home, ma solo per una routine di controllo mia).

Grazie mille per il vostro tempo
Spero che ci sia qualcuno disposto a darmi un consiglio.
Ciao :ciauz:

P.S. Avrete capito che ho scritto andamp; per esteso perche' l'entita' HTML veniva tradotta in una & anche qui sul post.

shishii
15-03-2007, 20:33
sinceramente non ti ho capito. Potresti spiegarti meglio?

svedish
17-03-2007, 14:17
Ciao Marco,

grazie della risposta prima di ogni altra cosa.

Dunque, le cose stanno cosi'...

Sto usando FormMail.pl per permettere alle persone di inviare email da un sito. Cosa che ho sempre fatto. Sto usando redirect e missing_fields_redirect come campi hidden. Anche qui, sempre fatto. Stavolta pero' gli URL dei due campi non sono statici, ma sono dinamici (del tipo http://www.miosito.com/main.php?area=forms&page=form_ok Oppure http://www.miosito.com/main.php?area=forms&page=form_ko).

Quando testo il form la email parte (o non parte perche' non riempio dei campi apposta) e FormMail funziona, solo che per un attimo vedo l'URL che prova a caricare e fallisce perche' la e commerciale la traduce nella rispettiva entita' HTML(ecommerciale amp punto e virgola). Dunque il link non esiste.

Ora ho guardato dentro FormMail.pl e ho trovato il pezzo che causa cio'.



# This function will convert <, >, & and " to their HTML equivalents. #
sub clean_html {
local $value = $_[0];
$value =~ s/\&/\&amp;/g;
(omissis...)


Pero' ho anche pensato: "se quel pezzo sta' li', ci sara' pure una ragione di sicurezza". E siccome non capisco molto di hacking e come il mio form puo' essere attaccato, non so se e' saggio rimuovere la stringa di FormMail o commentarla per far funzionare la cosa e magari indebolire la sicurezza dei miei forms, che sarebbero esposti a...non so nemmeno cosa! :)

Spero di essere stato piu' chiaro adesso. Fammi sapere se c'e' qualche altra info che posso aggiungere.
Mille grazie

shishii
17-03-2007, 16:59
penso che stai usando una versione modificata del FormMail.pl originale, perchè in questa quella subroutine non esite.

Posta tutto il codice della subroutine cioè quello tra

sub clear_html {

e

}

e il codice che chiama la subroutine, ad esempio:

$qualcosa = &clear_html(altro);

svedish
17-03-2007, 17:20
Ciao Marco,

dunque la subroutine e' la seguente:



# This function will convert <, >, & and " to their HTML equivalents. #
sub clean_html {
local $value = $_[0];
$value =~ s/\&/\&amp;/g;
$value =~ s/</\&lt;/g;
$value =~ s/>/\&gt;/g;
$value =~ s/"/\&quot;/g;
return $value;
}


per quanto riguarda il punto in cui clean_html viene chiamato ce ne sono diversi, di cui credo che l'ultimo e' quello che mi riguarda.

qui...



# Now that we have finished using form values for any e-mail related #
# reasons, we will convert all of the form fields and config values #
# to remove any cross-site scripting security holes. #
local($field);
foreach $field (keys %Config) {
$safeConfig{$field} = &clean_html($Config{$field});
}

foreach $field (keys %Form) {
$Form{$field} = &clean_html($Form{$field});
}


qui...



# For each sorted field, if it has a value or the print blank #
# fields option is turned on print the form field and value. #
foreach $sorted_field (@sorted_fields) {
local $sfname = &clean_html($sorted_field);


qui...



# For each form field, if it has a value or the print blank #
# fields option is turned on print the form field and value. #
foreach $field (@Field_Order) {
local $fname = &clean_html($field);


qui...



if ($error eq 'bad_referer') {
if ($ENV{'HTTP_REFERER'} =~ m|^https?://([\w\.]+)|i) {
$host = $1;
my $referer = &clean_html($ENV{'HTTP_REFERER'});
print <<"(END ERROR HTML)";


infine qui...



elsif ($error eq 'missing_fields') {
if ($Config{'missing_fields_redirect'}) {
print "Location: " . &clean_html($Config{'missing_fields_redirect'}) . "\n\n";
}
else {
foreach $missing_field (@error_fields) {
$missing_field_list .= " " . &clean_html($missing_field) . "\n";
}

print <<"(END ERROR HTML)";




La versione di FormMail e' la 1.92 e io non ho mai modificato lo script. Tuttavia sta nella cgi-bin da una vita e serve appunto anche altri siti. Non so dove la presi all'epoca ed e' possibile che qualche collega/amico/server admin l'abbia toccato...chi sa...
Se vuoi dare un occhiata all'intero script posso postare un link.

Grazie

shishii
17-03-2007, 17:43
Scusa avevi ragione... ero io che ho gurdato una versione precedente.

Comunque hai due modi per risolvere:

1- quello corretto poichè segue lo standard stabilito dal W3C e cioè usare come separatore dei campi GET ";" invece di "&", ad esempio:

index.php?id=10;pag=2

invece di:

index.php?id=10&pag=2

se il tuo server è settato correttamente non avrai problemi.

2- se ciò non possibile modifica il seguente codice:



sub return_html {
# Local variables used in this subroutine initialized. #
local($key,$sort_order,$sorted_field);

# Now that we have finished using form values for any e-mail related #
# reasons, we will convert all of the form fields and config values #
# to remove any cross-site scripting security holes. #
local($field);
foreach $field (keys %Config) {
$safeConfig{$field} = &clean_html($Config{$field});
}

foreach $field (keys %Form) {
$Form{$field} = &clean_html($Form{$field});
}


# If redirect option is used, print the redirectional location header. #
if ($Config{'redirect'}) {
print "Location: $safeConfig{'redirect'}\n\n";
}



in questo modo:



sub return_html {
# Local variables used in this subroutine initialized. #
local($key,$sort_order,$sorted_field);

# Now that we have finished using form values for any e-mail related #
# reasons, we will convert all of the form fields and config values #
# to remove any cross-site scripting security holes. #
local($field);
foreach $field (keys %Config) {
next if ($field eq "redirect");
$safeConfig{$field} = &clean_html($Config{$field});
}

foreach $field (keys %Form) {
$Form{$field} = &clean_html($Form{$field});
}


# If redirect option is used, print the redirectional location header. #
if ($Config{'redirect'}) {
print "Location: $safeConfig{'redirect'}\n\n";
}

svedish
17-03-2007, 17:57
Mille grazie Marco! :)
Apprezzo il tuo aiuto.

Una domanda.
Se dovessi evitare per ora di agire sul server (perche' ho una deadline e non mi resta molto tempo), credi che cambiare il codice del FormMail come mi hai indicato, non ne compromette la sicurezza?

Grazie

shishii
17-03-2007, 18:15
ritengo che quella modifica, limitata solo all'indirizzo di redirect, non possa causare perticolari problemi.

svedish
17-03-2007, 18:33
Bene,

faro' una prova asap.
Grazie mille per tutto l'aiuto! :)

Loading