2013-04-06 19 views
8

Mam wbudowane adresy URL mojej witryny, takie jak przepełnione adresy URL stosu  . Moje adresy URL są jak poniżej.Jak działają adresy URL przepełnienia stosu?

http://www.example.com/1255544/this-is-the-url-text 

W tym adresem URL, 1255544 jest id i this-is-the-url-text jest tekst tytuł URL, zarówno przechowywane w bazie danych. Zauważyłem, że adresy URL przepełnienia stosu działają na podstawie identyfikatora. Załóżmy, że tutaj jest stosem   przelewowy URL

http://stackoverflow.com/questions/15679171/new-way-to-prevent-xss-attacks 

W tym URL 15679171 jest id słupka. Kiedy zmienił tego identyfikatora do 15706581 bez dotykania new-way-to-prevent-xss-attacks i naciśnięciu Enter URL automatycznie zmieniony na następujący adres URL:

http://stackoverflow.com/questions/15706581/simplecursoradapter-does-not-load- 
external-sqlite-database-id-error 

A kiedy próbowałem usunąć niektóre części tekstu tytułowego URL jak poniżej

http://stackoverflow.com/questions/15679171/new-way-to-preve 

automatycznie koryguje URL jak poniżej:

http://stackoverflow.com/questions/15679171/new-way-to-prevent-xss-attacks 

oznacza to, że dane są pobierane z bazy danych na podstawie id 15679171 i odpowiedni tekst tytułu adresu URL, new-way-to-prevent-xss-attacks, jest dołączony zgodnie z identyfikatorem.

Ja też chcę to zrobić. Ale problem polega na tym, że nie zrozumiem, że jeśli ktoś zmieni identyfikator adresu URL, tekst tytułu powinien się automatycznie zmienić. Jak mam to zrobic?

myślałem następujące:

$url_id = $_GET["id"]; 
$url_txt = $_GET["url_txt"]; 

$qry = "SELECT * FROM mytable WHERE url_id = '{$url_id}' LIMIT 1"; 
$data = mysql_query($qry); 
$data_set = mysql_fetch_array($data); 

if($url_txt== $data_set["url_txt"]) { 
    // proceed further 
} else { 
    $rebuilt_url = "http://www.example.com/" . $url_id . "/" . $data_set["url_txt"]; 
    header("Location: {$rebuilt_url}") // Redirect to this URL 
} 

Czy to właściwy i skuteczny sposób, aby wykonać tę czynność, czy też nie? Czy istnieje rozwiązanie?

+1

podczas ładowania strony, uzyskać URL z bazy danych przez id, porównać go z URL z paska adresu, jeśli to nie to samo , a następnie przekieruj do prawego adresu URL. –

+0

Należy również uważać na wtrysk sql (przesyłanie $ url_id do int powinno wystarczyć). –

+0

Cześć. Niedawno opublikowałeś pytanie o nazwie "How Stackoverflow Questions Answers System Works", i zostało ono przeniesione do innej witryny przez moderatora. Ups, zaatakuj dla nich ':)'. Sugeruję, żebyś to odesłał (użyj polecenia "kopiuj i wklej"), ale nazwij to "Jak zoptymalizować mój system podobny do StackOverflow". Pamiętaj jednak, że może być zamknięty jako zbyt dyskursywny, chociaż możesz uzyskać ogólne uwagi w komentarzach. Jeśli odświeżysz, zadzwoń do mnie tutaj (@halfer), a ja skomentuję. – halfer

Odpowiedz

3

Jeśli używasz Apache, myślę, że trzeba wiedzieć o URL rewriting

W URL przepisywanie przepisać URL do bardziej przyjaznego wyglądu. Spójrz na poniższy adres URL

http://www.downloadsite.com?category=34769845698752354

i kiedy zrobić przepisać URL na niego, stało się ten

http://www.downloadsite.com/Nettools/Messengers 

Przepisywanie URL musi być ustawiony na Apache konfiguracja (przepisanie reguł), aby przepisał twój adres URL, zanim zapytanie zostanie zinterpretowane przez PHP, dzięki czemu uzyskasz dokładnie taki zasób, który chcesz nabyć:

RewriteRule ^/category$ /content.php 
    RewriteRule ^/category/([0-9]+)$ /.php?id=$1 
    RewriteRule 
    ^/category/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$) 
    cat.php?id=$1&sort=$2&order=$3&start=$4 

Cóż, nie mogę ci tutaj wszystkiego wyjaśnić, ale poniżej podam kilka linków, na których możesz dowiedzieć się więcej o przepisywaniu adresów URL.

To najlepszy hack, jaki możesz zrobić, aby tworzyć przyjazne adresy URL!

Zasoby:

+3

Cześć Mahan, to zwyczajowo w Stack Overflow, aby podać przykład lub wyjaśnienie w treści samej odpowiedzi. Zapewnia to trzy rzeczy: jeśli link się zepsuje, twoja odpowiedź będzie nadal cenna dla przyszłych użytkowników i zapewni, że ludzie będą musieli opuścić Stack Overflow, jeśli potrzebują więcej szczegółowych informacji poza odpowiedzią na pytanie. Wreszcie twój przykład może być dostosowany, podczas gdy linki są prawdopodobnie uogólnieniami. Możesz użyć tego linku [edit], aby dodać dodatki. Mam nadzieję że to pomoże. – jmort253

+0

Cóż, istnieje wiele sposobów na przepisywanie adresów URL i każdy sposób ma długą drogę, więc po prostu umieszczam najlepsze linki, które znalazłem w Internecie. Cóż, będę edytować moją odpowiedź –

+3

Nie musisz pokazywać * każdej * możliwości, ale przykład sprawiłby, że twój post nie zostałby oznaczony jako nie odpowiedź. Dodatkowo, przykłady pomagają ludziom się uczyć i zwiększają szanse na to, że Twój post będzie coraz lepszy. Powodzenia! :) – jmort253

5

Twój kod wygląda całkiem nieźle iw jednym z moich Odpowiedzi przepełnienia   Przekazałem też podobne podejście. Sugeruję jednak tylko jedną niewielką poprawę. Zamiast:

header("Location: {$rebuilt_url}"); 

należy zrobić:

header ('HTTP/1.1 301 Moved Permanently'); 
header("Location: {$rebuilt_url}"); 

To pozwoli cache te adresy agresywnie i kod SQL, zapytania i nie będą wykonywane za każdym razem.

Sprawdź również:

  1. .htaccess if URL is bad do something
  2. .htaccess rewrite friendly URLs
Powiązane problemy