Pergunta

Qual é a diferença entre usar:

 $.ajax({
  type: 'POST',
  url: Drupal.settings.basePath + 'module/get/' + node,
  dataType: 'json',
  data: { 'ajax' : true }
 });

contra:

 $.ajax({
  type: 'POST',
  url: Drupal.settings.basePath + 'module/get',
  dataType: 'json',
  data: { 'ajax' : true, 'node' : node }
 });

No primeiro caso, você acessaria a variável do nó como um parâmetro na função de retorno de chamada e, no segundo caso, você o acessaria com $ _Post ['nó'] certo? O segundo método sempre seria melhor, mas vejo muitas pessoas fazendo isso da primeira maneira. Para não dizer que a segunda maneira é essa segura. Ainda olhando para os tokens de forma, mas tentando descobrir esse bit básico primeiro.

Também se perguntando para o caso 1, assumindo que este Ajax seja acionado por um botão, como você impede que uma pessoa entre no URL, mysite/módulo/get/20 e ativando -o? Simplesmente verificando esse $ _post ['ajax'] == true faça isso? Ou ainda existe um buraco de segurança lá?

Foi útil?

Solução

Nenhuma diferença real à primeira vista:

Supondo que sua variável 'nó' seja apenas um ID do nó, não há muita diferença entre os dois. Semanticamente, ambos parecem executar uma operação 'Get' (mesmo que sejam tecnicamente postais solicitações), pois apenas recuperam dados sem alterar nenhum estado no servidor (OK, isso é outra suposição).

Em termos de segurança, também não há diferença relevante - ambos podem ser "forjados" com facilidade e a diferença se resume à mesma que com o "padrão" obtém vs. pós -debate, ou seja, não há diferença, exceto que o primeiro expõe os parâmetros de um Um pouco mais 'acessível' ao observador casual, como eles estão à vista do URL.

Mas uma diferença de 'conveniência' no Drupal:

Dentro do Drupal, a primeira versão é frequentemente encontrada porque pode fazer uso do Argumentos do carregador curinga funcionalidade (introduzida no Drupal 6). Digamos que seu URL de retorno de chamada seja definido em Hook_menu Like So:

$items['module/get/%node'] = array(
'title' => 'Foo',
'type' => MENU_CALLBACK,
'page callback' => 'yourModule_callback',
'page arguments' => array(2),
);

Com isso, yourModule_callback() será chamado com seu primeiro parâmetro que já está sendo o nó totalmente carregado, obceto para o aprovado no NID, como %node diz a Drupal para executar um node_load() no parâmetro antes de entregá -lo à função de retorno de chamada. Usando a segunda versão do seu exemplo, a função de retorno de chamada teria que carregar o próprio objeto do nó, depois de extraí -lo dos dados do post.

Então, uma coisa de conveniência aqui.

Além disso, um padrão comum no Drupal é usar o mesmo URL de retorno de chamada para uma solicitação de Ajax e para sua alternativa não JavaScript 'Fallback'. Então quando yourModule_callback() é chamado, pode fazer o que se deve fazer com o passado no nó primeiro, basicamente montando seu resultado. Depois disso, ele só verifica $ajax == TRUE dentro dos dados da postagem. Se estiver lá, sabe que o resultado é destinado a uma solicitação de Ajax, para que possa gerar o resultado como um JSON. Se não estiver lá, sabe que um ciclo de página inteira está acontecendo e pode ajustar sua saída de acordo (por exemplo, reconstruindo um formulário, regenerando uma página inteira, qualquer que seja ...).

Dessa forma, você não precisa registrar URLs separados para seus retornos de chamada não Ajax/Ajax.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top