PHP: Criar variável com base em hashtag

Estou usando este tutorial para criar um site do ajax e estou me esforçando para o PHP. Este é o código fornecido:

PHP

if(!$_POST['page']) die("0"); $page = (int)$_POST['page']; if(file_exists('pages/page_'.$page.'.html')) echo file_get_contents('pages/page_'.$page.'.html'); else echo 'There is no such page!'; 

Gostaria de usar uma estrutura de nomeação diferente de page_1.html , page_2.html etc. Meu HTML parece assim:

HTML

  

Agora, o único link que está funcionando é ‘Page 4’. Como eu reescreviria o PHP para que os três primeiros links funcionassem?

Javascript

 var default_content=""; $(document).ready(function(){ checkURL(); $('ul li a').click(function (e){ checkURL(this.hash); }); //filling in the default content default_content = $('#pageContent').html(); setInterval("checkURL()",250); }); var lasturl=""; function checkURL(hash) { if(!hash) hash=window.location.hash; if(hash != lasturl) { lasturl=hash; // FIX - if we've used the history buttons to return to the homepage, // fill the pageContent with the default_content if(hash=="") $('#pageContent').html(default_content); else loadPage(hash); } } function loadPage(url) { url=url.replace('#page',''); $('#loading').css('visibility','visible'); $.ajax({ type: "POST", url: "load_page.php", data: 'page='+url, dataType: "html", success: function(msg){ if(parseInt(msg)!=0) { $('#pageContent').html(msg); $('#loading').css('visibility','hidden'); } } }); } 

Somente a página 4 funciona, porque está esperando que os scripts sejam nomeados como page_number.html . Os serviços de sua home, about, services não correspondem a esse padrão. Para fazê-los funcionar também, você precisaria alterar a chamada file_get_contents() para permitir a page/anything.html .

A primeira coisa a modificar é a function que publica:

 function loadPage(url) { // Instead of stripping off #page, only // strip off the # to use the rest of the URL url=url.replace('#',''); $('#loading').css('visibility','visible'); $.ajax({ type: "POST", url: "load_page.php", data: 'page='+url, dataType: "html", success: function(msg){ if(parseInt(msg)!=0) { $('#pageContent').html(msg); $('#loading').css('visibility','hidden'); } } }); } 

Agora, isso introduz um risco de segurança em PHP. Você precisa validar que o valor de $_POST['page'] é estritamente alfanumérico para que ninguém possa injetar um nome de arquivo como ../../../../somefile para ler seu sistema de arquivos. O uso da expressão abaixo permitirá que você nomeie seus arquivos com caracteres alfabéticos e numéricos, mas rejeitará pontos e bytes nulos, quais são os principais perigos em um ataque de passagem de diretório / injeção de diretório de arquivo .

 if(empty($_POST['page'])) die("0"); // Remove the typecast so you can use the whole string //$page = (int)$_POST['page']; // Just use the post val. This is safe because we'll validate it with preg_match() before use... $page = $_POST['page']; // And validate it as alphanumeric before reading the filesystem if (preg_match('/^[a-z0-9]+$/i', $_POST['page']) && file_exists('pages/'.$page.'.html')) { // Remove the page_ to use the whole thing echo file_get_contents('pages/'.$page.'.html'); } else echo 'There is no such page!'; 

Você precisaria alterar mais do que isso para fazê-lo funcionar.

  1. Altere o JS para que ele não remova nada do URL, exceto o sinal da libra:

     url=url.replace('#page',''); 

    Precisa ser:

     url=url.replace('#',''); 
  2. Altere o PHP para lidar com strings:

     if(!$_POST['page']) die("0"); // Only allow alphanumeric characters and an underscore in page names $page = preg_replace( "/[^\w]/", '', $_POST['page']); if(file_exists('pages/'.$page.'.html')) echo file_get_contents('pages/'.$page.'.html'); else echo 'There is no such page!'; 
  3. Agora, crie as páginas no diretório pages/ .

Mude o PHP para isso:

 $page = $_POST['page']; if(file_exists('pages/'.$page.'.html')) echo file_get_contents('pages/'.$page.'.html'); 

Agora você está usando a tag de hash inteiro, então #about irá levar a: pages / about.html

Altere isso na function javascript function loadPage

 url=url.replace('#page',''); 

torna-se

 url=url.replace('#','');