Çözüldü Lisans sistemi nasıl yapılır?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Poisonox

Picopat
Katılım
23 Aralık 2023
Mesajlar
154
Çözümler
5
Daha fazla  
Cinsiyet
Erkek
Meslek
Bilgisayar Ve Makine Ö. Uzmanı
Merhaba arkadaşlar. Ben Python ile düzenli olarak uygulamalar geliştirmekteyim. Bu geliştirdiğim programları ticari amaç için kullanacağım. Bunun içinde uygulamalara bir lisans sistemi entegre etmem gerekiyor. Lisans sistemi ile alakalı hiç proje yapmamıştık ve bu konuda bilgi sahibi değilim. Bilgili arkadaşların yardım etmesinden memnuniyet duyarım. (MySQL kullanacağım VDS üzerinden.)
 
Çözüm
Nasıl hallettiniz hocam, detayları paylaşırsanız başkalarının da işine yarar.
Bir kişiden yardım alaraktan hallettim. Sistem üst seviyede oldu manipüle edilmesi zor. Kayıt defteri ve Makine ID'si ile kontrol yapıyoruz. Sistem şu şekilde MySQL bağlantısı kullanarak sistem bilgisayarın makine ID sini alır ardından regedit'e bir veri kaydeder. Bu veriler tabloya yazılır. Ve daha sonraki kullanımlarda bu veri sürekli kontrol edilir. Regedit'de kod manipüle edilmeye çalışılırsa sistem tekrar açılırsa okunacak veri yanlış olduğu için lisanlaslama iptal olur. Eğer kopya oluşturulup başka bir Makineye entegre edilirse makine ID bulunamaz lisanslama iptal olur. Python veri biliminde üst seviyedir asla yavaş kalmaz.
Ben projelerimde HDD ve cpu seri numaraları kullanılarak offline lisanlama yapıyorum. Belli. Bir algoritmadan geçip karşılığını soruyor kaydıda regeditte turuyorum. Dil olarka c# kullandım hep, senin sorun Python olduğu için teknik anlamda yardımcı olamıcam. Ama benim mantığım bu şekildedir.
 
Merhaba arkadaşlar. Ben Python ile düzenli olarak uygulamalar geliştirmekteyim. Bu geliştirdiğim programları ticari amaç için kullanacağım. Bunun içinde uygulamalara bir lisans sistemi entegre etmem gerekiyor. Lisans sistemi ile alakalı hiç proje yapmamıştık ve bu konuda bilgi sahibi değilim. Bilgili arkadaşların yardım etmesinden memnuniyet duyarım. (MySQL kullanacağım VDS üzerinden.)
Node.JS tabanlı basit bir PIN sistemi kodlamıştım, buradada kodları:

frameWork.js
JavaScript:
// requirements
const express = require('express');
const fs = require('fs');
const axios = require('axios');
const chalk = require('chalk');

// application
const app = express();
const port = 4563; // you can change it as you wish.

// DO NOT CHANGE THEM!
const ipLicenseMap = {};
const usedLicenses = {};
const frameWork = "framework-dev"
const frameWorkPrefix = chalk.blue("[Framework]");

// configuration
const configRaw = fs.readFileSync('frameworkConfig.json');
const config = JSON.parse(configRaw);

// configuration -> values
const enableDiscordWebhooks = config.ENABLE_DISCORD_WEBHOOKS;
const discordWebhookLink = config.DISCORD_WEBHOOK_LINK;

// generatin' a unique license code according to the request from user.
function generateLicense() {
    return Math.random().toString(36).substring(2, 10).toUpperCase();
}

app.get('/createpin', (req, res) => {
    // getting client ip
    const clientIP = req.ip;

    if (ipLicenseMap[clientIP]) {
        const previousPin = ipLicenseMap[clientIP];
        const errorMessage = {
            error: 'You have previously requested to generate a PIN.',
            pin: previousPin,
            providedBy: frameWork
        };

        res.status(403).json(errorMessage);
        sendWebhookMessage(JSON.stringify(errorMessage)); // send webhook if its enabled.
        return;
    }

    const licenseCode = generateLicense();

    ipLicenseMap[clientIP] = licenseCode;
    usedLicenses[licenseCode] = false; // license has not been used yet.

    setTimeout(() => {
        delete ipLicenseMap[clientIP];
        console.log(`${frameWorkPrefix} ${clientIP} deleted from the license map.`);
    }, 5 * 60 * 1000); // the timeout is cleared after 5 mins.

    const successMessage = {
        pin: licenseCode,
        providedBy: frameWork
    };

    res.json(successMessage);
    sendWebhookMessage(JSON.stringify(successMessage)); // send webhook if its enabled.

    usedLicenses[licenseCode] = false;
});

