hoe kan ik zoeken in .txt bestanden waarvan de data encrypted is?
Een .txt bestand ziet er zo uit:
Code (php)
1
2
3
4
5
2
3
4
5
id-5e0786c07c802 // id
Friends //category
ygkKcL/jz9U= // naam (encrypted)
6gkKcL/jz9XuVRNayyIVcFbLw3ord0nc7IJj // email (encrypted)
902d95a9bf1c3f59a3996e4e7b4dec79 // token
Friends //category
ygkKcL/jz9U= // naam (encrypted)
6gkKcL/jz9XuVRNayyIVcFbLw3ord0nc7IJj // email (encrypted)
902d95a9bf1c3f59a3996e4e7b4dec79 // token
Voorheen had ik de naam en email niet encrypted en gebruikte ik onderstaande code om bijv te zoeken op emailadres:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
/* EMAIL SEARCH */
$email_search = $_GET['email_search']; // get string from url for search
if (isset($email_search)) {
$searchthis = strtolower($email_search);
$email_matches = array();
$files = glob("subscribers/*.txt"); // Specify the file directory by extension (.txt)
foreach($files as $file) { // Loop the files in the directory {
$handle = @fopen($file, "r");
if ($handle) {
$lines = file($file);
$grab_email = strtolower($lines[3]); // for sorting only
while (!feof($handle)) {
$buffer = fgets($handle);
if(strpos(strtolower($buffer), $searchthis) !== FALSE) // strtolower; search word not case sensitive
$email_matches[$file] = $grab_email; // put all lines in array indexed by email
}
fclose($handle);
}
}
}
asort($email_matches);
?>
<!-- search form -->
<form class="search-form form-inline" action="admin.php" method="GET">
<div class="input-group mb-3">
<input class="form-control" type="text" name="email_search" placeholder="Search for..." />
<div class="input-group-append">
<button class="btn btn-primary" type="submit">Search</button>
</div>
</div>
</form>
/* EMAIL SEARCH */
$email_search = $_GET['email_search']; // get string from url for search
if (isset($email_search)) {
$searchthis = strtolower($email_search);
$email_matches = array();
$files = glob("subscribers/*.txt"); // Specify the file directory by extension (.txt)
foreach($files as $file) { // Loop the files in the directory {
$handle = @fopen($file, "r");
if ($handle) {
$lines = file($file);
$grab_email = strtolower($lines[3]); // for sorting only
while (!feof($handle)) {
$buffer = fgets($handle);
if(strpos(strtolower($buffer), $searchthis) !== FALSE) // strtolower; search word not case sensitive
$email_matches[$file] = $grab_email; // put all lines in array indexed by email
}
fclose($handle);
}
}
}
asort($email_matches);
?>
<!-- search form -->
<form class="search-form form-inline" action="admin.php" method="GET">
<div class="input-group mb-3">
<input class="form-control" type="text" name="email_search" placeholder="Search for..." />
<div class="input-group-append">
<button class="btn btn-primary" type="submit">Search</button>
</div>
</div>
</form>
Maar nu is de naam en email encrypted en werkt mijn zoekfunctie niet meer uiteraard.
Hoe kan ik nu toch in de encrypted .txt bestanden zoeken op email?
PS: Wat ik heb geprobeerd, en dit werkt ook: de input van search veld eerst encrypten en dan met die encrypte waarde gaan zoeken. Dus als ik wil zoeken op de naam "John", dan encrypt ik eest de naam John, ( wordt bijv iets in de zin van "ub1TSIxADRYhTCuksKS+Gw==") en zoek dan met die encryptiewaarde. maar deze manier verdiend natuurlijk neit de schoonheidsprijs om het zo te doen...
Gewijzigd op 12/02/2020 17:09:15 door Jack Maessen
Door het betreffende e-mailadres eerst op dezelfde manier te encrypten en vervolgens met die ge-encrypte waarde te gaan zoeken in de tekstbestanden.
(Overigens is het erg omslachtig om gebruikers bij te houden via tekstbestanden. Daar gebruik je normaliter een database voor.)
Eerst decrypten als er zoek request wordt gedaan en dan tijdelijk op slaan in memory of iets dergelijks? Heb overigens geen idee hoe dat zou moeten ook...
Gewijzigd op 12/02/2020 17:12:41 door Jack Maessen
Op welke manier encrypt je de naam? Via welke methode?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$string = 'John';
$met_enc = 'aes256';
$key_enc = 'sleutel';
$iv = '1234567891011121'; // 16 chars
//encrypts the string
$encryption = openssl_encrypt($string, $met_enc, $key_enc, 0, $iv);
$decryption = openssl_decrypt($encryption, $met_enc, $key_enc, 0, $iv);
echo $encryption.'<br />';
echo $decryption.'<br />';
?>
$string = 'John';
$met_enc = 'aes256';
$key_enc = 'sleutel';
$iv = '1234567891011121'; // 16 chars
//encrypts the string
$encryption = openssl_encrypt($string, $met_enc, $key_enc, 0, $iv);
$decryption = openssl_decrypt($encryption, $met_enc, $key_enc, 0, $iv);
echo $encryption.'<br />';
echo $decryption.'<br />';
?>
>> Eerst decrypten als er zoek request wordt gedaan en dan tijdelijk op slaan in memory of iets dergelijks?
Dus stel je hebt 1.000 users, dan zou je 1.000 tekstbestanden moeten inlezen, gaan decrypten, alle informatie storen enz. Lijkt me niet wenselijk. En wat als je 10.000 gebruikers hebt? Allesbehalve efficiënt.
De zoekwaarde eerst encrypten en met die waarde gaan zoeken in de tekstbestanden is het meest efficiënt. Dat gezegd hebbende ... dit moet je niet willen doen met tekstbestanden. Hiervoor zijn databases uitgevonden.
Persoonlijk zou ik aanraden om alles netjes in een database plaatsen. Die zijn juist bedoeld om in te zoeken. Vanwaar de beslissing om dit in tekstbestanden op te slaan?
Gewijzigd op 12/02/2020 17:33:49 door - Ariën -
@Arien het staat idd buiten de webroot. Daarom zat ik ook te denken: moet de data daarin dan wel encrypted worden? Niemand kan er toch bij komen? Ja behalve de administrators van mijn hosting company natuurlijk...
Je hebt het zelf ge-encrypt. Ik neem aan dat je dat met een bepaalde reden hebt gedaan. Een naam of mailadres wordt meestal niet ge-encrypt. Wachtwoorden daarentegen wel ... niet ge-encrypt maar gehashed.
Op zich kan je mailadressen encrypten, maar de enige manier waarop iemand daarbij kan komen is als hij toegang heeft tot de server. Op dat moment heeft hij ook toegang tot de decryptie-methode. Anders gezegd, je zet iets op slot, maar de sleutel ligt ernaast.
Heb je de mogelijkheid om een database te gebruiken? Doe dit dan.
Heb je dat niet, heb je de mogelijkheid tot sqlite3? Dit is een filebased database.
Heb je dat ook niet, sla het dan tenminste op als JSON. Dan hoeft het ook maar in 1 bestand ipv meerdere losse en kun je 't veel makkelijker uitlezen (als een array bijvoorbeeld).
Over het zoeken, zoals gezegd eerst de zoekterm encrypten en daarmee zoeken. Let wel op dat sommige encryptie methodes steeds andere uitkomsten geven, dan gaat deze zon niet op.
Gewijzigd op 12/02/2020 21:02:05 door Michael -
maar idd, een DB is hier de meest aangewezen methode voor. helemaal mee eens. Maar ik wilde gewoon weten of ik een alternatief had om encrypte data te doorzoeken in txt bestanden. En zoals Ozzie al zei: bij elke zoek request, eerst de data encrypten en met de encrypte data gaan zoeken. En dit werkt ook wel , alleen je moet genuanceerder gaan zoeken.
"John" staat bijv met hoofdletter opgeslagen in de txt file.
Als ik zoek op "John" of "john" zal dat nu geen verschil uitmaken doordat ik strtolower gebruik:
Code (php)
1
2
3
4
2
3
4
<?php
$searchthis = strtolower($order_search);
if(strpos(strtolower($buffer), $searchthis) !== FALSE) // strtolower; search word not case sensitive
?>
$searchthis = strtolower($order_search);
if(strpos(strtolower($buffer), $searchthis) !== FALSE) // strtolower; search word not case sensitive
?>
Maar als ik de data encrypted ga opslaan, kan ik die strtolower niet meer gebruiken.
"John" geeft encrypted hele andere karakters dan "john" met kleine letter. Das nadeel...
Gewijzigd op 12/02/2020 23:44:05 door Jack Maessen
$encryption = openssl_encrypt($string, $met_enc, $key_enc, 0, $iv);
$encryption_lowercase = openssl_encrypt(strtolower($string), $met_enc, $key_enc, 0, $iv);
Maar dat is niet optimaal nee, maar een naam is toch niet geencrypt? En als je een e-mailadres altijd als lowercase opslaat heb je dat probleem ook niet.
En vergeet niet wat Ozzie zei, als iemand bij je bestand kan, kan ie ook bij de sleutel, dus dit is schijnveiligheid.
Gewijzigd op 12/02/2020 23:39:45 door Michael -
Quote:
En vergeet niet wat Ozzie zei, als iemand bij je bestand kan, kan ie ook bij de sleutel, dus dit is schijnveiligheid.
Dit snap ik niet zo goed. De data in de txt bestanden zijn encrypted. Maar hoe zou iemand bij de sleutel moeten komen? Dit staat er in het php bestand:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$string = 'John';
$met_enc = 'aes256';
$key_enc = 'sleutel';
$iv = '1234567891011121'; // 16 chars
//encrypts the string
$encryption = openssl_encrypt($string, $met_enc, $key_enc, 0, $iv);
$decryption = openssl_decrypt($encryption, $met_enc, $key_enc, 0, $iv);
?>
$string = 'John';
$met_enc = 'aes256';
$key_enc = 'sleutel';
$iv = '1234567891011121'; // 16 chars
//encrypts the string
$encryption = openssl_encrypt($string, $met_enc, $key_enc, 0, $iv);
$decryption = openssl_decrypt($encryption, $met_enc, $key_enc, 0, $iv);
?>
Niemand kan die sleutel toch lezen?
Even afgezien van de administrators die mijn webserver beheren dan...
Gewijzigd op 12/02/2020 23:54:53 door Jack Maessen
Quote:
Dit snap ik niet zo goed. De data in de txt bestanden zijn encrypted. Maar hoe zou iemand bij de sleutel moeten komen?
Jij geeft aan dat het bestand buiten de root staat en dus niet benaderbaar vanaf buitenaf. Dus zou encryptie niet nodig zijn. Je encrypt nu voor... iemand die toch bij je bestand kan? Deze iemand heeft dan toegang, dus kan evengoed bij de sleutel. Snap je?
Ik snap niet waarom je dit wilt uitbreiden en niet gewoon alles naar een database importeert en vanaf daar de rest (adres, etc) gaat toevoegen.
Gewijzigd op 12/02/2020 23:56:30 door Michael -
Nog even over die txt bestanden:
In mijn .htaccess:
Nu zijn de txt bestanden ook niet meer toegankelijk, ook al staan ze in de webroot of een subfolder daarvan
Gewijzigd op 13/02/2020 00:15:07 door Jack Maessen
Quote:
Nu zijn de txt bestanden ook niet meer toegankelijk, ook al staan ze in de webroot of een subfolder daarvan
Dat zal best zo zijn, maar het blijft erbij dat dit niet de juiste manier is.
Ik zou het script gebruiken om daarmee alles aan de database te voeren ;-)
Dan kun je veel makkelijker en efficiënter data selecteren, wijzigen, zoeken, etc.
Klein werkje, groot gemak.
Een vindingrijke crimineel of anders kwaadwillende kan altijd wel een manier vinden om bij de data te komen. Door goede encriptie of hashing maak je deze gegevens waardeloos.