[VBScript/ASP] Filename part in URL encoden/escapen

Pagina: 1
Acties:

  • Justice
  • Registratie: Maart 2001
  • Laatst online: 07-08-2025
Gebruikers kunnen bij een site bestanden uploaden, deze worden dan weergeven als links op de site. Nu hebben de bestanden een naam met non-ascii characters bijvoorbeeld:
code:
1
B & B - blabla.doc
De bestanden kunnen niet gedownload worden. Standaard antwoord: escapen /encoden die handel.

Echter met VBscript wil geen methode werken:

Server.URLEncode
Dit lijkt mij de algemeen geaccepteerde methode om url's te encoden :+ Echter bij bestandsnamen werkt dit niet omdat (volgens mij)de door plustekens vervangen spaties ervoor zorgen dat het bestand niet gevonden kan worden. Het kan ook zo zijn dat hij stukloopt op de ampersand. (uitgebreide testcase wijst uit dat het de spaties zijn) Hoort dit? Waarom is dit zo? Is dit een foute configuratie van onze server? edit: test wijst uit dat dit werkt voor querystrings maar niet bestandsnamen.

VbScript's Escape() functie
Verder gezocht, ik kan de bestandsnaam escapen met deze functie. Echter het lijkt erop alsof de ampersand (vervangen door %26) niet geaccepteerd wordt, want het bestand kan niet gevonden worden. edit: testen wijst uit dat & de boosdoener is. Hoort dit? Waarom?

Replace
code:
1
Replace(str," ","%20)

Erg Ranzig en wil ik dus niet gebruiken. Ook niet te maintainen natuurlijk

Kortom
Ik mis blijkbaar de goede manier om een bestandsnaam met spaties en ampersands goed te kunnen weergeven. Enig idee wat er fout gaat? Google vindt allemaal voorbeelden met 1 van deze 3 methodes. Ik zal wel iets stoms doen.

Is een ampersand character illegaal? Waarom mekkert Windows daar dan niet over? Na wat zoekwerk blijkt de ampersand onder NTFS legaal is als onderdeel van een bestandsnaam, dus ik kan het filesystem wel uitsluiten.

Testcase
http://www.angus.ac.uk/test/url/ (na aanpassingen in de configuratie werken alle voorbeelden nu wel)

[ Voor 25% gewijzigd door Justice op 02-05-2006 11:29 ]

Human Bobby


  • Blue-eagle
  • Registratie: September 2000
  • Niet online
Als ik het op mijn locale server probeer werkt het gewoon, hoor. :) Ook op een company server werkt het naar behoren. Wat je nog zou kunnen proberen is dit misschien?
code:
1
<li><a href="this &amp; file.txt">Regular</a></li>
Wat voor server software gebruik je? ISAPI filters misschien?

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:32

crisp

Devver

Pixelated

PHP heeft daarvoor rawurlencode() die itt urlencode() wel conform RFC 1738 is. Een spatie dient vervangen te worden door %20 en een ampersand door %26, je voorbeeld komt er dus zo uit te zien:
code:
1
B%20%26%20B%20-%20blabla.doc

Dat zou moeten werken (eventuele browser-specifieke issues daargelaten).

Escape() lijkt gezien je voorbeelden te doen wat het moet doen; ik zal eens een browser-test erop los laten :)

edit: ik zie geen issues in IE of Firefox

[ Voor 6% gewijzigd door crisp op 29-04-2006 02:24 ]

Intentionally left blank


  • Justice
  • Registratie: Maart 2001
  • Laatst online: 07-08-2025
Op de een of andere manier werkt de link niet op onze server zelfs als een ampersand door %26 vervangen wordt. Enig idee dan waardoor dit kan komen? De server draait Windows 2000 Advanced Server / IIS 5.0 / ASP (.NET 1.5 en 2 ook installed)

edit: inderdaad werkt de testpagina perfect met onze testserver die draait op windows 2003 met IIS 6
edit2: Na meer zoekwerk blijkt het een specifiek probleem te zijn van Windows 2000. Zie hier en hier. Als ik een oplossing vindt dan post ik hem hieronder.

IS 5.0 Does Not Correctly Process Escape Characters in a URI

[ Voor 65% gewijzigd door Justice op 02-05-2006 10:25 ]

Human Bobby


  • Justice
  • Registratie: Maart 2001
  • Laatst online: 07-08-2025
Okay het 'probleem' is URLSCAN, wiens standaard configuratie geen ampersands en % toelaat in URLs.
.. ; Don't allow directory traversals
./ ; Don't allow trailing dot on a directory name
\ ; Don't allow backslashes in URL
: ; Don't allow alternate stream access
% ; Don't allow escaping after normalization
& ; Don't allow multiple CGI processes to run on a single request
, zelfs niet als ze geescaped zijn, vanwege security. Ik zal dus eens verder zoeken of ik bepaalde escaped chars wel kan toelaten zonder de security te ondermijnen. URLScan werkt standaard na het normalisatieproces, wat betekend dat %26 unescaped wordt naar & en daarna rejected wordt.

IIg bedankt voor de help.

[ Voor 13% gewijzigd door Justice op 02-05-2006 11:11 ]

Human Bobby