【问题标题】:Performing a PHP script using javascript ajax call [closed]使用 javascript ajax 调用执行 PHP 脚本 [关闭]
【发布时间】:2015-11-26 05:20:33
【问题描述】:

我有以下XMLHttpRequest

# ....
var request = new XMLHttpRequest();
request.open('GET', 'controllers/get_date.php', true);
request.setRequestHeader('Cache-Control', 'no-cache');
request.setRequestHeader('fn', 'get_date');
request.setRequestHeader('day', '27/11'  );
# ....

get_date.php 看起来像这样:

if($_SERVER['HTTP_FN'] == 'get_date'):
   $day = Common::sanitize($_SERVER['HTTP_DAY']);
   $data = new MyFunction($day);
   echo $data->my_data();
endif;

基本上我正在尝试从$data->my_data() 获取一些数据,所有这些都运行良好。但是,由于我的后端技能非常有限。我想知道这是否是正确的方法(主要考虑安全性)或者我是否应该采取另一种方法。

【问题讨论】:

  • 这取决于你,如果你擅长 javascript 那么这种方法很好,否则 jquery ajax 很方便!
  • 到底是什么问题?
  • 据我所知,确实没有真正的问题。我的问题是寻找一种考虑安全性、性能、语言使用等的正确方法,因为我离成为一名经验丰富的开发人员还很遥远。我一直在阅读很多关于如何使用 nodejs、ruby on rails、php 框架等开发服务器端应用程序的内容。关于我的要求,这似乎完成了我需要完成的工作。谢谢!
  • 从您提供的代码和信息中,我们无法判断您的实现是否良好。这主要取决于 2 个因素:Common::sanitize() 背后的代码是什么,以及:每个会话有多少个请求。你应该把更多的代码放在 CodeReview Stackexchange 平台上。
  • 这绝对不是关于sanitize 内容,而是关于使用javascript、ajax 和php 请求内容。谢谢@cocco

标签: javascript php ajax


【解决方案1】:

您应该避免通过 HTTP 标头传递参数数据。 HTTP 标头用于 HTTP 层正确传输其数据。它有自己的用途,但不是用于应用程序参数。代理、防火墙、网关、负载平衡器等都可以检查和重写头部以用于 HTTP 传输。您的自定义“参数”可能会被重写、删除或运行到其他标头的相同命名空间中。

相反,我建议您使用 GET 或 POST 数据使用查询字符串传递。

例如:

request.open('GET', 'controllers/get_date.php?fn=get_date&day=27%2F11', true);

在 PHP 中,获取参数使用:

$fn = $_REQUEST['fn'];
$day = $_REQUEST['day'];
if($fn == 'get_date') {
...

【讨论】:

  • “你不应该通过 HTTP 标头传递参数数据”为什么不呢?
  • 你可以说是纯粹主义者。但是 HTTP 标头是为了让 HTTP 层正确传输其数据。它有自己的用途,但不是用于应用程序参数。代理、防火墙、网关、负载平衡器等都可以检查和重写头部以用于 HTTP 传输。您的自定义“参数”可能会被重写、删除或运行到其他标头的相同命名空间中。应用层有各种各样的方式来传递它的参数。为什么要跨过去冒险。
  • 打开一个大网站并检查标题。 .. shure 'get date' 可能不合适。但其他的会是。
  • 顺便说一句,您应该将其添加到答案中(因为 cmets 被删除)这是一个非常有效的观点。标题的滥用。-
  • 我只是说它应该是它不应该是什么。当然,通过 http 标头传递您的数据可以在某些方面发挥作用。但对于新手来说,这不是我鼓励的事情。那里有很多自定义的 http 标头,但主要目的是让代理/网关/负载均衡器进行通信。新手应远离或冒数小时的调试时间。
【解决方案2】:

是的,这取决于你!

首先感谢使用本机XMLHttpRequest,所有浏览器都支持,包括移动浏览器。使用 jQuery 的 ajax 只是性能损失。

安全

当谈到 javascript 时,没有安全性。零。

前段时间我回答了一个关于How can I obfuscate(protect) JavaScript? 的问题……而且一旦你把它放到网上,真的没有什么可以隐藏的。你唯一能做的就是惹恼“黑客”。此外,仅使用本机 XMLHttpRequest 会增加所有 jQuery 粉丝不理解您所做的事情的机会! ;)

在上面的帖子中,我使用标题来验证引荐来源...

性能

XMLHttpRequest它是原生的...所以它是最快的方法..

所有其他库包括许多简化一切的用户友好检查。许多检查意味着性能损失。

由于您可能希望将 ajax 用于不止一项操作,我建议您查看我前段时间编写的函数。

How do I return the response from an asynchronous call?

function ajax(a,b,e,d,c){ // Url,callback,method,formdata or {key:val},placeholder
 c=new XMLHttpRequest;
 c.open(e||'get',a);
 c.onload=b;
 c.send(d||null)
}

