Как декодировать файл из кодировки base64 с помощью JavaScript
У моей компании очень строгая интрасеть для работы, в сети есть один дверной проем, позволяющий входить и выходить в файлы. Безопасность дверного проема не позволяет создавать специальные файлы (*.txt, *.doc и т.д.) И даже в тех конкретных файлах, он ищет шаблоны, которые утверждают, что файл действительно такой. (Вы не можете просто замаскировать *.zip файл как файл *.doc.)
В качестве проекта безопасности мне сказали найти способ обойти эту систему и вставить один файл .exe с языком C., который говорит 'Hello World'
.
Я решил изменить расширение на .txt и base64, чтобы он был более приемлемым для системы. Проблема в том, как декодировать ее, когда она находится внутри. Это очень легко снаружи, PHP или любой другой достойный язык могут сделать это для меня. Тем не менее, там, единственный реальный язык, к которому я имею доступ, - это JavaScript (на IE6 и, возможно, MAYBE, на IE8).
Итак, вопрос в следующем: могу ли я использовать JavaScript для чтения файла из файловой системы, декодирования и записи его? или хотя бы показать результат для меня?
Обратите внимание, что я не прошу декодировать/кодировать сообщение, это легко, я хочу декодировать кодировку файла.
Спасибо.
Ответы
Ответ 1
JSON может быть ответом, который вы ищете. Это действительно может сделать трюк.
-
Кодирует ваш txt файл в формате JSON. Очень вероятно, что он сможет обеспечить безопасность вашей компании.
var myJsonData = { "text" : "SGVsbG8sIHdvcmxkIQ==" }; // <-- base64 for "Hello, world!"
-
Импортируйте файл txt с помощью простого синтаксиса html script
<script src="hello.txt" type="text/javascript"> </script>
-
Что это! Теперь вы можете получить доступ к объекту JSON с помощью синтаксиса:
alert(myJsonData.text);
-
Чтобы выполнить свою работу, получите этот простой Javascript base64-декодер.
-
Вы закончили. Здесь (очень простой) код, который я использовал:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title></title>
<script src="base64utils.js" type="text/javascript"> </script>
<script src="hello.txt" type="text/javascript"> </script>
<script type="text/javascript">
function helloFunction() {
document.getElementById("hello").innerHTML = decode64(myJsonData.text);
}
</script>
</head>
<body onload="helloFunction();">
<p id="hello"></p>
</body>
</html>
Ответ 2
Использование только javascript (т.е. никаких плагинов, таких как AIR и т.д.), браузеры не разрешают доступ к файловой системе. Мало того, что невозможно записать файл на диск, его невозможно даже прочитать - браузеры очень строгие по этому поводу, слава богу.
Ответ 3
Вы не можете сделать это с помощью прямого JS в браузере, контекст безопасности и DOM не разрешают доступ к файловой системе.
Вы не можете сделать это с помощью текущих версий флеш, более старые версии (pre 7 IIRC) имели некоторые недостатки безопасности, которые позволяли доступ к файловой системе.
Вы можете сделать это с помощью настраиваемого плагина и, возможно, подписанного Java-апплета или COM (компонент ActiveX, только IE).
Я бы предложил работать с ИТ в отношении вашей интрасети, чтобы открыть контекст/разрешения, необходимые в этом случае, поскольку это может быть самый короткий путь к тому, что вы здесь хотите. Альтернативно, вы могли бы создать служебную программу командной строки для быстрого шифрования/дешифрования данных файлов, подписанных общим ключом.
Ответ 4
Все зависит от того, как вы можете получить файл. Если у вас есть кодированный exe с базой 64, как .txt, вы можете легко использовать Flash!
Я не совсем уверен, как вы это реализуете, но вы можете загрузить файл в flash и as3 с помощью flex.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import flash.net.FileReference;
import flash.net.FileFilter;
import flash.events.IOErrorEvent;
import flash.events.Event;
import flash.utils.ByteArray;
//FileReference Class well will use to load data
private var fr:FileReference;
//File types which we want the user to open
private static const FILE_TYPES:Array = [new FileFilter("Text File", "*.txt;*.text")];
//called when the user clicks the load file button
private function onLoadFileClick():void
{
//create the FileReference instance
fr = new FileReference();
//listen for when they select a file
fr.addEventListener(Event.SELECT, onFileSelect);
//listen for when then cancel out of the browse dialog
fr.addEventListener(Event.CANCEL,onCancel);
//open a native browse dialog that filters for text files
fr.browse(FILE_TYPES);
}
/************ Browse Event Handlers **************/
//called when the user selects a file from the browse dialog
private function onFileSelect(e:Event):void
{
//listen for when the file has loaded
fr.addEventListener(Event.COMPLETE, onLoadComplete);
//listen for any errors reading the file
fr.addEventListener(IOErrorEvent.IO_ERROR, onLoadError);
//load the content of the file
fr.load();
}
//called when the user cancels out of the browser dialog
private function onCancel(e:Event):void
{
trace("File Browse Canceled");
fr = null;
}
/************ Select Event Handlers **************/
//called when the file has completed loading
private function onLoadComplete(e:Event):void
{
//get the data from the file as a ByteArray
var data:ByteArray = fr.data;
//read the bytes of the file as a string and put it in the
//textarea
outputField.text = data.readUTFBytes(data.bytesAvailable);
//clean up the FileReference instance
fr = null;
}
//called if an error occurs while loading the file contents
private function onLoadError(e:IOErrorEvent):void
{
trace("Error loading file : " + e.text);
}
]]>
</mx:Script>
<mx:Button label="Load Text File" right="10" bottom="10" click="onLoadFileClick()"/>
<mx:TextArea right="10" left="10" top="10" bottom="40" id="outputField"/>
</mx:Application>
Чтобы декодировать его, просмотрите http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/Base64Decoder.html
Ответ 5
Если система безопасности сканирует шаблоны в файлах, очень маловероятно, что в файлах будет отсутствовать файл с кодировкой base64 или base64. Вложения электронной почты закодированы в base64, и если система будет хорошей, она сканирует потенциально опасные вложения электронной почты, даже если они называются .txt. Запуск в формате base64 EXE файла почти наверняка признан им. Поэтому ISTM вы задаете неправильный вопрос.