2015-09-26 2 views
3

Возможно ли защитить паролем (от пользователей сайта) определенные каталоги на сервере? Он не должен быть безопасным, поскольку он предназначен только для того, чтобы не позволить учащимся загружать/получать доступ к материалам из других курсов. Ученики не очень разбираются в технологиях, поэтому это не имеет большого значения.js для защиты паролем каталогов

Скажем, у меня есть каталоги с 3 курса: /course1 /course2 /course3

, и я хотел бы каждый каталог, чтобы иметь свой собственный пароль, так что я могу отправить учеников делать course1 его адрес и пароль. Как мне это сделать? У меня очень ограниченный доступ к серверу, поэтому клиентская сторона - единственный вариант.

+0

Одна из идей заключается в шифровании страницы 'index.html' в каждом каталоге с использованием JavaScript и уникального пароля. Затем вы можете ссылаться на каждый из ресурсов в каталоге с индексной страницы. Ознакомьтесь с моим ответом [здесь] (http://stackoverflow.com/a/31013664/2234742). –

+0

@MaximillianLaumeister. Хотя это классная идея для одиночных страниц, я не вижу, как вы могли бы защитить весь каталог, используя эту технику, без необходимости повторно вводить пароль. (Конечно, вы можете хранить пароль в локальном хранилище, но ...) – idmean

+0

@idmean. Вы правы, это не защитит весь каталог, только URL-адреса, что означает, что безопасность будет невелика. –

ответ

-1

Если вам нужна нуль безопасности, это можно сделать несколькими способами. Вот приблизительный пример, чтобы заставить вас задуматься о логике, которая вам может понадобиться для этого;

Рассмотрим следующий код:

var password = '12345678'; 
 

 
function showBody() { 
 
    
 
    // Password matches? 
 
    if (document.getElementById('code').value == password) { 
 
     
 
     // Show secret stuff and hide password box 
 
     document.getElementById('container').style.display = 'block'; 
 
     document.getElementById('code').style.display = 'none'; 
 
    } 
 
} 
 

 
document.body.onload = function() { 
 
    
 
    // Hide the secret stuff 
 
    document.getElementById('container').style.display = 'none'; 
 
    
 
    // Create a password box 
 
    var input = document.createElement('input'); 
 
    input.setAttribute('type', 'password'); 
 
    input.setAttribute('id', 'code'); 
 
    
 
    // Append the password box 
 
    document.body.appendChild(input); 
 
    
 
    // Listen for the password 
 
    document.addEventListener('keyup', showBody, false); 
 
}
<body> 
 
    <div id = 'container'> 
 
     I am hidden 
 
    </div> 
 
</body>

Имейте в виду, что есть более чем один способ сделать это. Это просто пример, чтобы вы могли начать писать свой код и получить общее представление о том, как можно сделать логику для такого типа вещей . Это очень небезопасно, и вам обязательно нужно рассмотреть другие решения с сервера.

+0

Вопрос задает вопрос о защите, поэтому любой ответ, который начинается с «если вы не заботитесь о безопасности», отключен от темы. –

+3

Вопрос неоднозначен в природе, поскольку следующая строка гласит: «Не нужно быть в безопасности» – Jesse

+0

Тем не менее, никогда не следует рекомендовать небезопасные подходы. Это примерно так же безопасно, как «Скажите им, чтобы они не смотрели в других каталогах» или «Не сообщайте им URL других курсов». – Bergi

4

Download the example here.

Думая об идее Максимилиан Laumeister, я придумал это. Это может быть не идеальное решение, но должно работать.

Вы храните все ресурсы на сервере, зашифрованные, закодированные как base64 в текстовых файлах. Разделяя запятую, вы добавляете желаемый тип mime. Например.

  • main: (CryptoJS.AES.encrypt('<a href="http://localhost:8080/_/more">Read more</a>', "hello").toString();)

    text/html;U2FsdGVkX19Tdq6V7swK/7NgnwR8JgZ1dYZEkfT9hx+QKzFrpyqKeuo0Tv25ozYkAxIIt65G9DKmOYU6tmZ0Dp/I4BuopQ/3xHClB+K+BX8= 
    
  • more: (CryptoJS.AES.encrypt('<h1>More</h1><p>Lorem ipsum dolor sit</p>', "hello").toString();)

    text/html;U2FsdGVkX19GdZ+SRQ9vM2Amiyu0OqOOSX7X5IOCcLfHMpHHgI0h/mxS8iuUggfqmFBN+yXy53z445ZW1mAlHQ== 
    

В гиперссылок вы должны поместить что-то в URL-адресов (_/), что вызывает 404, который может быть удален позже на, и вы должны указать протокол, включая сервер. Это единственный способ, которым скрипт может перехватить запрос, остановить его, запросить правильный URL и декодировать ответ. (404 необходима, потому что браузеры будут иначе загрузить указанный файл непосредственно и не будет вызывать load обработчики событий.)

Вы затем создать index.html страницу, которая содержит IFRAME и просит пользователя ввести пароль, который затем хранится в некоторой области, чтобы никакая атака XSS не могла получить значение.

<html> 
    <head> 
     <meta charset="utf8"> 
    </head> 
    <body> 
     <iframe id="theIframe"></iframe> 
     <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 
     <script src="script.js"></script> 
    </body> 
</html> 

Это позволяет запросить URL, декодировать полученный контент base64 и попытаться расшифровать его с данным паролем. Затем вы установили бы расшифрованный контент в качестве содержимого iframe через URL-адрес данных.

(function(){ 
    var iframe = document.getElementById("theIframe"); 
    var password = prompt("Enter the password!"); 
    var allowEvent = true; 

    function presentURL(url){ 
     allowEvent = false; 
     var req = new XMLHttpRequest(); 
     req.addEventListener("load", function(){ 

      var splitters = this.responseText.split(";", 2); 
      var type = splitters[0]; 
      var encrypted = splitters[1]; 

      var decrypted = CryptoJS.AES.decrypt(encrypted, password).toString(CryptoJS.enc.Utf8); //Decrypt 
      var data = window.btoa(decrypted); //Encode the decrypted data into base64 

      iframe.src = "data:" + type + ";base64," + data; 

     }); 
     req.open("GET", url); 
     req.send(); 
    } 

    presentURL("/main"); 

    iframe.addEventListener("load", function(e){ 
     e.preventDefault(); 
     if (allowEvent){ 
      iframe.contentWindow.stop(); 
      //remove the 404 cause and call presentURL 
      presentURL(iframe.contentWindow.location.href.replace(/_\//, "")); 
     } 
     else { 
      allowEvent = true; 
     } 
    }); 
})(); 

В приведенном выше примере используется CryptoJS и не может работать во всех браузерах!

Этот код действительно работает!

+0

Спасибо всем. Я собираюсь поиграть с ним в течение следующих нескольких дней. – Wasteland

Смежные вопросы