2016-12-28 29 views
0

Я делаю приложение NodeJS Express, которое в определенном сценарии получает запрос от пользователя, затем перенаправляет запрос на сторонний сайт и после получения ответа от третьего лица передает его обратно пользователю. Ничего сложного.Как обходить аксиомы, встроенные в CSRF-защиту?

У меня проблема с аксиомами модуля HTTP. Это похоже на то, что в него встроена некоторая защита XSRF, что заставляет мое приложение выкидывать ошибку, даже несмотря на то, что данные запроса от пользователя проверяются до того, как с ним все будет сделано. Вот упрощенная версия моего кода:

const 
    express = require('express'), 
    router = express.Router(), 
    { join } = require('path'), 
    axios = require('axios') 

router.get('/:logId', (req, res, next) => { 
    const { logId } = req.params 

    // validate logId, 1 or more digit number 
    const pathRegex = /^\/?\d+$/g 
    if (!pathRegex.test(logId)) res.status(400).end() 
    else { 
    const urlStr1 = join('http://example.com/', logId) 

    // another string for comparison 
    const urlStr2 = 'http://example.com/123' 

    // this successfully logs out the expected result to console 
    axios.get(urlStr2) 
    .then(console.log) 
    .catch(console.warn) 

    // this throws an error 
    axios.get(urlStr1) 
    .then(console.log) 
    .catch(console.warn) 
    } 
}) 

Как уже упоминалось в комментариях к коду, если я посылаю запрос со строкой, которую я создал на сервере, все работает отлично, но если я использую строку, которая получена из данных запроса пользователя (1+ значный номер), выбрасывается следующее сообщение об ошибке:

Error: connect ECONNREFUSED 127.0.0.1:80 
    at Object.exports._errnoException (util.js:1012:11) 
    at exports._exceptionWithHostPort (util.js:1035:20) 
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1080:14) 
    code: 'ECONNREFUSED', 
    errno: 'ECONNREFUSED', 
    syscall: 'connect', 
    address: '127.0.0.1', 
    port: 80, 
    config: 
    { adapter: [Function: httpAdapter], 
    transformRequest: { '0': [Function: transformRequest] }, 
    transformResponse: { '0': [Function: transformResponse] }, 
    timeout: 0, 
    xsrfCookieName: 'XSRF-TOKEN', 
    xsrfHeaderName: 'X-XSRF-TOKEN', 
    maxContentLength: -1, 
    validateStatus: [Function: validateStatus], 
    headers: 
     { Accept: 'application/json, text/plain, */*', 
     'User-Agent': 'axios/0.15.3' }, 
    method: 'get', 
    url: 'http:/example.com/44', 
    data: undefined }, 
    response: undefined } 

Это выглядит как Аксиос, построенный в защите XSRF. Любые идеи, как обойти его, кроме использования другого пакета запросов HTTP?

ответ

0

Вы можете использовать модуль request, который создан для сервера изначально непохожим на axios, который используется для клиентской стороны максимум.