DrupalAjax:通过url与数据参数传递值

DrupalAjax:通过url与数据参数传递值,ajax,drupal,submission,Ajax,Drupal,Submission,使用以下各项的区别是什么: $.ajax({ type: 'POST', url: Drupal.settings.basePath + 'module/get/' + node, dataType: 'json', data: { 'ajax' : true } }); 与: $.ajax({ type: 'POST', url: Drupal.settings.basePath + 'module/get', dataType: 'json', dat

使用以下各项的区别是什么:

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

 $.ajax({
  type: 'POST',
  url: Drupal.settings.basePath + 'module/get',
  dataType: 'json',
  data: { 'ajax' : true, 'node' : node }
 });
在第一种情况下,您将作为回调函数中的参数访问node变量,在第二种情况下,您将使用$\u POST['node']访问它,对吗?第二种方法不总是更好的吗,但我看到很多人用第一种方法。也不是说第二条路是安全的。仍在研究表单标记,但首先尝试找出这一基本点


对于案例1,假设这个ajax是由一个按钮触发的,那么如何阻止一个人直接进入url mysite/module/get/20并激活它呢?只需检查$\u POST['ajax']==true就可以了吗?还是仍然存在安全漏洞?

乍一看没有真正的区别:

假设您的“node”变量只是一个节点id,两者之间没有太大区别。从语义上讲,两者似乎都执行“get”操作(即使它们在技术上是post请求),因为它们只检索数据而不更改服务器上的任何状态(好吧,这是另一种假设)

就安全性而言,也没有相关的区别——两者都可以很容易地“伪造”,区别归结为“标准”GET与“事后辩论”的区别,也就是说,没有区别,只是第一次公开的参数对临时观察者来说更“可访问”,因为它们在URL中显而易见

但Drupal内部的“便利性”差异:

在Drupal中,经常会遇到第一个版本,因为它可以利用Drupal 6中介绍的功能。假设您的回调URL是在hook_菜单中定义的,如下所示:

$items['module/get/%node'] = array(
'title' => 'Foo',
'type' => MENU_CALLBACK,
'page callback' => 'yourModule_callback',
'page arguments' => array(2),
);
这样,
yourModule\u callback()
将被调用,其第一个参数已经是传入nid的已完全加载的节点对象,因为
%node
告诉Drupal在将其交给回调函数之前对参数执行
node\u load()
。使用示例的第二个版本,回调函数必须在从POST数据中提取节点对象之后加载节点对象本身

这是一件方便的事

此外,Drupal中的一个常见模式是对AJAX请求使用与其非javascript“回退”选项相同的回调URL。因此,当调用
yourModule\u callback()
时,它可以首先对传入的节点执行它想要执行的任何操作,基本上就是组装它的结果。完成后,它只检查POST数据中的
$ajax==TRUE
。如果有,它知道结果是针对AJAX请求的,因此它可能会将结果输出为JSON。如果不存在,则它知道整个页面循环正在进行,并可以相应地调整其输出(例如,重建表单、重新生成整个页面等等)


这样,您就不必为非AJAX/AJAX回调注册单独的url。

您能解释一下为什么您认为第二种方法总是更好吗?我认为它会“稍微”好一点,因为它不会公开url中的参数。现在我明白了这两种方法是多么有用。感谢您详细解释了这两种方法之间的区别。:)我知道这两种方法现在都很有用。我的表单的工作方式是,它通常用于ajax,但如果禁用js,它将退回到使用表单api提交表单。仍然想知道在我的回调中简单地检查$ajax==TRUE以确定是否有人只是转到url而不是使用表单是否是万无一失的。例如,最初您转到“mysite/module/get/20”,您将触发回调(我不希望发生这种情况),但是如果您包装回调检查$ajax==true,您可以防止这种情况发生。所以这个url将不再触发回调,也不能使用mysite/module/get/20&ajax=true之类的东西来触发回调?是否仍有棘手的方法绕过这一点,还是应该安全?谢谢。这不是“万无一失”。它只会确认“ajax=true”已经发布给您,而不是这篇文章实际上来自您的表单。(因此只能防止通过标准GET“轻松”访问)。为了确保post本身来自表单,您必须使用formsAPI处理逻辑来重建表单并验证表单令牌。对于一个简单的AJAX回调来说,这听起来有点过分了——为什么您担心有人可以不从表单获取数据?(如果用户可以访问表单,ha无论如何都可以得到AJAX响应)对于这个AJAX,我不太关心,但我还有另一个AJAX表单,可以将数据插入数据库。我刚刚在我的表单中添加了一个额外的令牌,但我不确定它是否与您提到的相同。我使用drupal\u get\u令牌将其添加到drupal.settings中,并将其作为数据发送,使用drupal\u valid\u令牌在服务器端进行验证。这是为了防止XSS和您所说的令牌不同,对吗?我将如何使用这种方法?也许这也有助于我的另一个问题:这与forms API使用的令牌机制相同。我给你发了一个关于其他问题的答案——那里的链接应该会有所帮助。(很抱歉没有发布一个具体的例子,但我记不清这些细节,总是需要在几个月后自己再查找这些内容;)