app.get('/verify/:licensecode', (req, res) => {
    const licenseCodeToVerify = req.params.licensecode;

    if (isLicenseValid(licenseCodeToVerify)) {
        const verificationMessage = {
            message: 'Access granted. License code is valid.',
            providedBy: frameWork
        };

        usedLicenses[licenseCodeToVerify] = true; // license has been used.

        delete ipLicenseMap[licenseCodeToVerify];

        res.json(verificationMessage);
        sendWebhookMessage(JSON.stringify(verificationMessage));
    } else {
        const errorMessage = {
            error: 'Access denied. Invalid license code.',
            providedBy: frameWork
        };

        res.status(403).json(errorMessage);
        sendWebhookMessage(JSON.stringify(errorMessage));
    }
});

app.listen(port, () => {
    console.log(`${frameWorkPrefix} Framework License is running at http://localhost:${port}`);

    if (enableDiscordWebhooks) {
        console.log(`${frameWorkPrefix} Discord Webhooks are enabled. Webhook Link: ${discordWebhookLink}`);
    } else {
        console.log(`${frameWorkPrefix} Discord Webhooks are disabled.`);
    }

    console.log(`\n${frameWorkPrefix} PINs are running at http://localhost:${port}/createPin\n${frameWorkPrefix} Verification system is running at http://localhost:${port}/verify/:licensecode`)
});

function sendWebhookMessage(message) {
    if (enableDiscordWebhooks) {
        axios.post(discordWebhookLink, {
            content: message,
        })
        .then(response => {
            console.log(`${frameWorkPrefix} Webhook message received.`);
        })
        .catch(error => {
            console.error(`${frameWorkPrefix} Error sending webhook message.`);
        });
    } // you can also add else {} here to send log for skippin' message.
}

function isLicenseValid(licenseCode) {
    if (!usedLicenses[licenseCode]) {
            return true;  // valid license
        } else {
            return false; // invalid ''
        }
}

Ayrıca, kendine özel bir config sistemi veya hali hazırda yukarıdaki kodu configsiz hale getirebilirsin.
 
Node.JS tabanlı basit bir PIN sistemi kodlamıştım, buradada kodları:

frameWork.js
JavaScript:
// requirements
const express = require('express');
const fs = require('fs');
const axios = require('axios');
const chalk = require('chalk');

// application
const app = express();
const port = 4563; // you can change it as you wish.

// DO NOT CHANGE THEM!
const ipLicenseMap = {};
const usedLicenses = {};
const frameWork = "framework-dev"
const frameWorkPrefix = chalk.blue("[Framework]");

// configuration
const configRaw = fs.readFileSync('frameworkConfig.json');
const config = JSON.parse(configRaw);

// configuration -> values
const enableDiscordWebhooks = config.ENABLE_DISCORD_WEBHOOKS;
const discordWebhookLink = config.DISCORD_WEBHOOK_LINK;

// generatin' a unique license code according to the request from user.
function generateLicense() {
    return Math.random().toString(36).substring(2, 10).toUpperCase();
}

app.get('/createpin', (req, res) => {
    // getting client ip
    const clientIP = req.ip;

    if (ipLicenseMap[clientIP]) {
        const previousPin = ipLicenseMap[clientIP];
        const errorMessage = {
            error: 'You have previously requested to generate a PIN.',
            pin: previousPin,
            providedBy: frameWork
        };

        res.status(403).json(errorMessage);
        sendWebhookMessage(JSON.stringify(errorMessage)); // send webhook if its enabled.
        return;
    }

    const licenseCode = generateLicense();

    ipLicenseMap[clientIP] = licenseCode;
    usedLicenses[licenseCode] = false; // license has not been used yet.

    setTimeout(() => {
        delete ipLicenseMap[clientIP];
        console.log(`${frameWorkPrefix} ${clientIP} deleted from the license map.`);
    }, 5 * 60 * 1000); // the timeout is cleared after 5 mins.

    const successMessage = {
        pin: licenseCode,
        providedBy: frameWork
    };

    res.json(successMessage);
    sendWebhookMessage(JSON.stringify(successMessage)); // send webhook if its enabled.

    usedLicenses[licenseCode] = false;
});

