2013-07-08 19 views
6

Ich habe eine Anwendung mit PHP erstellt und ich werde es auf meinem lokalen Markt verkaufen. Ich werde persönlich zu ihren Standorten gehen, um Apache & MySQL zu installieren/konfigurieren sowie meinen eigenen Code zu installieren.Get Computer Unique ID von PHP

Ich möchte ein Sicherheitssystem, so dass, wenn jemand versucht, meinen Code auf eine nicht autorisierte Maschine zu kopieren, wird es nicht ausgeführt.

Ich weiß, niemand kann Reverse Engineering einer Anwendung verhindern. Sogar .exe (binäre) Dateien sind geknackt und mit PHP (Quellcode) kann jeder machen.

In meinem Land diejenigen Reverse Engineers wirklich schwer zu finden sind, so würde Ich mag wie minimale Sicherheitsoptionen vorzuschlagen:

1) Erstellen Klasse (sagen wir, Navigation) identifiziert, Systeminformationen wie CPU-ID, Computername oder eine beliebige Kombination von Hardware-ID, um eine UNIQUE_ID zu erstellen, und stimmt mit meiner angegebenen UNIQUE_ID überein (an die Person, an die ich die Anwendung verkauft habe). Wenn es gültig ist, wird das Navigationsmenü angezeigt. Sonst wird es einfach die Datenbank zerstören und die Ausführung anhalten, indem eine Ausnahme zu werfen, vielleicht mag:

class Navigation { 

    public function d() { 
     return current system UNIQUE_ID; 
    } 

    public function get() { 
     $a = file_get_contents('hash'); 
     $c = $this->d(); 
     if (crypt($c) != $a) { 
      //destory database 
      throw new Exception(''); 
     } else { 
      return "<ul><li><a>home</a></li></ul>"; //navigation menu 
     } 
    } 

} 

2) Dann während der Installation werde ich System UNIQUE_ID in „hash“ Datei ändern, erstellen Sie ein Objekt, und speichern sie sie in eine Datei (nav.obj):

(install.php)

<?php 
     $a=new Navigation; 
     $out=serialize($a); 
     file_put_contents('nav.obj', $out); 

3) in header.php (die in jeder Datei enthalten wird):

<?php 
    $menu=file_get_contents('nav.obj'); 
    $menu=unserialize($a); 
    echo $menu->get(); 
?> 

Ich weiß, diese Methode nicht die volle Beweis ist, aber ich bin mir ziemlich sicher, dass rund 60% des PHP-Entwicklers wird es nicht in der Lage sein zu knacken!

Jetzt brauche ich nur aktuelle System UNIQUE_ID zu bekommen.

+0

was ist mit DOMAIN? Stellen Sie es auf die Domäne ein, wo es funktionieren soll, machen Sie einen Hash und überprüfen Sie es. – Robert

+0

Es gibt nicht so etwas wie ein System eindeutige ID – Anigel

+0

Und jetzt, wenn Sie dies offen veröffentlicht, die 60% bis 10% sinken ... –

Antwort

12

Ich habe diese Funktion erstellt, um eine eindeutige ID basierend auf Hardware (Festplatte UUID) zu erhalten. Es ist möglich, verschiedene Ressourcen wie Computernamen, Domänen oder sogar Festplattengröße zu verwenden, um eine bessere Lösung zu erhalten, je nach Ihren Bedürfnissen.

function UniqueMachineID($salt = "") { 
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 
     $temp = sys_get_temp_dir().DIRECTORY_SEPARATOR."diskpartscript.txt"; 
     if(!file_exists($temp) && !is_file($temp)) file_put_contents($temp, "select disk 0\ndetail disk"); 
     $output = shell_exec("diskpart /s ".$temp); 
     $lines = explode("\n",$output); 
     $result = array_filter($lines,function($line) { 
      return stripos($line,"ID:")!==false; 
     }); 
     if(count($result)>0) { 
      $result = array_shift(array_values($result)); 
      $result = explode(":",$result); 
      $result = trim(end($result));  
     } else $result = $output;  
    } else { 
     $result = shell_exec("blkid -o value -s UUID"); 
     if(stripos($result,"blkid")!==false) { 
      $result = $_SERVER['HTTP_HOST']; 
     } 
    } 
    return md5($salt.md5($result)); 
} 


