サーバーは盗難防止チェーンの写真を中継して、nodejsの上手なプロジェクトの簡明な教程

5118 ワード

個人ブログ:スコットアンの時間
サーバーは盗難防止チェーンの写真を中継して、nodejsの上手なプロジェクトの簡明な教程
先日ついでに書いたchromeプラグインは盗難チェーンの問題に出会いました.プラグインはjs iframeの方法で盗賊チェーンを防ぐことができないので、サーバーで乗り換えをしたいです.
上手な項目の各点を記録して、後でnodejsを使って、至るところ資料を調べなくてもいいです.
これまでは特におなじみのウェブ開発の枠組みがなかったが、プラグイン記憶サービスに依存するプラットフォームLeanCloudは、ちょうどnodejsウェブサイトの配置をサポートしていた.
どのように「防犯クラックチェーン」ですか?解読したいなら、まず目標を知らなければなりません.防犯チェーンはどうやって実現しますか?ほとんどのサイトのポリシーは簡単である:nodejs要求ヘッドのrequestが自局から来ているかどうかを判断する.もしそうでないなら、真実の画像へのアクセスを拒否します.
私達は知っています.要求ヘッドはクライアントから来たもので、偽造可能です.
考え方は正しいreferを偽造して訪問すればいいのではないですか?全体の業務ロジックは大体このようです.
  • 自己のサーババックグランドは、ターゲットピクチャreferパラメータを有する要求を受け付ける
  • .
  • 偽造url要求対象ピクチャ
  • は、要求されたデータをreferとして
  • に返す.
    これは写真の中継の役割を果たしました.
    1.プロジェクトはどうなりますか?
    1.1ポートの様子?
  • はオープンインターフェース
  • があります.
  • インターフェースにはパラメータがあります.response、このように長いです.
  • 応答内容は、盗難防止チェーン後の真の画像
  • である.
    1.2どうすればいいですか?
  • サーバを走らせます.
  • 処理GET要求
  • 解析要求パラメータ
  • ダウンロード原図
  • レスポンス原図
  • 2.学習経路(目標が未知であることを前提に疑問を提起する)
  • どうやってサーバーを開始しますか?
  • 基本要求GET POST
  • はどのように処理しますか?
  • どのように画像をダウンロードし、
  • に転送しますか?
  • 基本機能を完成し、オンライン
  • 最適化
  • 2.1どうやってサーバーを開始しますか?
    主にapi?url=http://abc.com/image.pngのこの方法で、サーバーを創立して、ポートを傍受してキーを押して解決します.
    var http = require('http');
        
    http.createServer(function (request, response) {
         // do things here
    }).listen(8888);
        
    console.log('Server running at: 8888');
    
    2.2基本要求GET POSTはどのように処理しますか?http.createServer().listen(port)コールバック方式の2つのパラメータcreateServer reqは、http resrequestの内容であり、彼らの内容を印刷してください.responserequestクラスで、そのInComingMessageフィールドを印刷します.
    var http = require('http');
    var url = require('url');
    var util = require('util');
    http.createServer(function(req, res){
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end(util.inspect(url.parse(req.url, true)));
    }).listen(3000);
    
    要求url請求の結果
    Url {
      protocol: null,
      slashes: null,
      auth: null,
      host: null,
      port: null,
      hostname: null,
      hash: null,
      search: '?url=http://abc.com/image.png',
      query: { url: 'http://abc.com/image.png' },
      pathname: '/api',
      path: '/api?url=http://abc.com/image.png',
      href: '/api?url=http://abc.com/image.png' }
    
    http://localhost:3000/api?url=http://abc.com/image.pngフィールドはちょうど私たちが欲しい内容です.このフィールドの対応する画像をダウンロードします.
    2.3どのように写真をダウンロードして転送しますか?queryモジュールは、パイプライン方法をサポートしており、requestのパイプラインと同様に理解できる.
    これは多くの事を省くことができて、現地で写真を保存する必要がなくて、雑多な事を処理する必要がなくて、甚だしきに至っては更にshellの流れを理解する必要がありません.一つの方法は全部解決します.
    重要な方法:nodejs

    var options = {
    uri: imgUrl, // uri , ,
    headers: {
    'Referer': referrer //
    }
    };
    request(options).pipe(res);
    2.4基本機能を完成し、オンライン
    プロジェクトのアドレス
    完全コード
        'use strict';
        var router = require('express').Router();
        var http = require('http');
        var url = require('url');
        var util = require('util');
        var fs = require('fs');
        var callfile = require('child_process');
        var request = require('request');
        
        router.get('/', function(req, res, next) {
            var imgUrl = url.parse(req.url, true).query.url;
            console.log(url.parse(req.url,true).query); 
        
            console.log('get a request for ' + imgUrl);
            if (imgUrl == null || imgUrl == "" || imgUrl == undefined) {
                console.log('end');
                res.end();
                return;
            }
        
            var parsedUrl = url.parse(imgUrl);
            //                Referer
            var referrer = parsedUrl.protocol + '//' + parsedUrl.host; 
            console.log('referrer ' + referrer);
        
            var options = {
              uri: imgUrl,
              headers: {
                 'Referer': referrer
              }
            };
        
            function callback(error, response, body) {
              if (!error && response.statusCode == 200) {
                console.log("type " + response.headers['content-type']);
              }
              res.end(response.body);
            }
        
            // request(options, callback);
            request(options)
                .on('error', function(err) {
                    console.log(err)
                })
                .pipe(res);
        });
        
        module.exports = router;
    
    2.5最適化
    この部分は主に盗難防止チェーン部分の最適化です.request(options).pipe(res)だけでは、空き値とホスト名の使用は一部の需要を満たすしかない.
    一つの最適化方式は組み合わせであり、一つの方法が突破できない場合は別の方式を採用する.この方式は適用面積を拡大し,どのシーンに対しても方法が一般的である点がある.
    最適化は、インターフェース要求パラメータバンドソース参照接続である.このような方式は多くの人にとってあまり通用しません.多くの場面ではソース引用がどこにつながっているか分かりません.しかし、私のプラグインにはとても適しています.プラグイン自体はソース参照を保持しています.そのため、防犯チェーンの制限をうまく回避できます.