• 07-09-2024, 15:47:03
    #1
    Selamlar,

    Generic PHP ile şirket içerisinde kullanılmak üzere bir uygulama yazdık, dışarıya açık değil.

    Bu sistemin çalışma mantığında login sistemi tamamen LDAP ile yapılıyor ve içerideki tüm sayfalar ilk girişte almış olduğumuz SESSION verileri üzerinden işlem yapıyor. SESSION verileri daha sonradan değiştirilebildiği için bir güvenlik sorunu yaratılabilir diye düşünüyorum.

    Bunu engellemenin bir yöntemi var mıdır? Yada bunu SESSION kullanarak daha güvenli bir hale nasıl getirebilirim? Her sayfada LDAP sorgusu şeklinde yapılabilir fakat buda AD sunucularına bir yük oluşturabilir.

    Login sayfamda almış olduğum içerik ve SESSION verileri alt taraftadır;

        if ($ldap_entries['count'] == 1) {
            
                // Kullanıcının şifresini doğrulama
                    $user_dn = $ldap_entries[0]['dn'];
                    $ldap_auth_bind = ldap_bind($ldap_conn, $user_dn, $password);
    
                    if ($ldap_auth_bind) {
                
                // kullanıcı bilgileri doğruysa aşağıdaki bölümleri DC'den çek
                    $name = htmlspecialchars($ldap_entries[0]['givenname'][0], ENT_QUOTES, 'UTF-8');
                    $surname = htmlspecialchars($ldap_entries[0]['sn'][0], ENT_QUOTES, 'UTF-8');
                    $unvan = htmlspecialchars($ldap_entries[0]['title'][0], ENT_QUOTES, 'UTF-8');
                    $email = htmlspecialchars($ldap_entries[0]['mail'][0], ENT_QUOTES, 'UTF-8');
                    $dahilino = htmlspecialchars($ldap_entries[0]['telephonenumber'][0], ENT_QUOTES, 'UTF-8');
                    $gsmno = htmlspecialchars($ldap_entries[0]['mobile'][0], ENT_QUOTES, 'UTF-8');
                    $engUnvan = htmlspecialchars($ldap_entries[0]['comment'][0], ENT_QUOTES, 'UTF-8');
                    $Sube = htmlspecialchars($ldap_entries[0]['physicaldeliveryofficename'][0], ENT_QUOTES, 'UTF-8');
                    $departmanBilgisi = htmlspecialchars($ldap_entries[0]['department'][0], ENT_QUOTES, 'UTF-8');
                    $firmaBilgisi = $ldap_entries[0]["company"][0];
    
                    // Oturumda kullanıcı bilgilerini değişkene atayıp sessiona kaydet
                    $_SESSION['name'] = $name;
                    $_SESSION['surname'] = $surname;
                    $_SESSION['unvan'] = $unvan;
                    $_SESSION['username'] = $username;
                    $_SESSION['mail'] = $email;
                    $_SESSION['telephonenumber'] = $dahilino;
                    $_SESSION['mobile'] = $gsmno;
                    $_SESSION['comment'] = $engUnvan;
                    $_SESSION['physicaldeliveryofficename'] = $Sube;
                    $_SESSION['department'] = $departmanBilgisi;
                    $_SESSION['company'] = $firmaBilgisi;
    
                    // Bir kez giriş yaptıktan sonra cookie üzerinde tutulacak bilgiler
                    setcookie('username_remember', $username, time() + (60 * 60 * 24 * 30), '/');
                    setcookie('name_remember', $name, time() + (60 * 60 * 24 * 30), '/');
                    setcookie('surname_remember', $surname, time() + (60 * 60 * 24 * 30), '/');
                    setcookie('unvan_remember', $unvan, time() + (60 * 60 * 24 * 30), '/');
                    setcookie('email_remember', $email, time() + (60 * 60 * 24 * 30), '/');
    
                    // 4 saat session süresi
                    ini_set('session.gc_maxlifetime', 14400);
                    ini_set('session.cookie_lifetime', 14400);
                    
            header('Location: index.php');
                    exit();
    
                } else {
                    // Yanlış şifre
                    echo '
                        <script>
                            document.addEventListener("DOMContentLoaded", function () {
                                Swal.fire({
                                    icon: "error",
                                    title: "Hata",
                                    text: "Kullanıcı adı veya şifrenizi kontrol ediniz.",
                                    showConfirmButton: false,
                                    timer: 1500
                                });
                            });
                        </script>
                    ';
                }
            } else {
                // Kullanıcı bulunamadı veya birden fazla sonuç var
                echo '
                    <script>
                        document.addEventListener("DOMContentLoaded", function () {
                            Swal.fire({
                                icon: "error",
                                title: "Hata",
                                text: "Kullanıcı adı veya şifrenizi kontrol ediniz.",
                                showConfirmButton: false,
                                timer: 1500
                            });
                        });
                    </script>
                ';
            }
  • 07-09-2024, 15:49:25
    #2
    hocam giriş yapan kullanıcı için bir token tanıplayıp db de güncelleyin session ile yapacağınız işlemlerde bu tokeni kontrol edin. Token eşleşmiyorsa işlem yaptırmayın.
  • 07-09-2024, 15:56:14
    #3
    turkaz18 adlı üyeden alıntı: mesajı görüntüle
    hocam giriş yapan kullanıcı için bir token tanıplayıp db de güncelleyin session ile yapacağınız işlemlerde bu tokeni kontrol edin. Token eşleşmiyorsa işlem yaptırmayın.
    Teşekkür ederim, çok mantıklı.

    SESSION'ları yine sayfalarda verileri kullanmak için tutabilirim fakat yetki kontrolü için token kullanmak gerçekten mantıklı gözüküyor. Peki, token tutarken veritabanı yapım şu şekilde olması yeterli midir? Harici olarak bir veri tutmak gerekir mi?

    CREATE TABLE user_tokens (    
     id INT AUTO_INCREMENT PRIMARY KEY,    
     username VARCHAR(255) NOT NULL,    
     token VARCHAR(255) NOT NULL,    
     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    
     expires_at TIMESTAMP NOT NULL );
  • 07-09-2024, 15:57:33
    #4
    turansonkaya adlı üyeden alıntı: mesajı görüntüle
    Teşekkür ederim, çok mantıklı.

    SESSION'ları yine sayfalarda verileri kullanmak için tutabilirim fakat yetki kontrolü için token kullanmak gerçekten mantıklı gözüküyor. Peki, token tutarken veritabanı yapım şu şekilde olması yeterli midir? Harici olarak bir veri tutmak gerekir mi?

    CREATE TABLE user_tokens (    
     id INT AUTO_INCREMENT PRIMARY KEY,    
     username VARCHAR(255) NOT NULL,    
     token VARCHAR(255) NOT NULL,    
     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    
     expires_at TIMESTAMP NOT NULL );
    hocam sessionu username ile tutuyorsanız doğru id ile tutuyorsanız id yazmak mantıklı yeterli gözüküyor.
  • 07-09-2024, 20:07:56
    #5
    Session da tuttuğun verileri sifrele. Örnek doküman https://www.javatpoint.com/how-to-en...20respectively.