Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Generowanie i sprawdzanie kluczy licencyjnych
Forum PHP.pl > Forum > PHP
Fibolg
Macie jakiś pomysł w jaki sposób zabezpieczyć licencyjność aplikacji napisanych w php? Nie znam się za bardzo na wyrażeniach regularnych więc to raczej odpada sad.gif
Chodzi o generację klucza licencyjnego oraz późniejsze sprawdzenie, czy jest prawidłowy...
Pozdrowienia
NuLL
Metody na zabezpieczenie aplikacji poza zastosowaniem doatkowego oprogramowania na serwerze nie ma.
tiraeth
1. Generujesz APPLICATION-KEY w php
2. Zapisujesz go do bazy
3. Podczas instalacji skryptu trzeba podać klucz
4. Łączy się z Twoją www i sprawdza czy klucz był już rejestrowany (istnieje w bazie ale bez pola installed=1)
5. Jeżeli installed=0 to zmieniamy jego wartość na 1 i pozwalamy na instalację a jeżeli nie to kończy się instalacja (usuwają się wszystkie pliki z serwera prócz index.php/install.php

Generowanie:
  1. <?php
  2. # generowanie klucza
  3. $key = md5(uniqid(rand(), true));
  4.  
  5. $one = substr($key, 0, 5);
  6. $two = substr($key, 5, 5);
  7. $three = substr($key, 10, 5);
  8. $four = substr($key, 15, 5);
  9.  
  10. $key = $one.'-'.$two.'-'.$three.'-'.$four;
  11. $key = strtoupper($key);
  12.  
  13. echo 'Nowy klucz: <b>'.$key.'</b>';
  14. ?>
dr_bonzo
A jak zmusisz usera zeby nie wycial ze skryptu kodu sprawdzajacego KEYa?

Problem byl juz omawiany: nie da sie zabezpieczyc.
Fibolg
Dzięki @Tiraeth mniej więcej o to chodziło...
@dr_bonzo nie miejmy wszystkich userów za tak genialnych jak my sami smile.gif Możesz przecież dać część instalacji ze swojego własnego serwera przez NET, a wówczas skrypty znajdowały się będą nie u usera tylko u Ciebie. Myślę, że jakieś dodatkowe zabezpieczenie jednego rekordu bazy też rozwiąże problem - tak, żeby user nie mógł zmieniać sam pola installed. Coś się wykombinuje tongue.gif
tiraeth
Można też dodać, że skrypt musi pobrać jeden plik (np. mysql.db) z serwera i pójdzie przez POST'a (hidden: filename=md5('http://serwer.pl/d1o1w1n1l1o1a1d/mysql.db')) i wtedy pobiera plik razem ze sprawdzeniem czy KEY jest prawidłowy smile.gif Trzeba dużo kombinować smile.gif

Można też inaczej smile.gif Jest coś takiego jak KOMPILATOR php... zmienia kod .php na plik wykonywalny .exe smile.gif Tam zrobić formularz do zarejestrowania klucza smile.gif Z tego pliku nie wytnie się kodu smile.gif i wtedy dopiero można przeprowadzić instalację z serwera smile.gif

przykładowy kod sprawdzający klucze (plik tekstowy)

key.php
  1. <?php
  2. if($_POST['klucz'] == &#092;"\")
  3. {
  4.  echo '<form name=\"key\" method=\"POST\" action=\"key.php\">
  5. Klucz: <input type=\"text\" name=\"klucz\"><br />
  6. <span style=\"color:silver\">np. 1A2B3-C4D5E-6F7G8-H9I10</span><br />
  7. <input type=\"submit\" value=\"AKTYWUJ\"></form>';
  8.  die();
  9. }
  10.  
  11. # baza z kluczami
  12. $keyBase = 'keys.txt';
  13. $keys = file($keyBase);
  14. foreach($keys as $id => $key)
  15. {
  16.  $hlp = explode('|+|', $key);
  17.  $klucz = $hlp[0];
  18.  $used = $hlp[1];
  19.  $klucze['key_'.$id] = $klucz;
  20.  $klucze['used_'.$id] = $used;
  21. }
  22.  
  23.  if($id = array_search($_POST['klucz'], $klucze))
  24.  {
  25. list($what, $ide) = explode('_', $id);
  26. $klucz = $klucze['key_'.$ide];
  27. $uzyty = $klucze['used_'.$ide];
  28.  }
  29.  else
  30.  {
  31. die('Nieprawidlowy klucz!');
  32.  }
  33.  
  34.  if($uzyty == 'YES')
  35.  {
  36. echo 'Klucz zostal juz uaktywniony!';
  37.  }
  38.  elseif($uzyty == 'NO')
  39.  {
  40. echo 'Twoj klucz (<b>'.$_POST['klucz'].'</b>) jest prawidlowy!';
  41.  }
  42. ?>


keys.txt
Kod
12345-67890-abcde-fghij|+|NO|+|
00000-11111-22222-33333|+|YES|+|


smile.gif Np. coś takiego można umieścić tongue.gif
NuLL
To się i tak mija z celem.

@Fibolg - niczego nie wykombinujesz
Fibolg
@NuLL lubię wyzwania... tak na prawdę chodzi o samo przyznawanie kluczy - aplikacja zazwyczaj instalowana będzie przeze mnie także to ja będę miał nad nią pełną władzę winksmiley.jpg

@Tiraeth masz gdzieś linka do tego? Podobno jest jakaś free wersja, ale ja albo znajduję stronki z 404, albo z płatnymi wersjami kompilatorów...
Spirit86
nawet jak zabieczycie instalkę, to jaka jest pewność, że ktoś nie zainstaluje produktu na własną rękę snitch.gif?
Fibolg
Przypuszczam, że takie samo jak z produktami MS smile.gif Fakt licencji pozostaje faktem - Twoje prawa zabezpiecza tekst ustawy o prawie autorskim i pokrewnych. Licencja sprzedana bądź po prostu pirat!
jamal18181818
Witam serdecznie, chciałbym odnowić troszkę temat.
Problem jest taki, że ten kod nie przyjmuje innych kluczy, działa tylko na 0.
Czy ktoś mógłby mi wytłumaczyć co w nim jest źle? Będę bardzo wdzięczny.
Do pliku instalacji dodałem kod odpowiedzialny za wczytywanie tam pliku key.php:

Plik instalacyjny, wywołanie:

Cytat
$plik = file_get_contents('http://domena.pl/serwis/install/key.php');
echo '<br /><br />';
highlight_string($plik);


Plik key.php wygląda tak:

Cytat
<?php
if($_POST['klucz'] = 2)
{
echo '<form name=\"key\" method=\"POST\" action=\"key.php\">
Klucz: <input type=\"text\" name=\"klucz\"><br />
<span style=\"color:silver\">np. 1A2B3-C4D5E-6F7G8-H9I10</span><br />
<input type=\"submit\" value=\"AKTYWUJ\"></form>';
die();
}

# baza z kluczami
$keyBase = 'http://domena.pl/serwis/install/keys.txt';
$keys = file($keyBase);
foreach($keys as $id => $key)
{
$hlp = explode('|+|', $key);
$klucz = $hlp[0];
$used = $hlp[1];
$klucze['key_'.$id] = $klucz;
$klucze['used_'.$id] = $used;
}

if($id = array_search($_POST['klucz'], $klucze))
{
list($what, $ide) = explode('_', $id);
$klucz = $klucze['key_'.$ide];
$uzyty = $klucze['used_'.$ide];
}
else
{
die('Nieprawidlowy klucz!');
}

if($uzyty == 'YES')
{
echo 'Klucz zostal juz uaktywniony!';
}
elseif($uzyty == 'NO')
{
echo 'Twoj klucz ('.$_POST['klucz'].') jest prawidlowy!';
}
?>


Plik keys.txt wygląda tak:

Cytat
0|+|YES|+|
1|+|YES|+|
2|+|NO|+|
greycoffey
Przypisanie w dwóch ifach.
jamal18181818
Cytat(greycoffey @ 12.06.2012, 16:43:20 ) *
Przypisanie w dwóch ifach.


O którą część kodu chodzi?
!*!
Mrr kolejny temat o kluczach autoryzacji w PHP (odgrzany kotlet). Tyle lat istnienia języka, a nadal znajdują się osoby które uważają że to coś pomoże. Czytam te wasze pomysły, świetne, nawet klucze można sobie dla lasnu wystylizować na te ala MS, tylko powiedźcie... co w wypadku jak klient będzie chciał to zainstalować na maszynie lokalnej bez dostępu do netu? Zapewniacie support telefoniczny? Tylko to nadal nie zmienia faktu ze aplikacji zainstalować się bez połączenia najzwyczajniej nie da.

Dlatego zamiast kombinować z bzdurną filozofią generowania kluczy dla produktów (o ile nie jest to cześć aplikacji, np. gry komputerowej, w formie urozmaicenia rozrywki) to skupcie się na ulepszaniu kodu jaki napisaliście smile.gif
darko
Temat stary jak świat. Jeśli wydajność nie jest najważniejsza dla klienta, to najlepiej tak zbudować aplikację, aby najważniejsze funkcjonalności były obsługiwane przez zdalną usługę na waszym serwerze np. poprzez curl i OAuth lub OpenID / SOAP. Reszta to kwestia Waszej implementacji i fantazji. Najważniejsza w takim podejściu jest oczywiście konieczność autoryzacji i system tokenów z krótkim cyklem życia oraz fakt, iż bez komunikacji z Waszą maszyną aplikacja stanie się bezużyteczna. To wszystko da się sensownie zrobić tylko nie w każdej sytuacji i nie przy każdym projekcie.
//edit
Można w ogóle zbudować aplikację w postaci usługi sieciowej (klienta) komunikującego się z Waszym serwerem.
Mephistofeles
Ty nigdy nie używałeś piratów?
Dostaniesz za swoją pracę zapłatę? To nie przejmuj się piratami, jakimiś kluczami, wystarczy licencja, żeby wsparcie prawne w razie czego było.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.