1

私は比較的新しい Web プログラマーで、現在、最初の主要なプロジェクトに取り組んでいます。angular、express(ノードの上)、およびグラフデータベースneo4jを使用しています。現在、Web アプリがデータベースとやり取りする方法を設定するための (セキュリティと速度の最適化の観点から) 最善の方法を決定しようとしています。

今、私はこれにやや盲目的に取り組んでいるように感じます.アプリのバックエンド。

これをもう少し具体的に表現するために、今どのようにルートを設定しているかを説明します。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)

基本的に、機能を実行するだけのURLにPOSTまたはGETするように設定しています。基本的に、URL で実行したい関数に名前を付けています: /query/theNameOfTheFunction. 次に、これらの関数は、リクエスト内の情報を利用してサイファー クエリ (neo4j のクエリ言語) を作成してデータベースと対話するか、ユーザーがアップロードした画像の追加などを処理します。

例: コンテンツの作成 (URL: /query/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();
   });
}

ここでは、クエリのテンプレートを取得し、replace を使用してユーザーが生成した情報をドロップするだけです。

例:サーバーへの画像追加(URL:/create/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();
}

このアプローチはおそらくあまりスケーラブルではないようですが、サーバー側でコードを最適に編成する方法がわかりません。

もう 1 つの具体例として挙げておきたいのが、次の事例です。クエリ自体は複雑なので、とりあえずクライアント側で作成することにしました (クエリは、ユーザーが選択した用語に関連するコンテンツを検索し、それに応じて長さが異なります)。クライアントは、作成されたクエリを送信し、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);
    });
}

私はこのことについて完全に間違った方向に進んでいますか?私は、サーバー サイド スクリプトの正式な紹介を受けたことがなく、読んだことから離れているだけです。「正しい方法」でやりたいのですが、最初にその方法が何であるかを知る必要があります...

4

1 に答える 1