If you serve static HTML files, you cannot prevent a user to access it without using a programming language like PHP (or e.g. .htaccess
). There are however multiple ways to handle your situation:
- You could fetch all administrative data from the PHP scripts with AJAX. This means that all your users could theoretically see how your administration is built of (the whole HTML structure without relevant data). Of course, you can create a redirect, if the AJAX call fails, but you are still offering the whole HTML of the administration.
- You can store your administration HTML file in the back-end. The user then tries to access the administration and the only thing he gets, is an AJAX call to the back-end. If the call is successful, the HTML is delivered with AJAX to the front-end. This prevents the users to see your administration HTML.
- You can use a small PHP snippet on top of every administration page which checks if a user should have access to this page. This prevents the users also to see your administration HTML.
- You store the HTML of your administration in an HTML file, also served to the user. Then, you make an initial call to the back-end on page load. In the success case, you make another AJAX call to fetch the administartion HTML. The user could potentially see the administration HTML (if he directly opens the file).
- You could use a PHP independent server authentication with
.htaccess
. .htaccess
is an apache server authentication configuration file. You can use it to prevent a user from accessing your site (so, there is no access to the HTML file at all). When trying to access the page, a popup appears and the user has to enter his credentials. It is completely independent from your business logic and the allowed users have to be set in a .htpasswd
text file. There is no way to use a modern database-relying user management with .htaccess
server authentication. With this solution, you also cannot use an HTML form to log in. I would only recommend this solution for testing purposes and not for a modern website.
If your PHP back-end is solidly built, I would go for solution 1
. The user cannot do anything with your HTML, if you are properly checking the user's input on your back-end interface. This means, you serve all the HTML, but do not display it to the user until the data is loaded. You can show a spinner while it is loading. Here is some basic code:
JavaScript (jQuery):
$(document).ready(function() {
$.ajax({
url: 'administration.php',
method: 'GET'
success: function(response) {
$('input.username').val(response.username);
// ( ... )
$('.administration').fadeIn('fast');
},
error: function() {
window.location.href = 'index.php';
}
});
});
HTML:
<body>
<div class="administration">
<label>Username
<input type="text" class="username" />
</label>
</div>
</div>
CSS:
.administration {
display: none;
}