buonasera a tutti.

Ho realizzato un applicazione MVC5/asp net/razor/C#.

ho generato alcuni link associati ad "href buttons" con parametri crittografati nell URL.

ad esempio i parametri 30 e 31 e 45 li passo come 30|31|45 (crittografati nel parametro DBBMz7%2fiWHrEqi4BUJlgyg%3d%3d).

Poi passo il parametro crittografato nel link alla pagina di destinazione.

Nella action di destinazione ritraduco in chiaro i valori.

ad esempio un link:

http://192.xxx.x.x:3030/website/builder/imagesupdate/DBBMz7%2fiWHrEqi4BUJlgyg%3d%3d

Quando però apro il link anziche entrare nella relativa ACTION mi viene scatenato un errore IIS 10

HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.


la cosa curiosa è che con alcuni link crittografati funziona con altri va in errore.

Premetto che faccio il corretto encoding e decoding delle stringhe prima e dopo la crittografia.

Ho cercato a lungo sull'web ma non ho trovato una soluzione funzionante.

grazie

Filippo
10.904 messaggi dal 09 febbraio 2002
Contributi
Ciao Filippo,
puoi far vedere come è configurata la tua route?


la cosa curiosa è che con alcuni link crittografati funziona con altri va in errore.

Per caso hai messo un constraint su id che potrebbe giustificare questo comportamento?

ciao,
Moreno

Enjoy learning and just keep making
Ciao Moreno.

Ho fatto alcune prove.

Il problema sta nei caratteri presenti nel parametro crittografato !.

Se gli passo il parametro d0ZhavSzXOsdZxujNFae%2fQ%3d%3d

IIS restituisce la pagina di errore HTTP Error 404.0 - Not Found

Se (tanto per provare) sostituisco il carattere % con uno qualsiasi as esempio:

d0ZhavSzXOsdZxujNFaeX2fQX3dX3d (X al posto di %)

Funziona !

ovviamente la pagina ASP va in "An unhandled exception ..." perchè la stringa è "corrotta" ma questo è corretto.

Quindi IIS NON "sopporta" il carattere % nella stringa di parametro.

A questo punto come si fa in modo che IIS "capisca" che il carattere % è normale nel parametro passato ?

Filippo
10.904 messaggi dal 09 febbraio 2002
Contributi
Ciao,
penso che il problema non sia tanto il %, quanto la combinazione di caratteri %2f che è uno / codificato per essere passato in un url. Può darsi che il modulo di routing stia interpretando il %2f come uno slash effettivo, il che cambierebbe il tuo url così:

website/builder/imagesupdate/DBBMz7/fiWHrEqi4BUJlgyg%3d%3d

Come vedi c'è uno slash in mezzo al codice, il che produce un errore 404 perché non c'è alcuna route che ammette quel segmento in più dopo lo slash.

Quindi, per verificarlo ti chiederei di provare con dei codici che NON contengono la sequenza %2f e invece contengono %3d (che rappresenta il carattere = usato come padding al termine delle stringhe codificate in base64). Senza il %2f dovrebbe funzionare.

Soluzione 1: sposta il codice in querystring. Non saranno necessarie altre modifiche.
website/builder/imagesupdate?id=d0ZhavSzXOsdZxujNFae%2fQ%3d%3d


Oppure, soluzione 2: usa una variante del base64 che produce stringhe che possono essere usate negli url. Leggi qui:
https://it.wikipedia.org/wiki/Base64#Varianti
In pratica, dopo aver prodotto la stringa bases64, sostituisci tutte le occorrenze del carattere + con il carattere -, e tutte le occorrenze di / con il carattere _. Poi, prima di decodificare la stringa base64, ripristina i caratteri originali.

Ti consiglio la soluzione1 che è più rapida e comporta meno modifiche.

Comunque, qual è il motivo per cui devi passare stringhe cifrate nell'url?

ciao,
Moreno
Modificato da BrightSoul il 10 marzo 2018 11.02 -

Enjoy learning and just keep making
Ciao,

Innanzitutto ti ringrazio per l'aiuto che è stato chiarificatore e risolutivo.

Adesso funziona perfettamente.

In merito alla tua domanda qual è il motivo per cui devi passare stringhe cifrate nell'url?

lo faccio (non sempre) per 2 motivi

1) quando devo mettere informazioni sensibili nella stringa

2) quando non voglio che un utente possa scrivere nei parametri valori a caso con tutti i potenziali problemi (ho fatto in modo che, se modifichi il parametro crittografato anche di un solo carattere, il codice sottostante vada "in errore").

Tra l'altro vorrei evitare di passare i parametri in "ALTO" nell'url.

Li vorrei scrivere in una variabile di sessione o in un cookie ma mi sembra di capire che non è la via migliore (o corretta) per scambiare parametri tra le pagine.

Qualsiasi tuo suggerimento sarebbe prezioso !

grazie ancora.

Filippo.
10.904 messaggi dal 09 febbraio 2002
Contributi
Ciao Filippo,
ok, bene.


Li vorrei scrivere in una variabile di sessione o in un cookie ma mi sembra di capire che non è la via migliore (o corretta) per scambiare parametri tra le pagine.

dipende nello specifico di che dati si tratta.
Di solito non è un problema che i dati siano passati nell'url. Anche se l'utente dovesse modificarli a piacimento, l'applicazione dovrebbe sempre avere una validazione lato server che gli impedisca di accedere a dati non propri.

Supponiamo che io stia visualizzando l'ordine con id=451, che ho inviato io.
/ordini/detail/451


Se anche sostituissi l'id in questo modo:
/ordini/detail/450

...non sarebbe un problema perché l'applicazione non mi dovrebbe permettere di visualizzare l'ordine con id=450, dato che era stato inviato da un altro utente.
In pratica, l'applicazione non deve mai fidarsi dell'input dell'utente e quindi deve verificare che l'ordine richiesto sia effettivamente visualizzabile dall'utente, prima di mostrarglielo nella pagina.

Chiedevo come mai stavi cifrando i dati in querystring perché non vorrei che tu stia trascurando la parte di validazione lato server.

ciao e buona domenica,
Moreno
Modificato da BrightSoul il 11 marzo 2018 08.44 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.