[PHP] kopieer beveiliging

Pagina: 1
Acties:
  • 250 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Edit: Kopier -> kopieer ;)

Ik heb een script dat ik tegen kopiëren wil beveiligen.
Klanten betalen voor een bepaalde periode, dus ik wil dat als die periode voorbij is het script niet meer werkt.

De php code is allemaal encode met zend.

Maar nu zoek ik een goede en veilige manier om te checken of hun licentie nog wel geldig is.
Ik wil geen datum van hun server gebruiken omdat ze dat gemakkelijk kunnen aanpassen.

Ik heb het volgende bedacht:

Een script dat iedere dag aangeroepen wordt.
Het vraag een php bestand aan op onze server en geeft daarbij de volgende variable mee:
Klant_id
Check_id
Aantal_sites
Code

Het klant id is het id van de klant.
Het check id is het nummer van de check, dit om te voorkomen dat je 2x hetzelfde nummer kan gebruiken.
Aantal sites is het aantal sites waar de gebruiker een licentie voor heeft.

De code wordt opgebouwd op de volgende manier:
Md5 van Klant_id+eenwoordwataltijdhetzelfdeis+Check_id+Aantal_sites

Het script wat aangeroepen wordt maakt de code op precies dezelfde manier.
Als deze code overeenkomt, en het check_id is niet al een keer gebruikt.
Dan maakt het script een nieuwe md5 code op dezelfde manier, maar dan met een ander woord, en geeft dit terug aan de site die het aanvroeg.

Die maakt ook die md5 code met het 2e woord, en kijkt of deze hetzelfde is.
Zo ja, dan is de licentie geldig.

Als het fout gaat wil ik dat opslaan in de database, en bijvoorbeeld als het meer dan 30x (30dagen) fout is gegaan werkt het script niet meer. Onze server kan ook een keer down zijn, dus daarom moet het opgeslagen worden hoevaak het fout ging.

Het probleem is dus als ze het willen hacken, kunnen ze in de database(die mysql is) het aantal keer dat het fout is gegaan wijzigen, als ze weten hoe dit in elkaar zit.
Als ik het zou encoden, kunnen ze bijvoorbeeld de 1e keer die code opslaan en de code altijd vervangen door die code in de database.

En een ander probleem is dat ze als ze een md5 string kunnen onderscheppen, en dan er voor zorgen dat het check_id nummer weer gereset wordt naar die die ze onderschept hadden en dan er voor zorgen dat ze naar een eigen script connecten ipv mijn server, die dan altijd die md5 terug geeft.

Ik hoop dat ik het een beetje duidelijk heb uitgelegd.

Weet iemand een goede oplossing voor dit probleem?

Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

Is de toegang tot de database/tabel/kolom ontzeggen niet een oplossing? Zet je een revoke op de tabel/kolom, mits natuurlijk de database users gescheiden zijn. :/

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Banpei schreef op 01 november 2004 @ 13:11:
Is de toegang tot de database/tabel/kolom ontzeggen niet een oplossing? Zet je een revoke op de tabel/kolom, mits natuurlijk de database users gescheiden zijn. :/
Nee dat kan niet, want het is zijn eigen server, dus dan heeft hij zelf de database user voor het script aangemaakt. of hij weet iig het password daarvan.

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Misschien te simpel gedacht, maar kun je er niet voor zorgen dat er altijd een bestand van jullie server geinclude wordt, en dat je daar de check in bouwt. Je zet de datum van aankoop in jouw eigen database, en laat het include-script steeds kijken hoeveel dagen er al verstreken zijn.

Oke, het moeilijke is misschien zorgen dat ze niet om de include van jou heen kunnen, maar verder lijkt me dat ze dan weinig kunnen hacken. Alleen een probleem als jullie server een keer plat ligt.

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OkkE schreef op 01 november 2004 @ 13:20:
Misschien te simpel gedacht, maar kun je er niet voor zorgen dat er altijd een bestand van jullie server geinclude wordt, en dat je daar de check in bouwt. Je zet de datum van aankoop in jouw eigen database, en laat het include-script steeds kijken hoeveel dagen er al verstreken zijn.

