2013-10-06 2 views
0

Я - относительно новый веб-программист, и сейчас я работаю над своим первым крупным проектом. Я использую угловые, выражать (сверху узла) и базу данных диаграмм neo4j. Прямо сейчас я пытаюсь определить лучший (с точки зрения безопасности и оптимизации скорости) способ настройки взаимодействия веб-приложения с базой данных.Database Exposure: Best Practices

Сейчас я чувствую, что вхожу в это несколько слепо. То, что я ищу, - это руководство по лучшим практикам, вопросам безопасности, которые необходимо учитывать, и любые другие соответствующие советы или подводные камни, о которых нужно знать в создание бэкэнда веб-приложения.

Чтобы привести это в несколько более конкретные условия, я дам вам представление о том, как я настраиваю маршруты прямо сейчас. Ниже приведены настройки маршрутов в файле app.js.

//match database query functions 
function dataQuery(req, res) { 
    var func = database[req.param('query')]; 
    func(req, res); 
} 
    //match database create functions 
function dataCreate(req, res) { 
    var func = database[req.param('create')]; 
    func(req, res); 
} 
//handle data queries 
app.get('/query/:query', dataQuery); 

//handle adding new content 
app.post('/create/:create', dataCreate) 

По существу она у меня настроить так, что я отправляю или GET в URL, который просто идет и выполняет функцию. Я по сути назвал функцию, которую я хочу запустить в URL:/query/theNameOfTheFunction. Эти функции затем идут и либо строят запрос cypher (язык запросов neo4j), используя информацию в запросе для взаимодействия с базой данных, либо обрабатывают такие вещи, как добавление загруженных пользователем изображений.

Пример: Создание содержимого (URL:/Запрос/createContent)

exports.createContent = function (req, res) { 

    var content = JSON.parse(req.query.content); 
    var query = ("CREATE (n:Content {Title: {title}, URL: {url}, Description: {description}, Source: {source}, Links: {links}, Value: {valueStatement} })"); 

    query = query.replace("{title}", "\"" + content.title + "\""); 
    query = query.replace("{url}", "\"" + content.url + "\""); 
    query = query.replace("{description}", "\"" + content.description + "\""); 
    query = query.replace("{source}", "\"" + content.source + "\""); 
    query = query.replace("{links}", "\"" + content.links + "\""); 
    query = query.replace("{valueStatement}", "\"" + content.valueStatement + "\""); 

    db.query(query, function (err, results) { 
     if (err) {res.send()}; 
     res.send(); 
    }); 
} 

Здесь у меня есть шаблон для запроса и просто заглядывать пользователя информацию, генерируемую с помощью замены.

Пример: Добавление изображений на сервер (URL:/создать/addImage)

exports.addImage = function (req,res) { 
    var url = req.query.url; 
    var fileName = req.query.fileName; 

    console.log(req.query); 
    request(url).pipe(fs.createWriteStream("./img/submittedContent/" + fileName)); 
    res.send(); 
} 

Кажется, что этот подход, вероятно, не очень масштабируемым, но я не уверен, как лучше организовать код на сервере боковая сторона.

Еще один конкретный пример, который я хотел бы упомянуть, следующий случай. Сам запрос является сложным, и я сейчас нажимал его на клиентскую сторону (запрос ищет контент, связанный с условиями, которые пользователь выбрал, и соответственно изменяется по длине). Клиент отправляет запрос, который создается, он передается в neo4j api. Очевидно, здесь есть опасения: если пользователь может определить запрос, он может выполнить любое действие в базе данных (удаляя все или что-то еще). Я не понимаю, как кто-то может это сделать, но это, безусловно, кажется выполнимым.

exports.getContent = function (req, res) { 
    var query = req.query.query; 

     //would checking for black/white list key terms be enough security? (remove, create, set, etc) 

    db.query(query, function (err, results) { 
     if (err) {throw err}; 
     res.send(results); 
    }); 
} 

Неужели я об этом не совсем прав? Я никогда не получал формального введения в сценарии на стороне сервера, и я просто ушел от вещей, которые я читал. Я хотел бы сделать это «правильным способом», но мне нужно знать, что это первый способ ...

+0

* «Что я ищу, это руководство по лучшим практикам, вопросам безопасности, которые необходимо учитывать, и любые другие соответствующие советы или подводные камни, о которых нужно знать при настройке брандмауэра веб-приложений». * Ваш вопрос слишком широка, как написано ..., можете ли вы сузить область действия? Есть книги, которые могут охватывать то, что вы ищете, на разумном количестве страниц. :) – WiredPrairie

+0

Если бы вы могли рекомендовать любые книги, я был бы в восторге. Вы явно правы, хотя ... похоже, я не могу сформулировать краткий вопрос с теми знаниями, которые у меня есть сейчас. То, что может быть сразу полезно, объясняет, является ли отображение URL-адресов конкретным функциям плохим выбором дизайна и какие могут быть альтернативы. Я просто не знаю, какие модели и объекты должны жить на сервере. Если бы вы могли указать мне на другие ресурсы, я был бы благодарен. – bornytm

ответ

3

Просто некоторые случайные указатели:

  • Я хотел бы предложить создание RESTful веб-API для обработки связи между Угловое и базы данных; вам не нужно создавать все маршруты самостоятельно, а также означает, что вы можете использовать большие библиотеки, такие как Restangular (для клиента) и Restify (для сервера) для обработки сообщений;
  • не уверен, какой драйвер Neo4j вы используете, но я уверен, что все они поддерживают параметризованные запросы, что означает, что вам не нужно делать все эти звонки query.replace() (see);
  • в зависимости от количества изображений, которые могут быть загружены, хранение их в файловой системе может быть в порядке, хотя вы никогда не должны доверять переданному имени файла; если вы хотите немного повысить масштабируемость, вы можете рассмотреть возможность использования MongoDB GridFS;
  • никогда не доверяет запросам, передаваемым от клиента, который должен выполняться на сервере; если вы можете создать запрос на стороне клиента, вы также можете создать его на стороне сервера с информацией, переданной от клиента на сервер (опять же, используйте параметризованные запросы);