app.get('/verify/:licensecode', (req, res) => {
    const licenseCodeToVerify = req.params.licensecode;

    if (isLicenseValid(licenseCodeToVerify)) {
        const verificationMessage = {
            message: 'Access granted. License code is valid.',
            providedBy: frameWork
        };

        usedLicenses[licenseCodeToVerify] = true; // license has been used.

        delete ipLicenseMap[licenseCodeToVerify];

        res.json(verificationMessage);
        sendWebhookMessage(JSON.stringify(verificationMessage));
    } else {
        const errorMessage = {
            error: 'Access denied. Invalid license code.',
            providedBy: frameWork
        };

        res.status(403).json(errorMessage);
        sendWebhookMessage(JSON.stringify(errorMessage));
    }
});

app.listen(port, () => {
    console.log(`${frameWorkPrefix} Framework License is running at http://localhost:${port}`);

    if (enableDiscordWebhooks) {
        console.log(`${frameWorkPrefix} Discord Webhooks are enabled. Webhook Link: ${discordWebhookLink}`);
    } else {
        console.log(`${frameWorkPrefix} Discord Webhooks are disabled.`);
    }

    console.log(`\n${frameWorkPrefix} PINs are running at http://localhost:${port}/createPin\n${frameWorkPrefix} Verification system is running at http://localhost:${port}/verify/:licensecode`)
});

function sendWebhookMessage(message) {
    if (enableDiscordWebhooks) {
        axios.post(discordWebhookLink, {
            content: message,
        })
        .then(response => {
            console.log(`${frameWorkPrefix} Webhook message received.`);
        })
        .catch(error => {
            console.error(`${frameWorkPrefix} Error sending webhook message.`);
        });
    } // you can also add else {} here to send log for skippin' message.
}

function isLicenseValid(licenseCode) {
    if (!usedLicenses[licenseCode]) {
            return true;  // valid license
        } else {
            return false; // invalid ''
        }
}

Ayrıca, kendine özel bir config sistemi veya hali hazırda yukarıdaki kodu configsiz hale getirebilirsin.
Evet bu kodlar işe yarayabilir. Fakat benim Python kullanmam gerekiyor. Projemizde full Python kullanılması gerekiyor. Yine de teşekkür ederim. :)

Ben projelerimde HDD ve cpu seri numaraları kullanılarak offline lisanlama yapıyorum. Belli. Bir algoritmadan geçip karşılığını soruyor kaydıda regeditte turuyorum. Dil olarka c# kullandım hep, senin sorun Python olduğu için teknik anlamda yardımcı olamıcam. Ama benim mantığım bu şekildedir.
Node.JS tabanlı basit bir PIN sistemi kodlamıştım, buradada kodları:

frameWork.js
JavaScript:
// requirements
const express = require('express');
const fs = require('fs');
const axios = require('axios');
const chalk = require('chalk');

// application
const app = express();
const port = 4563; // you can change it as you wish.

// DO NOT CHANGE THEM!
const ipLicenseMap = {};
const usedLicenses = {};
const frameWork = "framework-dev"
const frameWorkPrefix = chalk.blue("[Framework]");

// configuration
const configRaw = fs.readFileSync('frameworkConfig.json');
const config = JSON.parse(configRaw);

// configuration -> values
const enableDiscordWebhooks = config.ENABLE_DISCORD_WEBHOOKS;
const discordWebhookLink = config.DISCORD_WEBHOOK_LINK;

// generatin' a unique license code according to the request from user.
function generateLicense() {
    return Math.random().toString(36).substring(2, 10).toUpperCase();
}

