Как декодировать файл из кодировки base64 с помощью JavaScript - PullRequest
11 голосов
/ 27 ноября 2011

В моей компании очень строгий интранет для работы, в сети есть единый портал для входа и выхода файлов. Безопасность дверного проема не позволяет использовать специальные типы файлов (только * .txt, * .doc и т. Д.), И даже в этих конкретных типах файлов он ищет шаблоны, которые подтверждают, что файл действительно является таким. (Вы не можете просто замаскировать файл * .zip как файл * .doc.)

Как проект безопасности, мне сказали найти способ обойти эту систему и вставить один файл .exe на языке C, который говорит 'Hello World'.

Я подумал о том, чтобы изменить расширение на .txt, и base64 закодировать его, чтобы оно было более приемлемым для системы. Проблема в том, как его декодировать, как только он появится. Снаружи это очень просто, PHP или любой другой приличный язык могут сделать это для меня. Однако там единственный доступный мне язык - это JavaScript (в IE6 и, может быть, MAYBE в IE8).

Таким образом, вопрос заключается в следующем: могу ли я использовать JavaScript для чтения файла из файловой системы, его декодирования и обратной записи? или хотя бы отобразить результат для меня?

Обратите внимание, что я не прошу декодировать / кодировать сообщение, это просто, я смотрю, чтобы декодировать кодировать файл .

Спасибо.

Ответы [ 5 ]

6 голосов
/ 09 декабря 2011

JSON может быть ответом, который вы ищете.Это действительно может помочь.

  1. Кодируйте ваш текстовый файл в формате JSON.Весьма вероятно, что он пройдет проверку безопасности вашей компании

    var myJsonData = { "text" : "SGVsbG8sIHdvcmxkIQ==" };  // <-- base64 for "Hello, world!"
    
  2. Импортируйте ваш текстовый файл, используя простой синтаксис html-скрипта

    <script src="hello.txt" type="text/javascript"> </script>
    
  3. Это оно!Теперь вы можете получить доступ к объекту JSON, используя синтаксис:

    alert(myJsonData.text);
    
  4. Чтобы завершить работу, получите этот простой Javascript base64 декодер.

  5. Готово.Вот (очень простой) код, который я использовал:

    <!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>
    
6 голосов
/ 28 ноября 2011

Используя только javascript (т.е. без плагинов, таких как AIR и т. Д.), Браузеры не разрешают доступ к файловой системе. Мало того, что невозможно записать файл на диск, его невозможно даже прочитать - браузеры очень строги в этом отношении, слава богу.

3 голосов
/ 09 декабря 2011

Вы не можете сделать это с прямым JS в браузере, контекст безопасности и DOM не разрешают доступ к файловой системе.

Вы не можете сделать это с текущими версиями flash, более старые версии (до 7 IIRC) имели некоторыенедостатки безопасности, которые допускают доступ к файловой системе.

Вы можете сделать это с помощью специального плагина и, возможно, подписанного Java-апплета или COM (компонент ActiveX, только IE).

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

2 голосов
/ 09 декабря 2011

Все зависит от того, как вы можете получить файл. Если у вас есть exe-код в формате base-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

1 голос
/ 11 декабря 2011

Если система безопасности сканирует шаблоны в файлах, маловероятно, что она пропустит файл в кодировке base64 или в кодировке base64.Вложения электронной почты кодируются в base64, и, если система исправна, она проверяет потенциально опасные вложения электронной почты, даже если они называются .txt.Закодированный в base64 запуск EXE-файла почти наверняка распознается им.Итак, ISTM вы задаете не тот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...