Bezpieczne znaki dla przyjaznego adresu url

Muszę zrobić stronę internetową, która będzie miała artykuły, i chciałbym zrobić przyjazne adresy URL dla niej, przykład adres URL strony z

Tytuł: Test Artykułu

Powinno być: http://www.example.com/articles/article_test.

Oczywiście muszę usunąć niektóre znaki z tytułu, takie jak ? lub #, ale nie jestem pewien, które z nich usunąć.

Czy ktoś może mi powiedzieć jakie postacie są bezpieczne?
Author: Alex Shesterov, 2009-03-30

13 answers

Aby zacytować sekcję 2.3 RFC 3986:

"znaki, które są dozwolone w URI, ale nie mają zarezerwowanego cel nazywa się bezwarunkowym. Należą do nich wielkie i małe litery litery, cyfry dziesiętne, myślnik, kropka, podkreślenie i tylda."

ALPHA  DIGIT  "-" / "." / "_" / "~"

Należy zauważyć, że RFC 3986 wymienia mniej zastrzeżonych znaków interpunkcyjnych niż starszy RFC 2396 .

 157
Author: Skip Head,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-19 10:13:37

Istnieją dwa zestawy znaków, na które należy uważać: reserved i unsafe.

Zarezerwowane znaki to:

  • ampersand ( " & " )
  • Dolar ( " $ " )
  • znak plus ( " + " )
  • przecinek ( " ,")
  • forward slash ( " / " )
  • colon ( " :")
  • semi-colon ( " ;")
  • equals ( " = " )
  • znak zapytania ("?")
  • 'at' symbol ( " @ " )
  • Funt ("#").

Znaki powszechnie uznawane za to:

  • space ( " ")
  • mniej niż i więcej niż ( " " )
  • otwieranie i zamykanie nawiasów ("[]")
  • otwieranie i zamykanie szelek ("{}")
  • pipe ( " | " )
  • backslash ( " \ " )
  • caret ( " ^ " )
  • procent ("% " )

Mogłem zapomnieć jedną lub więcej, co prowadzi mnie do ECHA odpowiedzi Carla V. Na dłuższą metę prawdopodobnie lepiej będzie używać "biała lista" dozwolonych znaków, a następnie kodowanie ciągu znaków zamiast próbować być na bieżąco z znakami, które są niedozwolone przez serwery i systemy.

 93
Author: Gary.Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-19 01:02:02

Najlepiej zachować tylko niektóre znaki (whitelist) zamiast usuwać niektóre znaki (blacklist).

Technicznie można zezwolić na dowolny znak, o ile poprawnie go zakodujesz. Ale, aby odpowiedzieć w duchu pytania, należy zezwolić tylko na te znaki:

  1. małe litery (konwersja wielkich liter na małe)
  2. liczby od 0 do 9
  3. myślnik - lub podkreślenie _
  4. Tilde ~

Wszystko inne ma potencjalnie szczególne znaczenie. Na przykład możesz myśleć, że możesz użyć+, ale można go zastąpić spacją. & jest również niebezpieczne, szczególnie jeśli używa się reguł przepisywania.

Podobnie jak w przypadku innych komentarzy, zapoznaj się z normami i specyfikacjami, aby uzyskać pełne szczegóły.

 36
Author: carl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-08 22:03:53

Zawsze Bezpiecznie

Są one bezpieczne (teoretycznie / spec), w zasadzie wszędzie poza nazwą domeny./ Align = "left" /

    A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;

Sometimes Safe

Bezpieczne tylko wtedy, gdy są używane w określonych komponentach URL; używaj ostrożnie.

    Paths:     + & =
    Queries:   ? /
    Fragments: ? / # + & =

Never Safe

Zgodnie ze specyfikacją URI (RFC 3986), wszystkie pozostałe znaki muszą być zakodowane procentowo. Dotyczy to:

    <space> <control-characters> <extended-ascii> <unicode>
    % < > [ ] { } | \ ^

Jeśli chodzi o maksymalną kompatybilność, ogranicz kodowanie do A-Z a-Z 0-9 -_ .
(z kropkami tylko dla rozszerzeń nazw plików).

 18
Author: Beejor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-04 03:58:39

= Alfa / cyfra/" -"/"." / "_" / "~"

 12
Author: LKK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-01 22:28:38

Patrząc na RFC3986-Uniform Resource Identifier (URI): Generic Syntax , twoje pytanie dotyczy ścieżki składowej URI.

    foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment
      |   _____________________|__
     / \ /                        \
     urn:example:animal:ferret:nose

Cytując sekcję 3.3, ważne znaki URI {[1] } są typu pchar:

Pchar = unreaserved / pct-encoded / sub-delims / ":" / "@"