app.get('/createpin', (req, res) => {
    // getting client ip
    const clientIP = req.ip;

    if (ipLicenseMap[clientIP]) {
        const previousPin = ipLicenseMap[clientIP];
        const errorMessage = {
            error: 'You have previously requested to generate a PIN.',
            pin: previousPin,
            providedBy: frameWork
        };

        res.status(403).json(errorMessage);
        sendWebhookMessage(JSON.stringify(errorMessage)); // send webhook if its enabled.
        return;
    }

    const licenseCode = generateLicense();

    ipLicenseMap[clientIP] = licenseCode;
    usedLicenses[licenseCode] = false; // license has not been used yet.

    setTimeout(() => {
        delete ipLicenseMap[clientIP];
        console.log(`${frameWorkPrefix} ${clientIP} deleted from the license map.`);
    }, 5 * 60 * 1000); // the timeout is cleared after 5 mins.

    const successMessage = {
        pin: licenseCode,
        providedBy: frameWork
    };

    res.json(successMessage);
    sendWebhookMessage(JSON.stringify(successMessage)); // send webhook if its enabled.

    usedLicenses[licenseCode] = false;
});

app.get('/verify/:licensecode', (req, res) => {
    const licenseCodeToVerify = req.params.licensecode;

    if (isLicenseValid(licenseCodeToVerify)) {
        const verificationMessage = {
            message: 'Access granted. License code is valid.',
            providedBy: frameWork
        };

        usedLicenses[licenseCodeToVerify] = true; // license has been used.

        delete ipLicenseMap[licenseCodeToVerify];

        res.json(verificationMessage);
        sendWebhookMessage(JSON.stringify(verificationMessage));
    } else {
        const errorMessage = {
            error: 'Access denied. Invalid license code.',
            providedBy: frameWork
        };

        res.status(403).json(errorMessage);
        sendWebhookMessage(JSON.stringify(errorMessage));
    }
});

app.listen(port, () => {
    console.log(`${frameWorkPrefix} Framework License is running at http://localhost:${port}`);

    if (enableDiscordWebhooks) {
        console.log(`${frameWorkPrefix} Discord Webhooks are enabled. Webhook Link: ${discordWebhookLink}`);
    } else {
        console.log(`${frameWorkPrefix} Discord Webhooks are disabled.`);
    }

    console.log(`\n${frameWorkPrefix} PINs are running at http://localhost:${port}/createPin\n${frameWorkPrefix} Verification system is running at http://localhost:${port}/verify/:licensecode`)
});

function sendWebhookMessage(message) {
    if (enableDiscordWebhooks) {
        axios.post(discordWebhookLink, {
            content: message,
        })
        .then(response => {
            console.log(`${frameWorkPrefix} Webhook message received.`);
        })
        .catch(error => {
            console.error(`${frameWorkPrefix} Error sending webhook message.`);
        });
    } // you can also add else {} here to send log for skippin' message.
}

function isLicenseValid(licenseCode) {
    if (!usedLicenses[licenseCode]) {
            return true;  // valid license
        } else {
            return false; // invalid ''
        }
}

Ayrıca, kendine özel bir config sistemi veya hali hazırda yukarıdaki kodu configsiz hale getirebilirsin.

Önerileriniz ve yardımınız için çok teşekkürler. Bu kodlardan esinlenip bir şeyler yapabilirim. Benim en büyük sorunlarımdan biri bu kodları nasıl veritabanına bağlayacağım ve bu kodları uygulamamın direk içine mi entegre edeceğim? Çünkü ben .exe olarak çıktı alacağım ve onedir olarak. Ne yapmam gerekir? (MySQL kullanmak istiyorum VDS ile.)
 
Evet bu kodlar işe yarayabilir. Fakat benim Python kullanmam gerekiyor. Projemizde Full Python kullanılması gerekiyor. Yine de teşekkür ederim. :)

Önerileriniz ve yardımınız için çok teşekkürler. Bu kodlardan esinlenip bir şeyler yapabilirim. Benim en büyük sorunlarımdan biri bu kodları nasıl veritabanına bağlayacağım ve bu kodları uygulamamın direk içine mi entegre edeceğim? Çünkü ben .exe olarak çıktı alacağım ve onedir olarak. Ne yapmam gerekir? (MySQL kullanmak istiyorum VDS ile.)

