Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Geçen bir grupda .env dosyasına sunucu bilgilerini yazdığı için sitesinin hacklendiğini iddia eden birisi oldu , bu ne kadar doğru ? siteadi.com/.env yazınca dosyaya ulaşılamıyor ki nasıl hackleniyor ?

birde bazı github projelerinde

$table->increments('id');
$table->bigIncrements('id)
gibi iki farklı kullanım görüyorum, neden yazıyorlar bunu ? normalde $table->id(); yazınca zaten otomatik artıyor , bu kullanımların özel bir nedeni var mı ?

    kartal

    Merhaba tüm dosyaları public_html altına atarsa .env dosyasına ulaşılabilir. htaccess ile yada sunucu tarafında engellenmesi gerekir o yüzden public klasörüne sadece laravel altında bulunan public kısmı atılır.

    Edit : Yada Symlink oluştrarak root altına bir klasöre atılabilir.

    Diğer sorunuza gelince laravel sürümleri ile alakalı bir kullanım şekilleri

    Laravel 5.* (Emin değilim)
    $table->increments('id');

    Laravel 6.*
    $table->bigIncrements('id)

    Laravel 7.*
    $table->id();

    Saygılar

    kartal .env dosyasını göndermezseniz config klasörü içerisindeki ayarlar devreye girer; gönderirseniz .env dosyasındaki ayarlar devreye girer. O yüzden dev/staging ortamında .env dosyası sunucuya gönderilir; prod ortamında gönderilmez. Böylece iki farklı ortamda config klasöründeki ayarları ellemeden farklı bilgileri kullanabilirsiniz. artisan config:cache sayesinde de artık .env dosyası prod ortamında gönderilebiliyor. Bu .env ile ilgili forumda konular mevcut.

    Eğer $table->id() yöntemini takip ederseniz sırayla şunlara ulaşırsınız:

    /**
     * Create a new auto-incrementing big integer (8-byte) column on the table.
     *
     * @param  string  $column
     * @return \Illuminate\Database\Schema\ColumnDefinition
     */
    public function id($column = 'id')
    {
        return $this->bigIncrements($column);
    }
    
    /**
     * Create a new auto-incrementing big integer (8-byte) column on the table.
     *
     * @param  string  $column
     * @return \Illuminate\Database\Schema\ColumnDefinition
     */
    public function bigIncrements($column)
    {
        return $this->unsignedBigInteger($column, true);
    }
    
    /**
     * Create a new unsigned big integer (8-byte) column on the table.
     *
     * @param  string  $column
     * @param  bool  $autoIncrement
     * @return \Illuminate\Database\Schema\ColumnDefinition
     */
    public function unsignedBigInteger($column, $autoIncrement = false)
    {
        return $this->bigInteger($column, $autoIncrement, true);
    }
    
    /**
     * Create a new big integer (8-byte) column on the table.
     *
     * @param  string  $column
     * @param  bool  $autoIncrement
     * @param  bool  $unsigned
     * @return \Illuminate\Database\Schema\ColumnDefinition
     */
    public function bigInteger($column, $autoIncrement = false, $unsigned = false)
    {
        return $this->addColumn('bigInteger', $column, compact('autoIncrement', 'unsigned'));
    }

    Bu işi ciddiye alıyorsanız kod okuma alışkanlığı kazanmanız lazım.

      mgsmus

      Bu işi ciddiye alıyorsanız kod okuma alışkanlığı kazanmanız lazım. Bu kısmı üzerime alındım 😃 Bende de yok o alışkanlık.

      4 gün sonra

      mgsmus rtisan config:cache sayesinde de artık .env dosyası prod ortamında gönderilebiliyor.

      hocam burda ne demek istediniz tam olarak,anlayamadım da 🙁

      php artisan config:cache komutunu çalıştırdığınızda env içindeki ayarlar cacheleniyor. Bütün ayarlar bootstrap/cache içerisinde oluşan config.php idi sanırsam oradan çağrılıyor.
      Yani proje tamamlanıp, sunucuya attıktan sonra bu komutu çalıştırıp, ardından .env silebilirsiniz sunucudan.

        BoraN7 ozamanda yine güvenlik açığı oluşturmuyor mu ?

          BoraN7 Hayır dosyayı silmiyorsunuz.

          kartal Güvenlik açığı olabilmesi için dışarıdan erişilebilen bir yerde olması lazım. Sizin projenizde ise dışarıdan erişilebilen tek yer public klasörüdür. Zaten public klasörü dışında bir yere erişilebiliyorsa başka sorun var demektir. Web sunucusunda document root olarak public olduğu sürece sorun olmaz.

            mgsmus ben silmiştim bir hata çıkarmadı. Config cache yapınca env dosyasının bir hükmü kalıyor mu? Oradan bir ayar değiştirince etki etmiyor çünkü o durumda.

              BoraN7 Silebilirsiniz ama kişisel tercih olarak. Ben "config:cache yapıldıktan sonra .env dosyası silinir" gibi önerilen bir yol olmadığını belirtmek için silmiyorsunuz dedim. O dosya genellikle GIT'e dahil edilmez, anlık sunucuya eklenir, özellikle çok fazla 3. parti servis kullanıyorsanız ve bunları .env içerisinde tanımladıysanız bunlara bazen bakmanız gerekebiliyor. (bootstrap/config.php içerisinden bakmak sıkıntılı olacaktır)

              kartal .env'ye direkt erişemiyor. Belki app_debug true kalmıştır öyle olunce .env'nin içeriği hata kodlarında ortaya dökülüyor

              3 ay sonra

              .env dosyasını controller üzerinden manipüle etmenin bir yolu var mı? Mesela ayarlar menüsü oluşturup buradan database bilgilerini yönetebilir miyiz?

                aybarsalvarci .env dosyası ayar dosyası değildir. Bir uygulama birden fazla ortamda yer alır. Bunlar en az 3 tanedir, biri sizin bilgisayarınız (local), biri geliştirme/test (dev/development) ortamı, diğeri ise canlı (prod/production). Arada fazladan önizleme (stag/staging) gibi ortamlar da olabilir. Her bir ortamın kendine farklı ayarları olur. Örneğin dev ortamının veritabanı bilgileri, mail bilgileri farklıdır; canlı ortamınki farklıdır. İşte farklı ortamlarda farklı ayarlar kullanmak için env dosyası kullanılır:

                +-------------+---------+-------------+-------------+
                |             |  local  |     dev     |    prod     |
                +-------------+---------+-------------+-------------+
                | DB_DATABASE | projedb | dev_db_1    | prod_db_1   |
                | DB_USERNAME | root    | dev_db_usr  | prod_db_usr |
                | DB_PASSWORD | root    | VysE(=b9veu | x~L'DK6s36: |
                +-------------+---------+-------------+-------------+

                Üstteki tablo 3 farklı ortamdaki 3 farklı .env dosyasındaki değişkenlerin nasıl değiştiğini gösteriyor.

                .env dosyası GIT'e dahil edilmez, (genellikle) elle sunucuya eklenir.

                Ayarlar dediğimiz kök dizindeki config klasörünün içerisidir. Bu dosyalardaki env('DB_DATABASE', 'prod_db_1') şeklinde kullanılan env() yönteminin yaptığı iş ".env dosyası varsa ve içinde DB_DATABASE değeri varsa onu kullan, yoksa prod_db_1 değerini kullan" demektir. İhtiyaçlarına göre prod ortamına da .env dosyası gönderenler var. Ben prod bilgilerini config dosyasına işliyorum, prod ortamına .env dosyası koymuyorum. Böylece prod ortamında env() yöntemi sayesinde otomatik olarak config klasöründeki değerler okunuyor.

                Veritabanından ayarları okuma ya da ayarları anlık değiştirme gibi konularda forumda arama yapabilirsiniz. Ben burada bunun cevabını vermedim. Verdiğim cevabın amacı .env dosyasını controller üzerinden manipüle etmeyeceksiniz, o dosya düşündüğünüz dosya değil demek için.

                Dokümanları okuyalım. İngilizcemiz yetmiyorsa İngilizcemizi geliştirelim:
                https://laravel.com/docs/8.x/configuration

                aybarsalvarci Bu da isteğinizi karşılayabilir:

                class Setting extends Model
                {
                    public const CACHE_KEY = 'settings';
                
                    protected $casts = [
                        'value' => 'array'
                    ];
                
                    public static function loadAsConfig(): void
                    {
                        config([
                            'settings' => cache()->rememberForever(
                                static::CACHE_KEY,
                                fn() => static::all(['name', 'value'])
                                    ->keyBy('name')
                                    ->transform(fn($setting) => $setting->value)
                                    ->toArray()
                            )
                        ]);
                    }
                
                    protected static function booted(): void
                    {
                        static::saved(fn($setting) => cache()->forget(static::CACHE_KEY));
                    }
                }
                // Sonra Setting::loadAsConfig() yöntemini bir servis sağlayıcının 
                // boot yöntemi içerisinde belirtmemiz yeterli. Örneğin:
                // app/Providers/AppServiceProvider.php
                public function boot()
                {
                    Setting::loadAsConfig();
                }
                settings
                +----+----------------------+------------------------------------+
                | id | name(varchar,unique) |            value(jsonb)            |
                +----+----------------------+------------------------------------+
                |  1 | dues                 | {"fee":45.5,"last_payment_day":10} |
                |  2 | keywords             | php,laravel                        |
                +----+----------------------+------------------------------------+
                $fee = config('settings.dues.fee'); // 45.5
                
                $dueDate = now()->setDay(config('settings.dues.last_payment_day')); // 2020-10-10 17:45:23
                
                $keywords = config('settings.keywords'); // "php,laravel"

                @mgsmus Teşekkür ederim. Ayarları config üzerinden ayarlamalar yapılmalı o zaman. .env dosyasını göndermemek lazım.
                Dökumantasyonu dediğiniz gibi ingilizce seviyesinden dolayı okumadım. Biraz geliştirip okumaya çalışacağım.