#1 13. Oktober 2008 SJS - Sicherung von Scripten Wer wünscht es sich nicht... ? Stundenlang an einer JavaScript Datei oder einer Klasse gefummelt und dann kommt ein Kiddie und klaut den Style oder das Script. Das ist nun nicht mehr, oder schwerer möglich. Hier nun meine Klasse "SJS". PHP: <? php class SJS { private $sOriginFile = '' ; private $sOriginFileContent = '' ; private $sSecuredFile = '' ; private $sSecureDir = 'SJS' ; private $sFileType = '' ; private $sRequestToken = 0 ; public $sErrorMessage = "Diese Datei ist Urheberrecthlich geschützt und darf nicht verwendet werden.\nSprich : Finger weg!!!\n \n \n \nCopyrights by Smokers in association with Murdoc." ; public function __construct ( $sOriginFile ) { $this -> sOriginFile = $sOriginFile ; $this -> CreateDir (); if(! file_exists ( $this -> sOriginFile )) { echo 'Angegebene Datei nicht vorhanden.' ; exit(); } session_start (); $this -> sRequestToken = md5 ( rand ( 0 , 1000 ) . $_SERVER [ 'REQUEST_TIME' ]); $this -> DetectFileType (); } private function DetectFileType () { if( preg_match ( '~\.css$~' , basename ( $this -> sOriginFile ))) { $this -> sFileType = 'css' ; } if( preg_match ( '~\.js$~' , basename ( $this -> sOriginFile ))) { $this -> sFileType = 'js' ; } } private function CreateDir () { if(! is_dir ( $this -> sSecureDir )) { mkdir ( $this -> sSecureDir , 4777 ); } } private function dequote ( $str ) { return preg_replace ( '~^(["\']*)(.*)\1$~' , '$2' , $str ); } private function RedesidnPath () { $path = dirname ( $this -> sOriginFile ); if( substr ( $path , - 1 ) != DIRECTORY_SEPARATOR ) $path .= DIRECTORY_SEPARATOR ; $path = str_replace ( '\\' , '/' , $path ); $this -> sOriginFileContent = preg_replace ( '~url\((["\']{0,1})(.*)\1\)~Ue' , '"url(\'.' . $path . '" . $this->dequote(stripslashes(\'\\2\')) . "\')"' , $this -> sOriginFileContent ); } private function CreateNewFile () { $handle = fopen ( $this -> sOriginFile , "rb" ); while (! feof ( $handle )) { $buffer = fgets ( $handle , 4096 ); $this -> sOriginFileContent .= $buffer ; } fclose ( $handle ); $this -> sSecuredFile = basename ( $this -> sOriginFile ). '.php' ; $handle = fopen ( $this -> sSecureDir . '/' . basename ( $this -> sSecuredFile ), 'w+' ); if( $this -> sFileType == "css" ) { $this -> RedesidnPath (); $code = <<<CONTENT <?php session_start(); //nicht heterot =) header('Content-type: text/css'); if(!(isset(\$_GET['SJSToken']) && isset(\$_SESSION['SJS_TOKEN_ { $this -> sOriginFile } ']) && \$_GET['SJSToken'] == \$_SESSION['SJS_TOKEN_ { $this -> sOriginFile } '])) exit(' { $this -> sErrorMessage } '); unset(\$_SESSION['SJS_TOKEN_ { $this -> sOriginFile } ']);?> { $this -> sOriginFileContent } CONTENT; } if( $this -> sFileType == "js" ) { $code = <<<CONTENT <?php session_start(); header('Content-type: application/javascript'); // wird atm nur gelöscht wenn der code richtig war - unser if hat keine klammern,ahhhh brainckk :D if(!(isset(\$_GET['SJSToken']) && isset(\$_SESSION['SJS_TOKEN_ { $this -> sOriginFile } ']) && \$_GET['SJSToken'] == \$_SESSION['SJS_TOKEN_ { $this -> sOriginFile } '])) exit(' { $this -> sErrorMessage } '); unset(\$_SESSION['SJS_TOKEN_ { $this -> sOriginFile } ']);?> { $this -> sOriginFileContent } CONTENT; } fwrite ( $handle , $code ); } public function Assign () { if( $this -> sFileType == 'css' ) { $this -> AssignCSS (); } if( $this -> sFileType == 'js' ) { $this -> AssignJS (); } } private function AssignJS () { (int) $iFileTimeOrigin = @ filemtime ( $this -> sOriginFile ) ; (int) $iFileTimeNew = @ filemtime ( $this -> sSecureDir . '/' . basename ( $this -> sOriginFile ). '.php' ) ; if(! file_exists ( $this -> sSecureDir . '/' . basename ( $this -> sOriginFile ). '.php' ) || $iFileTimeOrigin > $iFileTimeNew ){ $this -> CreateNewFile (); echo '<script type="text/javascript" src="' . $this -> sSecureDir . '/' . $this -> sSecuredFile . '?SJSToken=' . $this -> sRequestToken . '"></script>' ; } else { echo '<script type="text/javascript" src="' . $this -> sSecureDir . '/' . basename ( $this -> sOriginFile ). '.php?SJSToken=' . $this -> sRequestToken . '"></script>' ; } } private function AssignCSS () { (int) $iFileTimeOrigin = @ filemtime ( $this -> sOriginFile ) ; (int) $iFileTimeNew = @ filemtime ( $this -> sSecureDir . '/' . basename ( $this -> sOriginFile ). '.php' ) ; if(! file_exists ( $this -> sSecureDir . '/' . basename ( $this -> sOriginFile ). '.php' ) || $iFileTimeOrigin > $iFileTimeNew ){ $this -> CreateNewFile (); echo '<link rel="stylesheet" type="text/css" href="' . $this -> sSecureDir . '/' . $this -> sSecuredFile . '?SJSToken=' . $this -> sRequestToken . '" />' ; } else { echo '<link rel="stylesheet" type="text/css" href="' . $this -> sSecureDir . '/' . basename ( $this -> sOriginFile ). '.php?SJSToken=' . $this -> sRequestToken . '" />' ; } } public function __destruct () { $_SESSION [ 'SJS_TOKEN_' . $this -> sOriginFile ] = $this -> sRequestToken ; }} ?> Der Aufuf erfolgt über : PHP: <? php require_once( 'class.SJS.php' ); $sjs = new SJS ( 'test.js' ); $sjs -> Assign (); // gibt den Link aus ?> <input type="button" onclick="hello_world();" value="1" /> Ich bin PHP immernoch im Anfängerstatus, ich bitte das zu berücksichtigen. Für Feature-Wünsche,Verbesserungen, Fehler bin ich gern offen =) Smokers + Multi-Zitat Zitieren
#2 13. Oktober 2008 AW: SJS - Sicherung von Scripten Netter Ansatz, allerdings einfacher mit auto_prepend_file zu realisieren. + Multi-Zitat Zitieren
#3 13. Oktober 2008 AW: SJS - Sicherung von Scripten Mhh kann sein, jedoch erlauben das auch nicht alle Hoster. Wie gesagt , bin PHP Anfänger und hatte mal ne Idee und hab nichts passendes fertiges gefunden =) + Multi-Zitat Zitieren
#4 13. Oktober 2008 AW: SJS - Sicherung von Scripten also ich finds ja schon etwas aufwendig einmal about:cache in die adresszeile und schon hab ich den code auch.... aber nette idee ^^ als erste schutzmaßnahme möglich + Multi-Zitat Zitieren
#5 13. Oktober 2008 AW: SJS - Sicherung von Scripten Will Dir ja nicht dein Spaß verderben, aber was hindert mich daran die Datei mittels Firebug auszulesen? + Multi-Zitat Zitieren
#6 13. Oktober 2008 AW: SJS - Sicherung von Scripten Ich sagte doch ganz oben das es kein 100%tiger Schutz ist. Es ist lediglich ein erschweren des Klaus. Ich könnte auch noch einen Obfuscator mit rein bringen für JS ... und alles son kram. Ein 100%tiger Schutz wäre es trotzdem nicht. Aber es ist schonmal sicherer als NUR einen Obfuscator oder es gänzlich ohne zu machen. Nun ist schonmal wenigstens das : "Seitenquelltext anzeigen" + STRG+C + STRG+v nicht mehr so einfach oder verhindert. + Multi-Zitat Zitieren
#7 14. Oktober 2008 AW: SJS - Sicherung von Scripten vielen dank. Aber so wehrt man wenigstens ca 80% der Scriptklauer ab. Die restlichen haben es dann verdient ^^ + Multi-Zitat Zitieren