【问题标题】:PHP code not recognized in jQueryjQuery 无法识别 PHP 代码
【发布时间】:2017-11-19 13:28:48
【问题描述】:

当我点击一个按钮时,我有一个函数被调用。我传递给函数的数据没有包含在表单标签中,所以我必须手动包含 csrf 令牌:

function NewDeleteBox(box_id, batch_id, staff_id){
    $.ajax({
      url: 'oss/admin/delete_box',
      type: "POST",
      data: {'batch_id': batch_id, 'staff_id': staff_id, 'box_id': box_id, '<?php echo $this->security->get_csrf_token_name(); ?>': '<?php echo $this->security->get_csrf_hash();?>'},
      success: function(data) {
    
      }
    });
}

但是,我的 csrf_token_name 和哈希不起作用。它就像我在数据中声明它们的方式一样。

知道我为什么会得到这个吗?谢谢!

【问题讨论】:

  • 此代码是否在 .php 文件中?只是想确定
  • 是的。因为您将 PHP 用引号括起来(从而将它们变成字符串)——所以 jQuery 会将其视为字符串——您的客户端也将如此。此外,您的文件需要是 .php
  • @RiazLaskar 这是一个 JS 文件。这是在 codeigniter 中,所以 url 是子文件夹/控制器/方法
  • 不......只有 .php 可以处理
  • 不能放在JS文件中。 .php 扩展名告诉您的服务器在文件中查找 php。当文件扩展名为 .js 时,它不会运行 PHP

标签: php jquery ajax codeigniter csrf-protection


【解决方案1】:

如果你已经把所有的代码都放在了一个php文件中,但它仍然不能工作,那么你可以采取另一种方法。

将两个隐藏字段放在同一页面上,并为其分配唯一 ID。 然后在这个 ajax 函数中,使用 jQuery 获取它们的值。

<input type="hidden" id="csrf" value="<?php echo $this->security->get_csrf_token_name(); ?>">
<input type="hidden" id="hash" value="<?php echo $this->security->get_csrf_hash();?>">

那么你的javascript函数应该是这样的:

function NewDeleteBox(box_id, batch_id, staff_id){
var csrf = $("#csrf").val();
var hash = $("#hash").val();
var postdata = {'batch_id': batch_id, 'staff_id': staff_id, 'box_id': box_id};
postdata[csrf] = hash;
    $.ajax({
      url: 'oss/admin/delete_box',
      type: "POST",
      data: postdata ,
      success: function(data) {

      }
    });
}

【讨论】:

  • 是的,我刚刚这样做了。但是哈希还可以,但是没有提取令牌名称。我也尝试在调用函数时直接添加这两个。但仍然相同。 csrf: hash 产生 csrf: some_random_hash 当我提醒 csrf 时,它会显示我的令牌名称。但是当我将它添加到我的数据中时,它只是csrf
  • 您是否使用浏览器的开发者工具(检查元素)检查了这两个隐藏的输入值?
  • 是的。他们有正确的价值。我对为什么没有提取令牌名称感到困惑。我还使用了alert(csrf); - 它具有正确的价值。但是当我检查表单数据时,令牌名称实际上是 csrf 而不是实际名称。
  • 您应该从值中删除'。数据:{batch_id:batch_id,staff_id:staff_id,box_id:box_id,csrf:hash},
【解决方案2】:

php 代码不能在 .js 文件上运行。只需将它放在脚本标签内的 .php 文件中,它应该可以正常工作。

<script>
function NewDeleteBox(box_id, batch_id, staff_id){
    $.ajax({
      url: 'oss/admin/delete_box',
      type: "POST",
      data: {'batch_id': batch_id, 'staff_id': staff_id, 'box_id': box_id, '<?php echo $this->security->get_csrf_token_name(); ?>': '<?php echo $this->security->get_csrf_hash();?>'},
      success: function(data) {

      }
    });
}
</script>

【讨论】:

  • 并且 php 脚本不能用引号括起来 - 否则它将被视为字符串。
  • @Korgrue 你错了!!!,php 代码也可以在引号中工作,你自己测试一下,事实上,如果你不加引号,你会得到一个 js 错误。
  • @RiazLaskar 我所有的 js 函数都在一个外部文件中,所以我想坚持下去。感谢您指出我的错误。 :)
  • 然后将它们作为 arg 传递给它应该可以正常工作的函数。
  • 我试过了,但我在@Himanshu Upadhyay 的方法中遇到了同样的问题。令牌名称未被拾取。
猜你喜欢
  • 2012-03-06
  • 2015-02-28
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2022-10-22
相关资源
最近更新 更多