Как декодировать файл из кодировки 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 вы задаете неправильный вопрос.