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 и не может работать во всех браузерах!
Этот код действительно работает!
Одна из идей заключается в шифровании страницы 'index.html' в каждом каталоге с использованием JavaScript и уникального пароля. Затем вы можете ссылаться на каждый из ресурсов в каталоге с индексной страницы. Ознакомьтесь с моим ответом [здесь] (http://stackoverflow.com/a/31013664/2234742). –
@MaximillianLaumeister. Хотя это классная идея для одиночных страниц, я не вижу, как вы могли бы защитить весь каталог, используя эту технику, без необходимости повторно вводить пароль. (Конечно, вы можете хранить пароль в локальном хранилище, но ...) – idmean
@idmean. Вы правы, это не защитит весь каталог, только URL-адреса, что означает, что безопасность будет невелика. –