我有以下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()
获取一些数据并且所有这些都正常工作。然而,由于我的后端技能非常有限。我想知道这是否是一种正确的方式(主要考虑安全性)或者我是否应该采取另一种方法。
答案 0 :(得分:2)
您应该避免通过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') {
...
答案 1 :(得分:-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
之前发送的标题。但实际上我认为没有太大的变化,因为最终的二进制数据可能与您通过GET
&amp; POST
。
GET
或POST
?
如果最终获得的发送标题的安全性不够,那么你想要这样做&#34;正常&#34;那么,只有一件重要的事情需要考虑:你需要发送多少数据。我更喜欢发帖..它允许发送更多数据。我使用FormData来执行此操作。
var fd=new FormData(form);// this is the whole form including upload files.
ajax(url,callback,'post',fd);
看似不太明显的是JSON。
我看到JSON没有提到。没有JSON的Ajax是没用的。 js&amp;没有json的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文件尽可能简单。因为它是花费更多时间的人。 不要发送元素,样式或其他相关内容。你应该做那个客户方。保持服务器敏捷。
mysql to json
https://stackoverflow.com/a/20948686/2450730
现在,看看评论,你使用NODEJS :)。
使用webSockets。将其用于所有内容。 忘掉ajax,用websockets做任何事!!!!!双向通信。而且您只发送所需的数据。没有请求,没有标题......没有缓慢的东西。
<强>支持强>
旧版浏览器不支持ajax和websockets,也支持服务器发送事件。
如果这是一个问题,请不要使用这些技术。同样使用jQuery来允许ie6上的ajax只是一个笑话......
顺便说一下现在ff,即opera,android,safari,ios甚至这些浏览器的4-5岁版本都支持ajax,websockets&amp; SSE
<强>的WebSockets 强>
我真的很喜欢php,mysql nginx apache ...但是nodejs,websockets&amp; 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 side ....
https://github.com/websockets/ws
查看broadcast
或将数据单独发送给eah用户。