Я - относительно новый веб-программист, и сейчас я работаю над своим первым крупным проектом. Я использую угловые, выражать (сверху узла) и базу данных диаграмм 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);
});
}
Неужели я об этом не совсем прав? Я никогда не получал формального введения в сценарии на стороне сервера, и я просто ушел от вещей, которые я читал. Я хотел бы сделать это «правильным способом», но мне нужно знать, что это первый способ ...
* «Что я ищу, это руководство по лучшим практикам, вопросам безопасности, которые необходимо учитывать, и любые другие соответствующие советы или подводные камни, о которых нужно знать при настройке брандмауэра веб-приложений». * Ваш вопрос слишком широка, как написано ..., можете ли вы сузить область действия? Есть книги, которые могут охватывать то, что вы ищете, на разумном количестве страниц. :) – WiredPrairie
Если бы вы могли рекомендовать любые книги, я был бы в восторге. Вы явно правы, хотя ... похоже, я не могу сформулировать краткий вопрос с теми знаниями, которые у меня есть сейчас. То, что может быть сразу полезно, объясняет, является ли отображение URL-адресов конкретным функциям плохим выбором дизайна и какие могут быть альтернативы. Я просто не знаю, какие модели и объекты должны жить на сервере. Если бы вы могли указать мне на другие ресурсы, я был бы благодарен. – bornytm