Olen uudistamassa sivustoani, ja otan url-osoitteissa käyttöön ääkköset ja muut kirjaimet, jotka olen aiemmin muuttanut toiseen muotoon (esim. ä → a, ß → ss).
1) Onko niin, että jos teen linkin osoitteeseen /ääkkösiä-ja-ß
, erikoismerkit pitää koodittaa:
<a href="/%C3%A4%C3%A4kk%C3%B6si%C3%A4-ja-%C3%9F">Ääkkösiä ja ß</a>
(Luulen, että niin on. Sellaisen vaikutelman saa googlettamalla.)
Vai kelpaako tämä:
<a href="/ääkkösiä-ja-ß">Ääkkösiä ja ß</a>
2) HTML5:ssä id:eiden merkkivalikoima on aiempaa laajempi, ja ääkkösiä voi siis käyttää. Täytyykö url-osoitteen #-merkin jälkeisen osan (fragment identifier) erikoismerkit koodittaa, vai voiko koodiin kirjoittaa näin:
<a href="#mitä-niillä-tehdään">3) Mitä niillä tehdään?</a>
(Veikkaan, ettei koodaus ole tarpeen, sillä #-osaa ei lähetetä sivupyynnön mukana.)
3) Pitäisikö jotakin muuta huomioida, kun alkaa käyttää ääkkösiä ja muita joukon a–z ulkopuolella olevia kirjaimia (kuten ä, ö, å, š, ß, µ, æ, ø, ð, Þ, ı [turkin kielen pisteetön pieni I], ŋ)?
1) Ihan mielenkiinnosta, onko joku selain jossa tuo jälkimmäinen vaihtoehto ei toimi. En nyt pääse helposti testaamaan IE5:llä enkä NS4:llä :D
Mutta vaikka selain ei ymmärtäisi mitään UTF8:n päällekään, niin tuo linkkihän koodautuu oikein, vaikka olisi väärä merkistö. Vai onko selaimia jotka ei linkissä olevia erikoismerkkejä enkoodaa %heksaksi
Grez kirjoitti:
– – onko joku selain jossa tuo jälkimmäinen vaihtoehto ei toimi – –
Toimii varmaan kaikissa* selaimissa, mutta googlatessa saa sellaisen käsityksen, että nuo merkit täytyy siitä huolimattaa koodittaa.
En ole törmännyt sivuun, jossa niitä ei olisi kooditettu. Esimerkiksi Wikipediassa ja Ohjelmointiputkassa ne kooditetaan.
Grez kirjoitti:
– – Vai onko selaimia jotka ei linkissä olevia erikoismerkkejä enkoodaa %heksaksi – –
Luulisi, ettei (ainakaan) nykyään. Tämä herättääkin sellaisen ajatuksen, että ehkä ääkkösten kooditus on turhaa. W3C:n validaattorikaan ei valita linkkien koodittamattomista ääkkösistä, vaikka se välilyönnit käskeekin muuttamaan heksamuotoon (%20
).
Grez kirjoitti:
– – En nyt pääse helposti testaamaan IE5:llä enkä NS4:llä – –
*) Riittää, että toimii melko uusilla selaimilla. Esimerkiksi IE:tä tuen versiosta 9 alkaen. :-)
HTML5 kirjoitti:
En ole törmännyt sivuun, jossa niitä ei olisi kooditettu. Esimerkiksi Wikipediassa ja Ohjelmointiputkassa ne kooditetaan.
Linkkien osat täytyy joka tapauksessa käsitellä kahdesta syystä: XSS-injektioiden estämiseksi (ettei linkkiin voi kirjoittaa sellaisia merkkejä kuin <, > ja ") ja oikean toiminnan varmistamiseksi (ettei merkeillä ? ja & ole erityismerkitystä, "a?b=c&d" vs. "a?b=c%26d" vs. "a%3Fb%3Dc%26d"). Sama funktio muuttaa myös ääkköset ja muut erikoismerkit, joten vaatisi ylimääräistä vaivaa jättää ne käsittelemättä.
Haluamasi merkit siis voivat käytännössä toimia, mutta jos jätät ne käsittelemättä, luultavasti sivullasi on tietoturva-aukko tai muu virhe muiden merkkien käsittelyssä, ellet koodaa jotain ihan pöljää purkkaviritelmää.
Metabolix kirjoitti:
Linkkien osat täytyy joka tapauksessa käsitellä kahdesta syystä: XSS-injektioiden estämiseksi – – ja oikean toiminnan varmistamiseksi – –
Aionkin käsitellä ne linkit, joita käyttäjät laittavat, eli käytännössä kommenttien linkit. Esimerkiksi artikkelilinkit sisältävät vain merkkejä a–z, 0–9, - ja joitakin ei-Ascii-kirjaimia, joten XSS-aukkoa ei niihin voi syntyä, eli kooditusta ei tarvita.
Huomasin, että HTML5-standardissa IRI-osoitteet ovat sallittuja. Ne voi siis kirjoittaa sellaisenaan eikä niitä siten tarvitse muuttaa URI-muotoon eli koodittaa ei-Ascii-merkkejä. (Varatut (reserved) ja turvattomat (unsafe) merkit pitää tietysti edelleen koodittaa.)
http://www.w3.org/TR/html5/infrastructure.html#urls
→ [URL]-viittaus
→ viittaus [RFC3987] – ”Internationalized Resource Identifiers (IRIs)”
– Are IRIs valid as HTML attribute values?, Stack Overflow
– Unicode characters in URLs, Stack Overflow
Kuitenkin esimerkiksi Atom 1.0 -syötteissä voi käyttää vain URI-osoitteita, joten IRIt pitää koodittaa URI-muotoon.
Käsittelen sivustollani URLien query string -osaan tulevat merkkijonot näin:
function urlQs($teksti) { return preg_replace_callback('/[%+# &[\]{}<>\\|^`"]/', function($v) { return urlencode($v[0]); }, $teksti); }
Säännöllisen lausekkeen pitäisi sisältää kaikki merkit, jotka voivat aiheuttaa tietoturva-aukon tai joita HTML5-standardi ei salli URL-osoitteissa.
Onko tämä huono ratkaisu? Jos on, niin miksi?
* * *
HTML5 kirjoitti:
Kuitenkin esimerkiksi Atom 1.0 -syötteissä voi käyttää vain URI-osoitteita, joten IRIt pitää koodittaa URI-muotoon.
En tiedä, mistä repäisin tämän. Kyllä IRIt ovat sallittuja, eikä validaattorikaan niistä valita.
Onko sinulla jokin perustelu tuon sähellyksen käyttöön verrattuna siihen, että käyttäisit suoraan urlencode-funktiota koko merkkijonoon?
Aihe on jo aika vanha, joten et voi enää vastata siihen.