MySQL tabanlı bir lisans sistemi veya uygulamanızın backend işlemlerini ücretli bir şekilde gerçekleştirebilirim. Makul bir fiyat tutarım, eğer ilgilenirseniz iletişime geçebiliriz.

Ayrıca belirtmek isterim ki, bu tür uygulamarın lisans sistemi genellikle Node.JS tabanlı oluyor, Python bildiğiniz üzere diğer dillere göre biraz yavaş kalmakta ve hızlı respond süresi alabilmek için genellikle Node.JS kullanılıyor.

Projenizin herkese açık olacağını varsayıyorum ve en ufak bir açıkta programınıza/projenize giriş yapabilirler. Buna Reverse Engineering diyorlar. Herhangi bir HTTP Debugger ile lisans sistemini kendi sistemlerinde SKIP-OUT edebilirler ve bununda uygulamanız/projeniz için olumsuz yönleri olabilir.
 
Son düzenleme:
MySQL tabanlı bir lisans sistemi veya uygulamanızın backend işlemlerini ücretli bir şekilde gerçekleştirebilirim. Makul bir fiyat tutarım, eğer ilgilenirseniz iletişime geçebiliriz.

Ayrıca belirtmek isterim ki, bu tür uygulamarın lisans sistemi genellikle Node.JS tabanlı oluyor, Python bildiğiniz üzere diğer dillere göre biraz yavaş kalmakta ve hızlı respond süresi alabilmek için genellikle Node.JS kullanılıyor.

Projenizin herkese açık olacağını varsayıyorum ve en ufak bir açıkta programınıza/projenize giriş yapabilirler. Buna Reverse Engineering diyorlar. Herhangi bir HTTP Debugger ile lisans sistemini kendi sistemlerinde SKIP-OUT edebilirler ve bununda uygulamanız/projeniz için olumsuz yönleri olabilir.
Sorunumu Python ile halledebildim teşekkür ederim yardımın için :)
 
Nasıl hallettiniz hocam, detayları paylaşırsanız başkalarının da işine yarar.
Bu çok detaylı bir sistem olacağından pek paylaşabileceklerini sanmıyorum fakat GitHub üzerinden basit bir araştırmayla bir kaç lisans repo'su görebilirsiniz veya diğer arkadaşlarda görebilir.
 
Nasıl hallettiniz hocam, detayları paylaşırsanız başkalarının da işine yarar.
Bir kişiden yardım alaraktan hallettim. Sistem üst seviyede oldu manipüle edilmesi zor. Kayıt defteri ve Makine ID'si ile kontrol yapıyoruz. Sistem şu şekilde MySQL bağlantısı kullanarak sistem bilgisayarın makine ID sini alır ardından regedit'e bir veri kaydeder. Bu veriler tabloya yazılır. Ve daha sonraki kullanımlarda bu veri sürekli kontrol edilir. Regedit'de kod manipüle edilmeye çalışılırsa sistem tekrar açılırsa okunacak veri yanlış olduğu için lisanlaslama iptal olur. Eğer kopya oluşturulup başka bir Makineye entegre edilirse makine ID bulunamaz lisanslama iptal olur. Python veri biliminde üst seviyedir asla yavaş kalmaz.
 
Çözüm
Bir kişiden yardım alaraktan hallettim. Sistem üst seviyede oldu manipüle edilmesi zor. Kayıt defteri ve Makine ID'si ile kontrol yapıyoruz. Sistem şu şekilde MySQL bağlantısı kullanarak sistem bilgisayarın makine ID sini alır ardından regedit'e bir veri kaydeder. Bu veriler tabloya yazılır. Ve daha sonraki kullanımlarda bu veri sürekli kontrol edilir. Regedit'de kod manipüle edilmeye çalışılırsa sistem tekrar açılırsa okunacak veri yanlış olduğu için lisanlaslama iptal olur. Eğer kopya oluşturulup başka bir Makineye entegre edilirse makine ID bulunamaz lisanslama iptal olur. Python veri biliminde üst seviyedir asla yavaş kalmaz.
Hocam 10 milyon rakamı 1 dakikadan fazla bir sürede sayabiliyor, diğer diller bunu 2 ila 3 saniyede yapıyor, ne anlatıyorsunuz 😁
 

Yeni mesajlar

Geri
Yukarı