как обезопасить одностраничное приложение React / приложение Creat React - PullRequest
0 голосов
/ 09 февраля 2019

Я создаю веб-сайт электронной коммерции с использованием React Single Page App / Creat React App, а в моем бэкэнде iam - Express.js.

, поскольку каждый запрос к серверу использует API, это очень опасно?потому что каждый может получить доступ к нашему API правильно?

так как вы справляетесь с этим?

если я буду использовать CSRF?

Я искалв течение нескольких дней с этим CSRF и результаты остаются прежними, не работает!

Я пробовал использовать CSURF Express, и я получаюмного ошибок.большинство людей общаются, отправляя их через токены CSRF клиенту.Я попробовал это, и когда первая страница открывалась иногда, я получал ошибку Invalid CSRF token

Server.js

import express from 'express';
import bodyParser from 'body-parser';
import passport from 'passport';
import connection from './config/conn';
import { 
    CategoryRoutes,
    ProductRoutes,
    CartRoutes,
    AuthRoutes,
    TrackRoutes,
    AddressRoutes,
    ShippingRoutes,
    UIRoutes,
    LookbookRoutes,
    CheckoutRoutes
} from './modules';
import session  from 'express-session';
import csrf  from 'csurf'
import cors from 'cors'
import cookieParser  from 'cookie-parser'
// import cookieSession from 'cookie-session'
import passportSetup from './config/passport-setup';
import keys from './config/keys';
import uuidv4  from 'uuid/v4';
import UAparser  from 'ua-parser-js';
import { ensureSession } from './config/sessionCheck';
// import path from 'path';
const app = express();

app.use(session({
    genid: function (req) {
        return uuidv4() // use UUIDs for session IDs
    },
    name:keys.session.name,
    secret: keys.session.secret,
    resave: false,
    saveUninitialized: true,
    rolling:true,
    cookie: { 
        secure: false,
        httpOnly: true,
        maxAge:keys.session.maxAge, // satu hari,
        sameSite:true,
     }

}));

// app.use('/public',express.static(path.join(__dirname,'public')));

app.use(passport.initialize());
app.use(passport.session());
app.use(cookieParser());
app.use(csrf({ cookie: false }));

app.disable('x-powered-by');
app.use((req,res,next)=>{
    res.header('X-XSS-Protection', '1; mode=block');
    res.header('X-Frame-Options','deny');
    res.header('X-Content-Type-Options','nosniff');
    res.header("Access-Control-Allow-Origin", "http://localhost:3000");
    res.cookie('csrf_token', req.csrfToken(), { maxAge: 3600, sameSite: true })
    next(); 
})

app.use(cors({ origin: keys.origin.url }))

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get('/', function (req, res, next) {

    var ua = UAparser(req.headers['user-agent']);
    res.end(JSON.stringify(ua, null, '  '));
})
app.use('/api/', ensureSession, [
    CategoryRoutes, 
    ProductRoutes, 
    CartRoutes, 
    AuthRoutes, 
    TrackRoutes, 
    AddressRoutes, 
    ShippingRoutes, 
    UIRoutes,
    LookbookRoutes,
    CheckoutRoutes
]);

const port = process.env.PORT || 5000;
app.listen(port, (err) => {
    if(err){
        console.log(err);
    }else{
        console.log(`Server running on port ! ${port}`);
    }

});

От клиента, использующего Redux

export const fetchCartList = (value)=>disbatch=>{
    console.log(Cookies.get())
    disbatch(loadingCart());
    axios({
        method: 'POST',
        url: '/api/v1/track/cart',
        headers: { "x-csrf-token": Cookies.get("csrt_token") }
    }).then(res => {
        let dataType = typeof res.data.cart_list;
        if(typeof res.data.token_c !== "undefined"){
            localStorage.setItem("hammerstout_c", res.data.token_c);
        }
        if(dataType !== "undefined"){
        disbatch({
            type:FETCH_CART_LIST,
            payload:res.data.cart_list
        })
        }else{
            disbatch(stopLoadingCart());
            localStorage.removeItem("hammerstout_c");
        }


    }).catch(err => {
        disbatch({
            type: GET_ERRORS,
            payload: err.response.data
        });
        if (err.response.data.error) {
            disbatch(stopLoadingCart());
        }
    })
}

Результат

Иногда я получаю ошибку вроде этого:

CSRF не определено:

CSRF IS UNDEFINED

в первом запросе я установил Cookie: CSRF SET

request list

Иногда Успех: как вы видите, CSRF TOKEN БЫЛ УСТАНОВЛЕН: TOKEN HAS BEEN SET CSRF SET SUCCESS

Большая часть того, что я нахожу, - это React-рендеринг на стороне сервера, а не клиент-сторонний рендеринг.

Итак, как обезопасить одностраничное приложение React / приложение Creat React?

. Пожалуйста, дайте мне пример или руководство по работе с этим CSRF с использованием Express и React SPA.

Я пробовал это несколько дней, и результаты все еще не работают: (

...