Thursday, 16 March 2017

Deserialisation issue on user input

On putting serialized data as a varaiable working fine for me. Below is the code for this:-

var JSONAPIDeserializer = require('jsonapi-serializer').Deserializer;
var data = { "data": [ { "type": "ids", "id": new function(){eval('console.log(`HelloWorld`)')}() } ] }

var UserDeserialize = new JSONAPIDeserializer();
UserDeserialize.deserialize(data)
.then(a => console.log(a))

Below is the output for this on console Desktop$ node new.js HelloWorld [ { id: {} } ]

Now, as per my requirement, If i am taking this serialized data as user input then I am not able to make it work.

Below is my server code:-

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
app.use(cookieParser())
var JSONAPISerializer = require('jsonapi-serializer').Serializer;
var JSONAPIDeserializer = require('jsonapi-serializer').Deserializer;


var port = process.env.PORT || 1337;

var bodyParser = require('body-parser');
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.post('/', function(req, res) {
 if (req.body.profile) {

   var str = new Buffer(req.body.profile, 'base64').toString();
    console.log(str)
   var UserDeserialize = new JSONAPIDeserializer();
   var obj = UserDeserialize.deserialize(str).then(result => {
    console.log(result);

   });

   if (obj.username) {
     res.send("Hello " + escape(obj.username));
   }
 } else {
     res.cookie('test', "This is my test", {
       maxAge: 900000,
       httpOnly: true
     });
 }
 res.send("Hello World");
});
    
app.listen(port);
console.log('Server started! At http://localhost:' + port);

So, request is like this:-

POST / HTTP/1.1
Host: localhost:1337
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 132

profile=eyAiZGF0YSI6IFsgeyAidHlwZSI6ICJpZHMiLCAiaWQiOiBuZXcgZnVuY3Rpb24oKXtldmFsKCdjb25zb2xlLmxvZyhgSGVsbG9Xb3JsZGApJyl9KCkgfSBdIH0=

Here profile is eyAiZGF0YSI6IFsgeyAidHlwZSI6ICJpZHMiLCAiaWQiOiBuZXcgZnVuY3Rpb24oKXtldmFsKCdjb25zb2xlLmxvZyhgSGVsbG9Xb3JsZGApJyl9KCkgfSBdIH0= base64 encoded form of { "data": [ { "type": "ids", "id": new function(){eval('console.log(HelloWorld)')}() } ] }

But, I am getting error as shown:-

html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>TypeError: Cannot read property &#39;attributes&#39; of undefined<br> &nbsp; &nbsp;at extractAttributes (/Users/acid/node_js/node_modules/jsonapi-serializer/lib/deserializer-utils.js:70:36)<br> &nbsp; &nbsp;at module.exports.perform (/Users/acid/node_js/node_modules/jsonapi-serializer/lib/deserializer-utils.js:123:13)<br> &nbsp; &nbsp;at resource (/Users/acid/node_js/node_modules/jsonapi-serializer/lib/deserializer.js:26:10)<br> &nbsp; &nbsp;at module.exports.deserialize (/Users/acid/node_js/node_modules/jsonapi-serializer/lib/deserializer.js:39:14)<br> &nbsp; &nbsp;at /Users/acid/node_js/localhost/velekaam/hacked.js:21:30<br> &nbsp; &nbsp;at Layer.handle [as handle_request] (/Users/acid/node_js/node_modules/express/lib/router/layer.js:95:5)<br> &nbsp; &nbsp;at next (/Users/acid/node_js/node_modules/express/lib/router/route.js:137:13)<br> &nbsp; &nbsp;at Route.dispatch (/Users/acid/node_js/node_modules/express/lib/router/route.js:112:3)<br> &nbsp; &nbsp;at Layer.handle [as handle_request]

What I am doing wrong here ?



via Ashu

No comments:

Post a Comment