データベースIDをあなたのURLに公開しないでください


Webアプリを開発するとき、我々はしばしばデータベースから情報を取り出すことに頼ります.フレームワークは、この簡単な感謝をする方法を提供しますORMs .
ほとんどの場合、ORMは信頼できる識別子としてプライマリキーを使用してモデルを見つけます.大多数の場合、主キーは自動インクリメント整数である.
あなたのURLは次のようになります.
https://example.com/cart/12
https://example.com/user/15/post/41
...
不適切であるか不完全な認可層を提供することはデータ漏出をつくることができます:ユーザーはデータからデータまで動くことができます.

識別子の難読化


このセキュリティ違反を緩和する簡単な方法は、以下のキーを使用することです.
  • 予測するのが難しい
  • それらの間の不和を維持しながら、アイテムの多くを作成することができるように十分なランダム
  • 簡単にコードとデータベースから生成する
  • チェック可能(我々は、それが有効であるかどうか、その完全性を分析することによって知ることができます)
  • ありがとう.UUIDs それは非常に良い候補です.それは上記のすべての点をチェックして、使用のために準備ができているパッケージの広い範囲のおかげで非常に簡単です.
    あなたのURLは今、あなたのアプリケーションの承認ポリシーについての開発者のミスを軽減する予測するのは困難になります
    https://example.com/cart/f6e4208f-5df4-466e-9225-01f296e2a09c
    https://example.com/user/b1b44b12-34bc-4ed7-a666-9657b8b8c31b/post/e530d034-42f7-467b-91e3-1cc9313312eb
    

    laravelアプリの例


    開発を実践するにはLaravel パッケージ、そして私の初めての使用Github Workflow , 私は、この仕事を微風にするパッケージを作成しました.
    使用方法はこちらkhalyomede/laravel-eloquent-uuid-slug 今すぐあなたのアプリケーションで.

    パッケージのインストール


    まず、コンソールに頭を置き、このコマンドを入力します.
    composer require khalyomede/laravel-eloquent-uuid-slug
    

    あなたの移動にスラグコラムを追加


    では、migrationmodel 選択した場合、または既にインストールされている場合は、新しいものを作成し、スラグの列を追加します.
    namespace Database\Migrations;
    
    use App\Models\Cart;
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    final class AddSlugColumnToCartTable extends Migration {
      public function up(): void
      {
        Schema::table('carts', function (Blueprint $table): void {
          Cart::addSlugColumn($table);
        });
      }
    
      public function down(): void
      {
        Schema::table('carts', function (Blueprint $table): void {
          Cart::dropSlugColumn($table); // available soon in v0.2.0
        });
      }
    };
    

    モデルにトレードを追加する


    これは、あなたのモデルがあなたのルートでretreivedされる方法を構成するのを助ける最後のステップですRoute model binding .
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use Khalyomede\EloquentUuidSlug\Sluggable;
    
    final class Cart extends Model
    {
      use Sluggable;
    }
    

    お使いのコントローラーで使用してください


    今すぐパッケージを利用する準備が整いました.素晴らしいことは、コードが変更されないことです!使用し続けることができますroute() 閉じるこの動画はお気に入りから削除されています.
    // routes/web.php
    
    use App\Models\Cart;
    use Illuminate\Http\RedirectResponse
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Route;
    use Illuminate\View\View;
    
    Route::get("cart/{cart}", function (Cart $cart): View {
      return view("cart.show", [
        "cart" => $cart,
        "saveCartRoute" => route("cart.store", $cart),
      ]);
    })->name("cart.show");
    
    Route::post("cart/{cart}", function (Request $request, Cart $cart): RedirectResponse {
      $cart->update($request->only(["name"]));
    
      return redirect()->route("cart.show", $cart);
    })->name("cart.store");
    
    そして、Vilは引きます!このパッケージは、あなたが見ることができるように、既存のロジックとやりとりしません.変更が現在あなたのルートが露出していない唯一のもの.
    route("cart.show", $cart); // https://example.com/cart/398e76a7-7c16-467c-93a8-04c06c6df703
    

    結論


    この解決策は、データリークの初期の問題を解決するための魔法の方法ではありませんが、悪意のあるユーザーがあなたのシステムを騙す可能性を減らすために、非常に簡単な有効なメセアであることがわかります.
    これは、あなたが認可またはガードメカニズムを加えるのを防ぐことができませんLaravel Policies 例えば.たとえば、ユーザーが彼/彼女によって作成されていないカートに移動する場合は、それを表示することはできません.
    他の人々はすでにこの主題について話しました、それで、UUIDを使用することについてより多くを読みたいならば、それを行ってください.






    ハッピーURL硬化!