echo UniqueMachineID(); 
+0

Haben Sie eine Alternative, die Shell_Exec nicht verwendet? –

+0

Ergebnis ist mein Computer und Telefon hat die gleiche ID. wah .... –

+0

Bitte geben Sie eine Beispieldatei diskpartscript.txt für den obigen Code. Wie sollte es aussehen? – user4271704

0

Per http://man7.org/linux/man-pages/man5/machine-id.5.html

$machineId = trim(shell_exec('cat /etc/machine-id 2>/dev/null')); 

EDIT für Tito:

[[email protected]**** ~]$ ls -l /etc/machine-id 
-r--r--r--. 1 root root 33 Jul 8 2016 /etc/machine-id 

EDIT 2 für Tito: Einige Dinge zu beachten und Szenarien:

Ist der Benutzer erlaubt zu bekommen eine neue Maschine? Ich rate ja. Oder auf mehreren Geräten laufen? Klingt wie die Maschine in Ihrem Fall irrelevant sein könnte?

Wenn der Benutzer nur (keine Maschineneinschränkungen) dann Id für einen Lizenzierungsservice gehen (verlässt sich auf Netzwerk). Es gibt viele Dienste für diese: Google Play (für Android-Anwendungen) ist ein gutes Beispiel: https://developer.android.com/google/play/licensing/index.html MS und Apple haben ähnliche Dienste. Suchen Sie im Web nach dem Begriff "Software Licensing Service" oder "Cloud Based Software Licensing Service".

Wenn Ihr Benutzer + einzelnes Gerät, dann müssen Sie die Geräte-ID an den von Ihnen verwendeten Dienst weitergeben oder make, dann erlauben Sie die Maschinen-ID aktualisiert werden, aber nicht zur vorherigen Maschine id (würde bedeuten mehrere Geräte). Aber diese Dienste geben Ihnen den Client-Code, der sich darum kümmern sollte, wenn es eine Anforderung ist.

zwei Szenarien aus Erfahrung: 1: User auf jedem Gerät: wir haben einfach eine API in der Cloud (in einer Website) und einen Login-Bildschirm in der App, wenn der Benutzer in es über die API authentifizierte protokolliert und gehalten ein Token, und wann auch immer das Gerät mit dem Netz verbunden war, würde die App die API abfragen und die Anmeldung und/oder das Token aktualisieren. Sie könnten alternativ den Login-Bildschirm im Kauf haben (wie vielleicht bereits auf einer Website zum Kauf angemeldet), generieren Sie einen Schlüssel und packen Sie es mit oder binden Sie es in die App.

2: Benutzer und Maschine: Das Gleiche gilt, außer wenn die API die Maschine ID abgefragt wird, übergeben werden. Die Maschinen-ID kann sich so oft ändern, wie der Benutzer ihr Gerät aktualisiert, aber wir haben eine Aufzeichnung der Maschinen-IDs behalten und die Regel verbieten lassen: Wenn wir eine alte (zuvor verwendete) Maschinen-ID gesehen haben, muss eine gewisse Zeit benötigt werden bestanden. So konnte der Benutzer seine Maschine brechen und eine alte herausziehen.

auch zu prüfen, ob Sie eine machen, wie werden Sie die App von der Arbeit aufhören? Ppl sind ziemlich schlau, es muss Kern kompiliert werden.

jedoch, dass alle gesagt, die verschiedenen Lizenzierungsdienste sind Pro an diesem und kann für die meisten Bedürfnisse befriedigen. Mit ihrer Erfahrung haben sie bereits die Sicherheitslücken überwunden. Ich möchte einen Namen nennen, den ich mag, außer dem, den du suchst.

Schön, wenn Sie mit auf dem Rücken und positive oder negative Ergebnisse aus Ihren Routen kommen können.

+0

'Die Datei/etc/machine-id enthält die eindeutige Rechner-ID des lokalen Systems, die Sie einfach mit den aktiven ändern können. – Tito

+0

Die Maschinen-ID kann beim Neustart geändert werden. Was ist der Zweck für die Lizenzierung? – user4271704

+0

Nein, Sie können die Maschinen-ID-Datei nicht einfach ändern. Es gehört zu root und ist readonly. Kein vernünftiger Systemadministrator wird es ändern. Ich bearbeite oben. – ekerner