php database-gegevens versleutelen
Hoe kan ik onderstaande code in een versleutelde onleesbare taal omzetten zodat alles toch nog werkt?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// variabelen initialiseren:
$username = "naam";
$password = "paswoord";
$host="localhost";
$dbnaam="databasenaam";
$db=mysql_connect($host, $username, $password) or die (mysql_error());
mysql_select_db($dbnaam, $db) or die (mysql_error());
$query="SELECT id, naam, adres, activiteit FROM activiteiten WHERE id='" . $_GET["id"] ."'";
$result = mysql_query($query) or die ("FOUT: " . mysql_error());
?>
// variabelen initialiseren:
$username = "naam";
$password = "paswoord";
$host="localhost";
$dbnaam="databasenaam";
$db=mysql_connect($host, $username, $password) or die (mysql_error());
mysql_select_db($dbnaam, $db) or die (mysql_error());
$query="SELECT id, naam, adres, activiteit FROM activiteiten WHERE id='" . $_GET["id"] ."'";
$result = mysql_query($query) or die ("FOUT: " . mysql_error());
?>
Gewijzigd op 17/02/2022 13:23:47 door G P
Als het je specifiek om het databasewachtwoord gaat: je kunt dat op verschillende manieren ergens anders in de serveromgeving opslaan.
Je zou eventueel Zend SafeGuard of IonCube kunnen gebruiken om je scripts te encrypten. Maar je wilt je configuratie toch altijd aanpasbaar houden.
Beste advies is wel om het configuratiebestand buiten de webroot te zetten. Mocht PHP op je server ooit opeens door merkwaardige omstandigheden overlijden, waarbij jan-en-alleman de broncode zien, dan ligt je configuratie-file in ieder geval NIET op straat.
En bovendien:
mysqli_query()!!
Het wordt hoog tijd om je functies te upgraden naar mysqli of PDO.
Blijkbaar draai je nog niet eens PHP 7!
En verder zie ik ook een grote SQL-injection in je query!!!
Gewijzigd op 17/02/2022 14:17:27 door - Ariën -
https://mariadb.com/resources/blog/mariadb-encryption-tde-using-mariadbs-file-key-management-encryption-plugin/
https://webdock.io/en/docs/how-guides/security-guides/how-to-enable-encryption-mariadb
https://mariadb.com/kb/en/aes_encrypt/
Om de data weer te tonen, moet je de boel weer ontsleutelen.
Indexen, foreign keys e.d kan je beter niet versleutelen, daar je dan niet meer kan zoeken.
Een encryptie sleutel kan je bijvoorbeeld aanmaken met een Stored Function :
Code (php)
1
2
3
4
5
2
3
4
5
RETURN CONCAT(
LPAD(CONV(FLOOR(RAND()*POW(36,8)), 10, 36), 5, 0),
LPAD(CONV(FLOOR(RAND()*POW(36,8)), 10, 36), 5, 0),
LPAD(CONV(FLOOR(RAND()*POW(36,8)), 10, 36), 5, 0)
)
LPAD(CONV(FLOOR(RAND()*POW(36,8)), 10, 36), 5, 0),
LPAD(CONV(FLOOR(RAND()*POW(36,8)), 10, 36), 5, 0),
LPAD(CONV(FLOOR(RAND()*POW(36,8)), 10, 36), 5, 0)
)
Die moet je dan opbergen op een geheime plaats.
Met een Stored Function, hieronder sfGetkey() genoemd, haal je die key weer op :
Versleutelen van de data kan dan met een Stored Function :
Code (php)
1
2
3
4
2
3
4
BEGIN
SET @enckey = (SELECT `sfGetkey`() );
RETURN (HEX( AES_ENCRYPT ( deData, @enckey ) ) );
END
SET @enckey = (SELECT `sfGetkey`() );
RETURN (HEX( AES_ENCRYPT ( deData, @enckey ) ) );
END
En het ontsleutelen weer met weer een Stored Function :
Code (php)
1
2
3
4
2
3
4
BEGIN
SET @enckey = ( SELECT `sfGetkey`() );
RETURN ( AES_DECRYPT ( UNHEX( deData ), @enckey ) );
END
SET @enckey = ( SELECT `sfGetkey`() );
RETURN ( AES_DECRYPT ( UNHEX( deData ), @enckey ) );
END
En dit is nog maar het begin.
Toevoeging op 17/02/2022 14:30:01:
PS Ik zie dat het om het versleuten van PHP moet gaan.
Kijk hier :
https://www.gaijin.at/en/tools/php-obfuscator
On the bright side, je kan nooit genoeg weten.
De reden waarom ik dit wil is omdat er ook andere gasten in de webruimte toelating gaan krijgen, en ik op die manier bepaalde scripts waar ik jarenlang aan gewerkt heb wil beschermen, zodat ze er niet mee gaan lopen.
De tool op https://www.gaijin.at/en/tools/php-obfuscator lijkt mij daarom ideaal. Merci!
Daaropaansluitend: kan ik bovenstaande code in een externe pagina plaatsen, om dan op de originele website dmv een include de database toch nog te laten werken? Bijvoorbeeld dit?
Gewijzigd op 17/02/2022 15:53:18 door G P
www.website.com/databasegegevens.php een lege pagina geven als output. Daarnaast zijn include() en require() vooral bedoeld voor lokale bestanden.
Die obfuscator doet niet echt veel spannends. Met een simpel script maakt het de variabelen en functies korter. Menig getalenteerd PHP-er kan nog zo nog terug zien wat een script doet. Als je het wilt encoden (obfuscaten is wat anders) dan moet je echt kijken naar producten zoals Zend Guard of IonCube. Het zijn wel betaalde producten, maar je code is met geen mogelijkheid terug te halen. Wel moet de webserver waarop het uitgevoerd wordt dit ondersteunen, maar die extenties zijn zo geïnstalleerd.
Als je andere gasten (ik neem aan medewerkers) toe wilt laten in je webomgeving, dan raad ik je aan om een testdatabase voor hun klaar te hebben staan en een testomgeving. Bij voorkeur een database met geanonimiseerde gegevens, en laat ze uiteraard ook een NDA tekenen als je sterk wilt staan. Met obfuscaten voorkom je echt niks.
Zorg ook voor de juiste rechten op de server, zodat mensen die geen developer zijn niet zomaar bij de scripts kunnen komen. Met een goede werkomgeving zou encoden van scripts niet eens meer nodig zijn.
Die include gaat natuurlijk niet werken. Via de webserver zal Die obfuscator doet niet echt veel spannends. Met een simpel script maakt het de variabelen en functies korter. Menig getalenteerd PHP-er kan nog zo nog terug zien wat een script doet. Als je het wilt encoden (obfuscaten is wat anders) dan moet je echt kijken naar producten zoals Zend Guard of IonCube. Het zijn wel betaalde producten, maar je code is met geen mogelijkheid terug te halen. Wel moet de webserver waarop het uitgevoerd wordt dit ondersteunen, maar die extenties zijn zo geïnstalleerd.
Als je andere gasten (ik neem aan medewerkers) toe wilt laten in je webomgeving, dan raad ik je aan om een testdatabase voor hun klaar te hebben staan en een testomgeving. Bij voorkeur een database met geanonimiseerde gegevens, en laat ze uiteraard ook een NDA tekenen als je sterk wilt staan. Met obfuscaten voorkom je echt niks.
Zorg ook voor de juiste rechten op de server, zodat mensen die geen developer zijn niet zomaar bij de scripts kunnen komen. Met een goede werkomgeving zou encoden van scripts niet eens meer nodig zijn.
Gewijzigd op 17/02/2022 16:11:01 door - Ariën -
Waar ik vooral benieuwd naar ben: kan ik de databasegegevens ook veranderen zonder dat er een error komt?
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$username = "naam";
$password = "paswoord";
$host="localhost";
$dbnaam="databasenaam";
?>
$username = "naam";
$password = "paswoord";
$host="localhost";
$dbnaam="databasenaam";
?>
Ik heb deze code ook door de tool getrokken om iets anders te krijgen, maar helaas werkt het script dan niet meer.
Zorg liever dat je goede rechten hebt, en dat anderen niet bij je productieomgeving kunnen, plus dat ze een NDA tekenen waarin ze dus getekend hebben voor geheimhoudingsplicht.
Dat is zo een beetje de werkwijze bij elk bedrijf.
Gewijzigd op 17/02/2022 16:21:52 door - Ariën -
Ik vertrouw die gasten nu eenmaal niet, vandaar deze vragen. Maak je om mij maar geen zorgen ;-)
Die hebben toch niks te maken met je code te maken? Zet een wachtwoord op je computer, en het is klaar! Desnoods bitlocker of veracrypt op je PC om je schijf te beveiligen.
Gewijzigd op 17/02/2022 16:28:47 door - Ariën -
Maar is dit mogelijk? De rest is bijzaak.
Met gasten bedoel ik anderen die kunnen inloggen. Wat hierbij belangrijk is is dat ze het script niet kunnen lezen, en dat ze vooral niet kunnen achterhalen via welke databasegegevens dit gerund wordt.
Dus je zorgen over obfuscaten zijn onnodig. Zorg wel dat de server zijn patches en updates krijgt en veilig is tegen aanvallen.
Gewijzigd op 17/02/2022 16:50:54 door - Ariën -
Ze kunnen inloggen in de webruimte, en kunnen daarmee alles zien.
Mocht je merken dat iets uitgelekt is, dan sta je sterk tijdens een juridische zaak.
Denoods kan je de belangrijke code encrypten met Zend of IonCube. Maar doe dat liever niet met je database credentials. Externe partijen werken maar lekker in een testdatabase.
Gewijzigd op 17/02/2022 16:57:42 door - Ariën -
Laat maar. Ik geef het op.
- Rechten instellen
- NDA contract
- IonCube of Zend
- Gebruik een test-database met dummy gegevens.
Tja...
Gewijzigd op 17/02/2022 16:58:01 door - Ariën -
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$username=base64_decode("abcdef");
$password=base64_decode("abcdef");
$host=base64_decode("abcdef");
$dbnaam=base64_decode("abcdef");
?>
$username=base64_decode("abcdef");
$password=base64_decode("abcdef");
$host=base64_decode("abcdef");
$dbnaam=base64_decode("abcdef");
?>
Dit werkt en geeft geen conflicten :-)
Dat is zo te encoden met base64_encode. Heb je dus niks aan!
Gebruik gewoon een testdatabase, testomgeving, en encrypt je gevoelige scripts met IonCube of Zend.
Hoe moeilijk wil je het zelf maken terwijl de ingrediënten voor je neus liggen?
https://www.ioncube.com/
https://www.zend.com/downloads/zend-guard
Gewijzigd op 17/02/2022 17:08:45 door - Ariën -
Er wordt niet voor niets meerdere malen gevraagd wat je wil bereiken.
Ik ga de vraag ook even stellen:
WAT (welke gegevens) wil je VOOR WIE onzichtbaar maken.
Dus 1) wat en 2) voor wie?