Oke, het moeilijke is misschien zorgen dat ze niet om de include van jou heen kunnen, maar verder lijkt me dat ze dan weinig kunnen hacken. Alleen een probleem als jullie server een keer plat ligt.
precies het probleem is dus als onze server plat ligt.
En daarom moet ik bij houden hoe vaak het al fout is gegaan, en dat moet in de database...
En als ze weten waar dat zit, kunnen ze een scriptje maken die dat iedere dag reset oid.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Want als ik het laat negeren als de server down is, kunnen ze gewoon het domein van mijn server blokken.

Acties:
  • 0 Henk 'm!

  • dev icey
  • Registratie: Augustus 2003
  • Laatst online: 22-04 11:21
Je kan meerde manieren verzinnen:
1) Script van klant maakt connectie met jouw mysql server (desnoods meerdere servers)
2) Script van klant haalt een bestandje op van jouw server
3) Script van klant maakt een connectie met een zelfgeschreven programmatje op jouw server.

Dan zorg je ervoor dat de script van je klant weet wanneer de licentie verloopt, en laat je het script dus op 1 van de drie manieren de datum ophalen. Is de tijd verstreken: (misschien: delete de source van alle bestanden) en gooi een exit; neer. Krijgt hij geen tijd binnen: exit;

Natuurlijk zul je de verbinding over https (ssl) moeten laten gaan, om er voor te zorgen dat de tijd niet wordt wordt onderschept en aangepast.

Overigens kan je je betalende klanten ook laten betalen voor een versie, en dat een upgrade geld kost. Dus dat je onbeperkt de ene versie mag gebruiken.

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Als ze twee keer hetzelfde check nummer gebruiken geeft jouw server een error dat dat nummer al eens gebruikt is. Maw, het is niet mogelijk om een opgevangen md5 string nogmaals te gebruiken. Je zou ook jouw server een check nummer kunnen laten opgeven om het nog veiliger te maken.

De "aantal keren fout" kun je ook weer coderen, als de gecodeerde versie van het nummer niet overeenkomt met het nummer in de database, blokkeer je gelijk het script aangezien ze er dan duidelijk aan geklooid hebben. Wel een mogelijkheid overlaten om een backup terug te zetten.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dev icey schreef op 01 november 2004 @ 13:36:
Je kan meerde manieren verzinnen:
1) Script van klant maakt connectie met jouw mysql server (desnoods meerdere servers)
2) Script van klant haalt een bestandje op van jouw server
3) Script van klant maakt een connectie met een zelfgeschreven programmatje op jouw server.

Dan zorg je ervoor dat de script van je klant weet wanneer de licentie verloopt, en laat je het script dus op 1 van de drie manieren de datum ophalen. Is de tijd verstreken: (misschien: delete de source van alle bestanden) en gooi een exit; neer. Krijgt hij geen tijd binnen: exit;

Natuurlijk zul je de verbinding over https (ssl) moeten laten gaan, om er voor te zorgen dat de tijd niet wordt wordt onderschept en aangepast.

Overigens kan je je betalende klanten ook laten betalen voor een versie, en dat een upgrade geld kost. Dus dat je onbeperkt de ene versie mag gebruiken.
Van dat ssl is wel een goeie.. nog niet aan gedacht
maar dan zit ik nogsteeds met het probleem als de server down is.
Ik wil niet het script down laten gaan als mijn server een keer down is.
Het moet wel een aantal keer down gaan, en dat moet dus opgeslagen worden ergens.

Acties:
  • 0 Henk 'm!

  • ExploWare
  • Registratie: November 2002
  • Laatst online: 14-08 13:34

ExploWare

BoingBoing