我将它用于各种 REST API。大多数情况下,您不需要设置标题和其他内容。 您可以对其进行修改并添加对添加标题信息的支持。

我在你的代码中看到了一个非常糟糕的地方。

request.open('GET', 'controllers/get_date.php', true);

真的???

不要这样做。那不应该被使用。甚至没有静态文件。 Ajax 本来就是异步!如果 php 文件的响应不够快,您将导致用户浏览器崩溃。通过崩溃,我的意思是浏览器卡住了,直到加载了 ajax 内容。所以如果加载文件需要 5 秒,那么 5 秒你什么也做不了。鼠标/触摸事件不起作用,每个动画元素都将被冻结。gifs/videos/cssstyles。

如何发送参数

安全性略高...短参数,最佳性能??是的,使用headers 标头在其他任何东西之前发送。但实际上我认为没有太大变化,因为最终的二进制数据可能与您通过GETPOST 发送它的大小相同。

GETPOST?

如果最后获得的发送标头的安全性还不够,因此您想以“正常”方式进行,那么只需考虑一件重要的事情:您需要发送多少数据。我更喜欢 post.. 它允许发送更多数据。我使用FormData 这样做。

var fd=new FormData(form);// this is the whole form including upload files.
ajax(url,callback,'post',fd);

JSON 似乎不太明显。

我看不到任何地方提到 JSON。没有 JSON 的 Ajax 是没用的。没有 json 的 js & php 是没用的。你不能只发送字符串......所以

php

//php array to jsonstring
json_encode($array);

//jsonstring to php array
json_decode($string);

js

//jsonstring to js array
JSON.parse(string);

//js array to jsonstring
JSON.stringify(array);

在这两种情况下(如果服务器 nginx、apache、lighthttp 设置正确),您无需担心编码。 JSON 自动编码为utf8

PHP

有些人可能会建议压缩 php(ajax 可以处理压缩文件),甚至添加正确的 mimetype。

//header('Content-Type: application/json'); // not needed
echo json_encode($data);

但在这两种情况下都需要更多时间。 所以不要。

保持 php 文件尽可能简单。因为它需要更多时间。 不要发送元素、样式或其他 html 相关内容。你应该做客户端。保持服务器敏捷。

mysql转json

https://stackoverflow.com/a/20948686/2450730


现在,看看 cmets,您使用的是 NODEJS :)。

使用 webSockets。 将它用于一切。 忘记 ajax,用 websockets 做所有事情!!!!双向通信。您只发送所需的数据。没有请求,没有标头……没有慢的东西。

支持

旧版浏览器不支持 ajax 和 websockets 以及服务器发送的事件。

如果这是个问题,请不要使用这些技术。同样使用jQuery在ie6上允许ajax只是一个笑话......

顺便说一句,现在 ff,即,opera、android、safari、ios 甚至这些浏览器的 4-5 年旧版本都支持 ajax、websockets 和 SSE

网络套接字

我真的很喜欢 php, mysql nginx apache...但是 nodejs, websockets & json ..

这很有趣

简单的js例子。

var ws=new WebSocket('ws://YOURIP:YOURPORT');
ws.onopen=function(){ //those events are also aviable with sse
 ws.send('WS open!');//sending data to the server
 // server handles each user individually very easely.
};
ws.onclose=function(){
 console.log('WS closed!');
};*/
ws.onmessage=function(e){
 //USE JSON
 var Everythingyouneed=JSON.parse(e.data);
};

@nodejs 端....

https://github.com/websockets/ws

查看broadcast 或单独将数据发送给每个用户。

【讨论】:

  • 这个答案太长而且令人困惑,它包含很多个人意见,并没有真正提供有用的答案。
  • 您能否更准确地说明令人困惑的地方?所以我重新编辑了那部分。
  • 我觉得这不是一个好的答案,因为 OP 询问了 PHP 而你用 NodeJS 回答。这些概念可能是可传递的,但是当 OP 甚至没有关于使用实时通信的闪烁并且某些信息是彻头彻尾的错误时,你就偏离了关于 websockets 的切线。您不会通过发送同步文件来“使用户的浏览器崩溃”。你肯定会阻止你的服务器,但这不会让浏览器崩溃,只会破坏你的服务器的效率。
  • 不,那是错误的。所有客户端操作都可以正常工作 - 在最坏的情况下,如果在转发代理后面,客户端只会收到连接超时 (HTTP 500) 或上游错误 (HTTP 503)。这不会“使浏览器崩溃”,在这种情况下,您可以争辩说任何未捕获的异常都会“使用户的浏览器崩溃”。这种方法的主要问题是在发送同步文件时,服务器无法在同一线程上为其他任何人提供服务,并在等待 I/O 传输时阻塞。
  • 关键是如果文件加载需要 3 秒,浏览器会卡住 3 秒。没有事件(鼠标,触摸)甚至动画(css)可用。这是最糟糕的事情。Ajax 同步
猜你喜欢
  • 2017-05-10
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多