Który dzieli się na:

ALPHA / DIGIT / "-" / "." / "_" / "~"

pct-encoded

"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

":" / "@"

Lub innymi słowy: możesz użyć dowolnego (niekontrolowanego -) znaku z tabeli ASCII, Z wyjątkiem /, ?, #, [ i ].

To zrozumienie jest wspierane przez RFC1738-Uniform Resource Locators (URL).

 12
Author: Philzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-19 09:56:33

Z kontekstu, który opisujesz, podejrzewam, że to, co naprawdę próbujesz zrobić, to coś, co nazywa się "ślimakiem SEO". Najbardziej ogólnie znaną praktyką jest:

  1. Konwertuj na małe litery
  2. Konwersja całych sekwencji znaków innych niż a-z i 0-9 na jeden myślnik ( - ) (bez podkreślenia)
  3. Usuń "słowa stop" z adresu URL, tj. słowa nieindeksowalne, takie jak "a", " an " i "the"; Google "słowa stop" dla obszernych list

Tak więc, jako przykład, artykuł zatytułowany " The Usage of !@ % $ * aby reprezentować przeklinanie w komiksach "otrzymałby kulkę" usage-represent-przeklinanie-komiksów".

 11
Author: chaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-29 22:09:20

Format URI jest zdefiniowany w RFC 3986 . Szczegółowe informacje znajdują się w punkcie 3.3.

 6
Author: joschi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-29 21:46:37

Z punktu widzenia SEO, myślniki są preferowane niż podkreślenia. Konwertuj na małe litery, usuń wszystkie apostrofy, a następnie zamień wszystkie niealfanumeryczne ciągi znaków pojedynczym myślnikiem. Przyciąć nadmiar myślników na początku i na końcu.

 6
Author: mpen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-29 22:19:34

Miałem podobny problem, chciałem mieć ładne adresy URL i doszedłem do wniosku, że muszę zezwalać tylko na litery, cyfry, - i _ w adresach URL. To jest w porządku, potem napisałem kilka ładnych regex i zdałem sobie sprawę, że rozpoznaje wszystkie znaki UTF8 nie są literami W. NET i został spieprzony. Wydaje się, że jest to problem know dla. NET regex engine. Więc doszedłem do tego rozwiązania:

private static string GetTitleForUrlDisplay(string title)
{
    if (!string.IsNullOrEmpty(title))
    {
        return Regex.Replace(Regex.Replace(title, @"[^A-Za-z0-9_-]", new MatchEvaluator(CharacterTester)).Replace(' ', '-').TrimStart('-').TrimEnd('-'), "[-]+", "-").ToLower();
    }
    return string.Empty;
}


/// <summary>
/// All characters that do not match the patter, will get to this method, i.e. useful for unicode chars, because
/// .NET impl of regext do not handle unicode chars. So we use char.IsLetterOrDigit() which works nicely and we 
/// return what we approve and return - for everything else.
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static string CharacterTester(Match m)
{
    string x = m.ToString();
    if (x.Length > 0 && char.IsLetterOrDigit(x[0]))
    {
        return x.ToLower();
    }
    else
    {
        return "-";
    }
}
 3
Author: Lubomir Toshev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-09 10:31:28

Uznałem, że bardzo przydatne jest zakodowanie mojego adresu url do bezpiecznego, gdy zwracałem wartość za pomocą ajax / php do adresu url, który został ponownie odczytany przez stronę.

Wyjście PHP z koderem url dla znaku specjalnego &

//PHP returning the sucess info of ajax request
echo "".str_replace('&','%26',$_POST['name'])." category was changed";

//javascript sending the value to url
window.location.href='time.php?return=updated&val='+msg;

//javascript/php executing the function printing the value of the url,
//now with the text normally lost in space because of the reserved & character.

setTimeout("infoApp('updated','<?php echo $_GET['val'];?>');",360);

Mam nadzieję, że ktoś uzna mój mały fragment kodu za przydatny! :)

 1
Author: DIY-Forum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-28 08:02:28

Myślę, że szukasz czegoś w rodzaju "Url Encoding" - kodowanie adresu URL tak, aby był" bezpieczny " w użyciu w sieci:

Tutaj jest odniesienie do tego. Jeśli nie chcesz żadnych znaków specjalnych, po prostu usuń wszystkie, które wymagają kodowania URL:

Http://www.w3schools.com/TAGS/ref_urlencode.asp

 0
Author: Andy White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-29 21:47:12

Od 3 do 50 znaków. Może zawierać małe litery, cyfry i znaki specjalne-kropka(.), dash ( -), underscore (_) i at the rate (@).

 -3
Author: Ramji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 15:44:00