je kan ook zorgen voor een (of meer) backupserver(s) met het scriptje, als die ook niet berijkbaar is is het wel lijp
moet je natuurlijk wel een andere hoster hebben.,..
en Include zou ik niet kiezen, maar Require, dan wordt het script namelijk gewoon bruut afgebroken

ik denk dat dat het veiligst is
als je geen zin hebt om nog een server te huren, kan ik je wel wat ruimte geven (250kB moet het wel inpassen denk ik :))

. . . . . Youp.net . . . . .


Acties:
  • 0 Henk 'm!

  • kamerplant
  • Registratie: Juli 2001
  • Niet online
Ik weet niet hoe je database eruit ziet, stel dat je een tabel user hebt met Security IDs enzo. Je maakt 1 'system user' aan, zonder die record zal het systeem niet werken. Je hebt daarbij 30 verschillende geldige SIDs, welke dit kunnen zijn staat in je geencode php source. Elke SID heeft een nummer. Als het 5e SID in de database staat, schrijf je ergens in een bestandje het getal 5 weg, zodra het SID nummer en de SID niet met elkaar overeenkomt wordt de boel gelocked. Er zijn drie verschillende betekenissen van deze SIDs, wat het aantal gefaalde controle-pogingen betekend. Indien je 3 gefaalde pogingen hebt lockt het script zichzelf.
Zomaar een ideetje om het probleem met de platte server te voorkomen, wel te kraken, maar dan moet je er echt wel moeite voor hebben gedaan. Misschien is het wat?
Je kunt natuurlijk ook gewoon het script met een tweede server laten connecten, als de eerste connectie faalt, misschien is dat nog wel makkelijker. :+

🌞🍃


Acties:
  • 0 Henk 'm!

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Even een andere kant van de beveiliging. Mijn ervaring is dat de mensen die echt willen het toch wel kraken. Als je voornamelijk een aantal serieuze klanten hebt (grotere organisaties) dan zullen die gewoon netjes betalen. Dat is tenminste mijn ervaring. De extra moeite die je er dan in steekt voor allerlei beveilingtruukjes is het dan misschien niet helemaal waard.

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 19-09 22:18

chem

Reist de wereld rond

Verwijderd schreef op 01 november 2004 @ 12:53:
Klanten betalen voor een bepaalde periode, dus ik wil dat als die periode voorbij is het script niet meer werkt.
Dan moet je gewoon op de tijd van de server checken.

Punt is dat het aanpassen van de tijd op een server allerlei ellende geeft (denk aan backups, synchronisaties etc.). Je bent echt lomp als je daar mee gaat pielen voor een software-pakket.

Wat je ook kan doen is een total-runtime meenemen (bv 50k seconden). Bij de eerste opstart bewaar je die, en bij elke vervolg run hou je dat bij (ivm performance evt met een kans van 1:10).

Als de totale tijd 'besteed' is dan kill je gewoon de DB (maak bv backup met hexdec() erover) en moeten ze de licentie verlengen.

Dat is niet 100% nauwkeurig, maar ook moeilijk tegen te gaan, mits men die waardes niet kan aanpassen.

Je kan die total-runtime gewoon in plain text bewaren met een hash erbij over de waarde + saltstring.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
maar dat bewaren is toch wel een probleem lijkt mij. Als je het gewoon in de DB opslaat zou er makkelijk een scriptje kunnen runnen die bijv. elke minuut die waarde in de DB terug zet naar de waarde die er in stond toen het script net gekocht is bijvoorbeeld. Dan blijft ie bijv. altijd op 5k seconden staan, of 5x checken ed.

Of je dat nou geëncode opslaat of niet maakt niet uit

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

Verwijderd

Als je bij je php applicatie een licentie bestand stopt die de licentieduur en eindtijd bevat, Dan valt de geldigheid heel makkelijk te controleren. Er zijn heel veel tijd servers te vinden op internet die allemaal de juiste tijd aangeven. Zijn ze allemaal uit de lucht (bijna onmogelijk), dan is er iets mis.

