22. juni 2010 - 12:11Der er
13 kommentarer og 2 løsninger
Beskyt php-system mod kopiering
Hej
Jeg har udviklet et php-system, som jeg ønsker at beskytte mod kopiering, således det kun kan køre fra det domæne det er indkøbt til.
Jeg ved godt at det i praksis er umuligt at sikre noget 100%, og at det ofte er dyrt og kræver installation af software på webserveren der afvikler systemet, men det er ikke ønskværdigt i min situation.
Jeg har opbygget et licenssystem, der gør at licenseringen fastslåes under login til systemet.
Jeg har lavet det således at alle funktioner i systemet er inaktive, med mindre der er indtastet en gyldig licensnøgle.
Kontrollen for dette, ligger overordnet i ét script der styrer login + rettigheder.
Som jeg ser det, må løsningen derfor være at sikre dette script, f.eks. ved at obfuscere det.
Jeg ved godt at sikringen er forholdsvis simpel, men mit ønske er at sikre at systemet ikke umiddelbar kan kopieres til et andet domæne.
Inputs, tanker, andre forslag osv. er yderst velkomne.
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
Enig med #1. Sådan noget kan man ikke gøre i praksis, med mindre du selv kontrollerer den server/webhotel systemet ligger på.
Den løsning du har bør fjerne det meste, men en person der forstår php kan nemt omgå din spærring, uanset hvilke forholdsregler du tager.
Du kan også lægge et licens ID i en kommentar i kildekoden (man ikke kan se hvad er), så har du _måske_ mulighed for at identificere hvem der har kopieret systemet, og så tage den gennem sø- og handelsretten hvis det rent økonomisk giver mening
Synes godt om
Slettet bruger
22. juni 2010 - 13:20#3
aners...> Det var også i overvejelserne, men jeg vurderede at det ikke var en option. Min overvejelse gik på kontrol af licens op mod en central server, men problemstillingen er den samme. Det kan fjernes af en php-kyndig. Det er ikke en option af lægge en del af funktionaliteten på en server hos mig selv.
intenz...> Ved godt at spærringen kan omgåes, men målet var også kun at forhindre at det umiddelbart kunne kopieres.
Jeg ville helt lade være. At have en central server kan være fint nok i størstedelen af tiden, men den dag den server går ned og kunden forsøger at logge ind i administrationen og intet virker for dem, får du nogle meget sure opringninger. Som kunde ville jeg i hvert ikke bryde mig om sådan en løsning.
Du kan evt. bruge nogle af $_SERVER variablerne. F.eks. SERVER_ADDR eller HTTP_HOST, og så tjekke dem op imod en md5() værdi du har lavet i forvejen. Så slipper du for den centrale server.
Jeg anvender en løsning, hvor jeg på hver kundeinstallation har lavet en "sladrekode", hvor der tjekkes for korrekt domæne. Hvis systemet flyttes til anden domæne, vil systemet sende ip, domænenavn og oprindeligt domænenavn til min mailadresse. Jeg har altså lavet en kode, som kalder et script, som ligger på min egen server/webhotel, såfremt der ikke er overenstemmelse mellem det registrerede domænenavn og domænet som afvikler koden. Koden har jeg krypteret (eller hvad man nu kalder det) med:
$txt = gzinflate(base64_decode($txt));
Koden tjekker jeg med sådan her:
$eval_code = 'XY5Ni4MwGITPK.....'; // min krypterede kode if(!$eval_code) { exit; } else { eval(gzinflate(base64_decode("$eval_code"))); }
Synes godt om
Slettet bruger
22. juni 2010 - 14:35#6
intenz...> Umiddelbar enig, hvis jeg valgte at licenscheck skulle der være en form for cache, således systemet stadigvæk ville køre videre.
nemlig...> Der er vel samme problemstilling som vi allerede har drøftet, nemlig at det er let at fjerne for en php-kyndig.
Et check ala: if ($domain != 'Gyldigt domæne'') { // Rapporter om brug på licens } else { // Tillad login }
Det vil være let at ændre eller fjerne og derfor vil sikringen ikke være så meget anderledes end alle mulige andre løsninger der ligger lokalt.
Umiddelbar vil jeg forsøge at tilføre værdi ved at have en lovlig registreret version.
Det er nemlig ikke muligt at opgradere systemet uden at have en gyldig licens-nøgle og samtidig vil en gyldig licens give adgang til fora, request for change osv.
Forsøges der via systemet at opdatere, vil jeg kunne se hvorfra requesten kommer, og dermed måske fange snydere.
En licensnøgle vil føre tilbage til køberen, således jeg også har en chance for at se hvem der har givet sin kopi videre.
Ellers er det vist bare at få integreret nogle kontroller i stort set alle scripts, således det i hvertfald vil være et stort arbejde at fjerne igen, dog uden at det selvfølgelig må give dårlig performance hos brugeren.
Det vil også være et stort arbejde at implementere det, hvis du vil indsætte i hver controller. Normalt vil det jo se sådan ud if ($system->isValidLicense()) { // gyldig }
Det er så den nemme måde, men der er stadig bare et sted man skal ændre funktionen til at der bare står 'return true'. Ellers skal du implementere hele logikken i alle controllerne, hvilket gør det svært at vedligeholde.
Alt det her: --- Det er nemlig ikke muligt at opgradere systemet uden at have en gyldig licens-nøgle og samtidig vil en gyldig licens give adgang til fora, request for change osv. --- Vil du kunne gøre alligevel, på dit eget site, så længe logind kræves her.
Jeg ville stadig vælge ikke at implementere noget licens-sikkerhed i selve systemet. Det er få der vil have interesse i at kopiere det til andre, og dem der vil kan gøre det uanset hvad du implementerer. Jeg ville bruge min tid andre steder, hvis det var mig.
Synes godt om
Slettet bruger
22. juni 2010 - 18:07#8
Interssant spørgsmål !
Jeg tror ikke man kommer uden om en "central server" - Men en liste af 2-3-4 servere, så et enkelt nedbrud/overbelastning ikke lægger alle ned!
Dér kunne man lægge en funktion som kaldes med licens-nøglen + domænenavnet (i referrer) Disse "kombineres" (med en dato-komponent) til en dekrypteringsnøgle, som returneres og bruges til at dekryptere en essentiel del at PHP-sourcen on-the-fly... Sådan at den ikke-krypterede PHP-kode kun er tilrådighed i RAM - mens den kører...
Det bliver ikke let, og det VIL koste performance!
Synes godt om
Slettet bruger
22. juni 2010 - 18:17#9
Hm.. nej. Det dur jo ikke. Så skal tyven jo bare indsætte en bid kode som gemmer den dekrypterede PHP-source inden den køres : (
Måske skal selve dekrypterings-algoritmen også returneres fra den centrale server og udstyres med en timer-mekanisme, så den SKAL bruges indenfor f.eks. 10 sekunder. Dén kalder så den centrale server igen, og får nøglen til at dekryptere den lokale PHP-source (i RAM)
Al den kontrol I nævner kan fjernes fra koden. Den ENESTE metode er at få en egen-administreret server til at håndtere kernefunktionaliteten. End of story.
Synes godt om
Slettet bruger
23. juni 2010 - 10:06#11
aners...> Ingen tvivl om at det er mere sikker end de andre forslag der er oppe, men jeg er ikke i tvivl om at nogle af de andre kontroller vi har snakket om vil forhindre en del i at kopiere systemet til en anden server.
Alle der har deltaget i tråden bedes lægge et svar. Pointene deles ligeligt.
Dén med en tidsbegrænset dekryptering af lokal PHP-kode er god (om end fuzzy..)
Synes godt om
Slettet bruger
23. juni 2010 - 14:12#15
suk
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.