Controle op website toegang
Ik schets kort wat ik wil doen.
aan de ene kant, op mijn server een databank met daarin lijst van website's met start en einddatum
aan de andere zijde, op de verschillende website's ergens anders dan op mijn server uiteraard een kort stukje code die contact maakt met mijn database en nakijkt of de website nog ok is om mee verder te werken, of als de tijd verstreken is en deze dus stopt
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
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
<?php
session_start();
ob_start();
include("connect.php");
if (isset($_POST['webid'])){
$sid = $_POST['webid'];
$siteresult = mysql_query("SELECT * FROM website WHERE website_id = '$sid'");
if (mysql_num_rows($siteresult)) {
while (($prodrow = mysql_fetch_assoc($siteresult)) !== false){
$websitestartdate = $prodrow['website_startdate'];
$websiteenddate = $prodrow['website_enddate'];
// duration of contract
$startdate = strtotime($websitestartdate);
$enddate = strtotime($websiteenddate);
$contractdays = ceil(abs($enddate - $startdate) / 86400);
// days left
$now = strtotime(date("Y-m-d H:m:s"));
if ($now > $enddate){
// overdue
$sitestatus = "Blocked";
}else{
// seems ok
$sitestatus = "OK";
}
}
}else {
// Nothing found
$sitestatus = "Blocked";
}
}else{
// No ID found
$sitestatus = "Blocked";
}
?>
session_start();
ob_start();
include("connect.php");
if (isset($_POST['webid'])){
$sid = $_POST['webid'];
$siteresult = mysql_query("SELECT * FROM website WHERE website_id = '$sid'");
if (mysql_num_rows($siteresult)) {
while (($prodrow = mysql_fetch_assoc($siteresult)) !== false){
$websitestartdate = $prodrow['website_startdate'];
$websiteenddate = $prodrow['website_enddate'];
// duration of contract
$startdate = strtotime($websitestartdate);
$enddate = strtotime($websiteenddate);
$contractdays = ceil(abs($enddate - $startdate) / 86400);
// days left
$now = strtotime(date("Y-m-d H:m:s"));
if ($now > $enddate){
// overdue
$sitestatus = "Blocked";
}else{
// seems ok
$sitestatus = "OK";
}
}
}else {
// Nothing found
$sitestatus = "Blocked";
}
}else{
// No ID found
$sitestatus = "Blocked";
}
?>
heb dit getest met de get function en gewoon in de url aangeroepen en dit gedeelte werkt.
wat betreft het stukje code die op de verschillende site moet draaien heb ik al verschillende dingen geprobeerd via jquery post function, uren al naar een oplossing gezocht maar niets die werkt.
dus stel ik hier maar de vraag, hoe ik dat kan bekomen - dus bij start van de site even in 'externe database' kijken of mag verder gegaan worden of niet - zonder dat de gebruiker iets daarvan merkt.
graag jullie feedback
grtjs marc
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken i.p.v. quote-tags. Die laatste zijn bedoeld voor citaten.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 28/06/2016 00:29:34 door - Ariën -
Dan is het niet verstandig om vanuit dat CMS een databaseconnectie te leggen met de 'master-database', want die inlog kan uiteraard simpel worden onderschept.
De beste oplossing is het gebruik van een API die aan de met je hostname en een unieke hash/licentiecode een URL aanroept, en daar de status ophaalt. Let er wel op dat je een CMS bij een connection-timeout niet opslot gooit. Dat zou zonde zijn in het geval van een netwerkstoring.
Verder wordt het gebruik van de MySQL-functies afgeraden. De vervanger hiervoor is MySQLi of PDO.
Gewijzigd op 28/06/2016 00:33:21 door - Ariën -
alvast bedankt voor deze feedback - ben idd nog ni rond met het systeem maar zocht al een manier waarop site met master database kan communiceren
Wel moet de server dat ondersteunen.
Of je verzorgt zelf de hosting van die websites. Dan is een dergelijke controle overbodig.
waardeer de adviezen wel maar krijg geen antwoord op wat ik zoek
ik weet weet best waarom ik dit zo wil
enfin zal dan zelf wel oplossingen verdr zoekn tot ik deze vindt
Want in dat geval heb ik toch echt een goede oplossing gegeven, plus de uitleg waarom het de beste oplossing is.
Vertel anders eens duidelijk wat je precies wilt?
Gewijzigd op 28/06/2016 15:58:01 door - Ariën -
Kan de gebruiker/eigenaar van de website zelf bij de code van de website?
Ik gok op een dubbelzinnig gebruik van "gebruiker".
Deze is een eigen API die aangeeft of een bepaalde sleutel en hostname/domein waarop een CMS van mij draait, toegestaan is.
Toevoeging op 29/06/2016 02:33:57:
Dit heb ik intussen simpel gemaakt waarbij de waarde na webid site nummer is, uiteraard dit allemaal in basis en voorzien worden van een versleuteling - alhoewel het mij eerder om het principe van werking gaat
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>
$(document).ready(function(){
$.post('checksite.php', {webid:"2"}, function (output){
/*
if (output == 'OK')
echo 'your good to go';
else
echo 'please pay me first';
*/
$('#status').html(output).show();
});
});
</script>
</head>
<body>
<div id="status"></div>
</body>
</html>
file_get_contents kan gebruiken.
Anyway, hier is de code van mijn licentie-API (die je beter kan herschrijven naar MySQLi). Ikzelf gebruik dit niet meer, maar dit script geeft aan de hand van een key in de config aan of er een licentie is en op wiens naam die staat. Een check of een site gebruikt mag worden is er niet, omdat ik het niet nodig vond.
api.php voor op de externe server
En de controle in de admin om de gegevens op te halen vanuit de CMS client.
licentie.php
En dan ben ik benieuwd wat POST doet, en waar je jQuery gebruikt terwijl je beter Anyway, hier is de code van mijn licentie-API (die je beter kan herschrijven naar MySQLi). Ikzelf gebruik dit niet meer, maar dit script geeft aan de hand van een key in de config aan of er een licentie is en op wiens naam die staat. Een check of een site gebruikt mag worden is er niet, omdat ik het niet nodig vond.
api.php voor op de externe server
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
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
<?php
mysql_connect("localhost","","") or die("MySQL login is incorrect.");
mysql_select_db("clients") or die("Database is incorrect");
if (!isset($_GET['username'],$_GET['serial'], $_GET['host'])) {
echo "FIELDS_ARE_EMPTY";
} else {
$sql = "SELECT username,
serial,
hostname,
name,
address,
telephone
FROM clients
WHERE `username` = '".mysql_real_escape_string($_GET['username'])."'
AND serial = '".mysql_real_escape_string($_GET['serial'])."'
AND hostname = '".mysql_real_escape_string($_GET['host'])."'";
$license_result = mysql_query($sql) or die(mysql_error()."<br>".$sql);
if(mysql_num_rows($license_result)){
$license = mysql_fetch_assoc($license_result);
echo "OK";
if(isset($_GET['ownerdetails'])) {
echo " - ".$license['name']."\n".$license['address']."\n".$license['telephone'];
}
} else {
echo "NOT_OK";
}
}
?>
mysql_connect("localhost","","") or die("MySQL login is incorrect.");
mysql_select_db("clients") or die("Database is incorrect");
if (!isset($_GET['username'],$_GET['serial'], $_GET['host'])) {
echo "FIELDS_ARE_EMPTY";
} else {
$sql = "SELECT username,
serial,
hostname,
name,
address,
telephone
FROM clients
WHERE `username` = '".mysql_real_escape_string($_GET['username'])."'
AND serial = '".mysql_real_escape_string($_GET['serial'])."'
AND hostname = '".mysql_real_escape_string($_GET['host'])."'";
$license_result = mysql_query($sql) or die(mysql_error()."<br>".$sql);
if(mysql_num_rows($license_result)){
$license = mysql_fetch_assoc($license_result);
echo "OK";
if(isset($_GET['ownerdetails'])) {
echo " - ".$license['name']."\n".$license['address']."\n".$license['telephone'];
}
} else {
echo "NOT_OK";
}
}
?>
En de controle in de admin om de gegevens op te halen vanuit de CMS client.
licentie.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$license_url = "http://api.DOMEIN_VAN_MASTERSEVER.nl/api.php?username=".$settings['licence_name']."&serial=".$settings['license_key']."&host=".$_SERVER['HTTP_HOST'];
$license_owner = $license_url."&ownerdetails=true";
$license_connection = file_get_contents($license_url);
$license_owner_connection = file_get_contents($license_owner);
if ($license_connection == "OK") {
$status = "<span style='color:green'>Licentie goedgekeurd</span>";
} else {
$status = "<span style='color:red'>Licentie incorrect, neem a.u.b. contact op met de sitebouwer.</span>";
}
echo $status;
if($license_connection=="OK") {
echo'Licentie eigenaar:<br />'.nl2br(substr($license_owner_connection,5))
} else {
echo 'Er is een probleem aangetroffen in de licentie van het CMS';
}
?>
$license_url = "http://api.DOMEIN_VAN_MASTERSEVER.nl/api.php?username=".$settings['licence_name']."&serial=".$settings['license_key']."&host=".$_SERVER['HTTP_HOST'];
$license_owner = $license_url."&ownerdetails=true";
$license_connection = file_get_contents($license_url);
$license_owner_connection = file_get_contents($license_owner);
if ($license_connection == "OK") {
$status = "<span style='color:green'>Licentie goedgekeurd</span>";
} else {
$status = "<span style='color:red'>Licentie incorrect, neem a.u.b. contact op met de sitebouwer.</span>";
}
echo $status;
if($license_connection=="OK") {
echo'Licentie eigenaar:<br />'.nl2br(substr($license_owner_connection,5))
} else {
echo 'Er is een probleem aangetroffen in de licentie van het CMS';
}
?>
Gewijzigd op 29/06/2016 08:57:29 door - Ariën -
@Ariën, maar die beveiliging is toch kinderlijk eenvoudig te omzeilen? Verander in licentie.php voor de CMS-client twee keer == "OK" in != "OK" en een licentie die niet okay is, wordt okay.
Tenzij hij encoded is, wat zeker handig is.
Toevoeging op 29/06/2016 13:44:32:
Uiteraard is beveiliiging nodig, aan de andere kant, jullie zijn allemaal experts, mensen die weten wat ze doen, de grote massa echter niet, en het is/was ook niet de bedoeling dit in een pro omgeving te gebruiken.
Maar uiteraard beveiliging moet wel, wou alleen zeggen we moeten ook ni 'zwart' denken
Alvast iedereen hartelijk bedankt voor zijn bijdrage
Ozzie PHP op 28/06/2016 15:57:44:
@Marc
Kan de gebruiker/eigenaar van de website zelf bij de code van de website?
Kan de gebruiker/eigenaar van de website zelf bij de code van de website?
Dit lijkt mij nog steeds een relevante vraag.
Of als je het zelf host, dan kan je de hele controle buiten de hele Admin buiten de webroot zetten zodat de gebruiker er niet bij kan. Uiteraard zijn gebruiksvoorwaarden om je code te beschermen ook zeker handig. Mocht het ooit uitlekken of iemand de boel hacken, dan sta je juridisch zeer sterk.
In eerste instantie ja, als hij door de duizenden lijnen code wilt sneuffelen
Maar zoals Arien reeds vermelde - best encoden
Meestal is er ook nooit een probleem en mocht zich da voordoen is het ook ni de bedoeling groot scherm te tonen met melding zo van jij moet nog betalen of dergelijke - kan subtiel waardoor lijkt dat er ergens een kleine error is en contact moet opgenomen worden met de maker van, of eigenaar van, of beheerder of hoe het ook maar ingezet wordt
Bvb mijn wordpress installatie's beschikken over een kleine snippet die ingeval gebruiker zijn eigen delete of in de role setting rammeld en zichzelf uitsluit, er toch via via terug in de backend toegang kan bekomen worden - gebruiker is daarvan ook op de hoogte, wettelijke verplichting
Persoonlijk zou ik eerst proberen het probleem weg te nemen in plaats van het probleem op te lossen wat ik zelf introduceer. Dit laatste is toch een beetje voortborduren op een verkeerde beslissing.