In die licentie stop je dus ook nog wat ip adressen van tijdservers.
Komt het aantal van werkende tijdservers onder een kritieke grens, dan maakt het script verbinding met jouw pc om een nieuwe licentie op te halen. Werkt jou pc eventjes niet, dan is dat geen ramp want de tijd(en licentie) wordt nog steeds gecontroleerd.

Je kunt om de 100 keer (via een randomizer) dat je applicatie draait een keer de tijd opvragen, zo merkt de klant geen echte performance dip in de applicatie. Klopt de opgevraagde tijd niet, dan kun je de de functionaliteit wijzigen door encoded data schrijven in de database. Zodra alles weer in orde is, kan de data in de database weer worden teruggezet.

Bij draaien van de php applicatie, wordt er geconroleerd of er encoded data staat in de database, is dit het geval dan MOET er verbinding gezocht worden met een tijdserver(of jouw server). Als de tijd en de licentie toch blijkt(of weer blijkt) te kloppen klopt, wordt de data weer terug gezet.

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Wat we hier @ work doen is het volgende:

- License bestand maken en dat aan de klant geven
- Bij installatie leest de app dat bestand in de database in (encoded opgeslagen, is dus niet wijzigbaar)
- Bij elke x runs controleert 'ie met de serverdatum of de license nog geldig is, zo niet, stopt 'ie ermee

Dit is inderdaad kwetsbaar voor een veranderende serverdatum, maar in de praktijk blijkt dat niemand daarmee klooit. Misschien omdat het niet een stand alone app is, maar altijd met support contract verkocht wordt.

De .asp files zijn niet encrypted en dat is ook niet nodig, als de klant deze wijzigt, vervalt zijn recht op support en updates. Zakelijke klanten doen dat dus ook gewoon niet.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Fabian
  • Registratie: April 2000
  • Laatst online: 14:49
www.ioncube.com

- Basic Access Control Features
Features to generate time expiring
and IP/Server Name restricted files

- Feature to Restrict files to MAC Addresses

Acties:
  • 0 Henk 'm!

  • ExploWare
  • Registratie: November 2002
  • Laatst online: 14-08 13:34

ExploWare

BoingBoing

Gerco schreef op 01 november 2004 @ 14:58:
...Dit is inderdaad kwetsbaar voor een veranderende serverdatum, maar in de praktijk blijkt dat niemand daarmee klooit....
misschien een idee om de huidige tijd/datum van een internet time server te achterhalen? ben je daar iig vanaf :)

. . . . . Youp.net . . . . .


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Je moet verschillende checks maken, en die dan random niet te vaak uitvoeren. Zelfs als je er dan eentje omzeilt, en denkt dat je het gekraakt hebt, dan werkt het 'ineens' weer niet meer.

Echt veilig zijn alleen remote procedure call op jouw server, dan draait het feitelijke programma dus op jouw server en is de client applicatie slechts een schil. Vergelijk met een cd-key en een mmorpg.

(bv check je 50% van de runs de systeem tijd, en 10% van de runs check je of de systeem tijdniet is terug gezet, en 5% van de runs check je een hash van een eerder waargenomen internet tijd, en weer 10% van de keren stuur je een hash naar jouw server en tel je fouten, etc.)

[ Voor 28% gewijzigd door Zoijar op 09-11-2004 21:15 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Fabian schreef op 01 november 2004 @ 15:10:
www.ioncube.com

- Basic Access Control Features
Features to generate time expiring
and IP/Server Name restricted files

- Feature to Restrict files to MAC Addresses
Hij encode al met Zend, dus behalve als hij heet Zend Small Business programm heeft zou hij het moeten kunnen met de Zend encoder.. Daarnaast is de ioncube oplossing ook een makkelijke, alleen dan moet de klant wel de ioncobe decoder installeren. De kans dat de Zend Encoder is geinstalleerd is een stuk groter
Pagina: 1