Как за одну минуту восстановить текст после неудачной отправки веб-формы

    Бывало ли когда-нибудь так, что вы набирали в браузере длинный и интересный текст, внимательно вычитывали его, и тут, буквально через мгновение, понимали, что при обращении к сайту произошла ошибка, а ваш текст в форме был стёрт?

    В основном такое бывает из-за невнимательности разработчиков сайтов (под разработчиками я в данном случае подразумеваю не только программиста, который мог не знать о нужном способе, но и, например, менеджера, который посчитал, что тратить на это время слишком нецелесообразно): современные веб-технологии (например, Web Storage) позволяют сохранять и восстанавливать данные (в том числе данные форм) при почти любых обстоятельствах — вплоть до случайного закрытия браузера.

    И, тем не менее, вы писали длинный текст именно там, где ничего для сохранения данных формы не сделано.

    Можно ли теперь как-то восстановить данные, если вы не можете скопировать текст из формы и не можете отправить POST-запрос повторно?

    Не закрывайте браузер!


    Решение есть


    Если дело происходит в Linux, то вы можете воспользоваться потрясающе удобным способом сделать дамп области памяти, которую использует браузер. Впервые я прочитал о применении этого метода для восстановления данных, потерянных в браузере, на superuser.com — одном из сайтов StackExchange. Это был ответ пользователя с именем Joey Adams на вопрос «How do I recover a form in Firefox *without* installing a plugin?».

    Кстати, работает этот способ не только в Linux.

    Для Windows, спасибо Lord_D:

    Дампы очень просто делаются Process Explorer'ом. Для консоли есть PMDump. А изучать дамп можно каким-нибудь HEX-редактором (к примеру, из бесплатных — HxD) или тем же grep.

    Для Mac, спасибо BeLove:

    lldb --attach-pid PID
    

    Итак, начнём.

    Шаг 1


    Убедитесь, что у вас установлен gdb (GNU Debugger). Вам понадобится утилита gcore, которая может делать дамп оперативной памяти, которую использует запущенный процесс с определённым PID.

    Шаг 2


    Вы ведь не закрывали браузер? В таком случае выясните номер процесса:

    ps -e | grep firefox

    Теперь запустите gcore, чтобы создать дамп памяти для этого процесса:

    gcore номер_процесса

    Если ptrace при попытке использовать gcore выдаёт ошибку (Operation not permitted) — это означает, что в вашей системе процессы не могут обращаться к памяти других процессов, не являясь их дочерними процессами (даже при совпадении UID). Например, такую ошибку вы увидите в последних версиях Ubuntu, если вы не меняли соответствующее значение в файле /proc/sys/kernel/yama/ptrace_scope. Вообще говоря, в данном случае совершенно необязательно что-то перенастраивать — вы можете просто запустить gcore от имени суперпользователя.

    Шаг 3


    В текущем каталоге при запуске gcore появляется файл core.номер_процесса (например, core.20727). Кстати, учитывайте, что размер файла может быть очень большим. Например, у меня он сейчас получился 934 MiB.

    Теперь попробуйте с помощью grep проверить, есть ли в дампе нужные данные. Например, если в тексте вы упоминали браузер Safari, то вы можете искать по слову «Safari»:

    grep 'Safari' core.20727

    Если вы видите сообщение о том, что в файле есть совпадение (Binary file core.20727 matches) — это очень хорошая новость, переходите к четвёртому шагу. Если совпадения не нашлось — вспомните, что ещё было в тексте, и попробуйте указать что-нибудь другое.

    Шаг 4


    Теперь остаётся извлечь из двоичного файла нужные вам куски с текстом.

    Сделать это можно вот так:

    grep -B 20 -A 20 -a 'Safari' core.20727 > /tmp/out

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

    Шаг 5


    Теперь откройте получившийся файл и найдите в нём свой текст. Например, с помощью less /tmp/out:



    Всем приятного вечера. И не забывайте про Ctrl + S. :)
    Поделиться публикацией

    Комментарии 69

      +51
      Знаю один такой ресурс, на котором сообщение через раз постится. Приучился жать Ctrl+A, Ctrl+C перед отправкой любого текста.
      По теме — оно могло и не сохраниться, если память под текст выделяется в стеке и потом затирается по ходу выполнения других функций.
        0
        В данном случае я специально не пользовался браузером после того, как отправил форму — тут ведь как с файловыми системами: если ты удалил файл (без корзины), то нужно сразу же перестать пользоваться этой ФС и перемонтировать её в режиме «только чтение» — тогда ты с очень большой вероятностью сможешь без проблем восстановить нужный файл (например, если используется ext3, то можно восстановить с помощью ext3grep).
          +5
          Да дело не в браузере, лично я не знал, что сделать дамп памяти процесса так просто! Это может иногда сильно пригодиться. Спасибо.
            0
            Вопрос про восстановление удалённых данных, а что делать если я случайно сделал так:
            echo "" > my_very_important_file

            Не помню точно как (что-то было с cat) но один раз я так сделал. Потом ничего не придумал, что бы восстановить данные
              –3
              что делать если я случайно сделал так:
              echo "" > my_very_important_file

              Чтобы было не так обидно, можно попробовать напиться…
                0
                Теоретически это должно было просто установить метку размера файла в 0. Данные не должны были повредиться. Скорее всего их можно найти и восстановить. По крайней мере, я проделывал такое у меня такое на FAT32 с помощью Delphi. Это старый известный фокус.
                  +1
                  Не 0, а 1 байт. \n же запишется, если не указать флаг -n.

                  А для массовых восстановлений я неоднократно использовал R-Studio.
                0
                Вообще говоря, в зависимости от того, что это за файловая система, у вас может быть возможность восстановить файл, даже если вы случайно очистили его (не удаляя).

                Например небольшое исследование на эту тему: http://www.linuxquestions.org/questions/linux-general-1/how-to-recover-overwritten-file-774712/#post3788043

                Но общий принцип перестать использовать этот раздел на запись до того момента, когда вы восстановите всё, что хотите (либо сделаете полный дамп блочного устройства) сохраняется.
            • НЛО прилетело и опубликовало эту надпись здесь
                +7
                Ганза?:)
                  +7
                  жж?
                    +4
                    Как я вас понимаю, у меня это уже на уровне рефлекса (когда то писал большую статью и при отправке лег браузер).
                      +2
                      Такой список сайтов нарушили.
                    • НЛО прилетело и опубликовало эту надпись здесь
                      +6
                      В хроме жмешь back — и все данные в форме, как перед постом. Спасало не раз.
                        +20
                        В Opera аналогично, но не во всех случаях — текст в WYSIWYG-редакторах практически никогда не «запоминается» браузером.
                          +25
                          Если форма динамическая — то далеко не всегда.
                          +2
                          Сейчас почти в каждом браузере есть что-нибудь эдакое для отладки, веб-консоль или еще что-нибудь. Просто включаешь и обновляешь страницу (отправляя форму еще раз). После чего из логов достаешь данные.
                            +1
                            Это очевидное решение, но и оно, к сожалению, не всегда работает. Представьте, например, что ошибка на сервере привела к тому, что после того, как вы отправили на сервер POST-запрос, сервер выдал ответ с кодом 302 и вы перешли на другую страницу. В этом случае вы не сможете повторно отправить форму путём обновления страницы.
                              0
                              А через Назад→Обновить?
                                0
                                Это тоже не будет работать — вы перейдёте на предыдущую страницу (с формой). А к тому POST-запросу, при котором был получен ответ с кодом 302, вы через историю навигации не вернётесь. Более того, это общераспространённая практика, и именно так принято отправлять формы: это называется PRG (Post/Redirect/Get). Проще говоря — always redirect after POST (показывать страницу по POST-запросу считается плохой практикой ­— после POST обязательно должно быть перенаправление на другую страницу). Применяется на очень многих сайтах — для того, чтобы пользователи, перемещаясь по истории (или обновляя текущую страницу), не отправили случайно форму ещё раз.

                                Помните, кстати, форумы? Invision Power Board, phpBB и прочие. Не знаю, как сейчас, но раньше там похожий механизм был реализован с помощь отдельной страницы, которая загружалась при размещении сообщения (и с которой через пару секунд происходило перенаправление к теме на форуме).
                                  0
                                  Помните, кстати, форумы?

                                  Вы так говорите, как будто их уже давно похоронили :)
                                  Да, там так и происходит, через промежуточную страницу.
                            +6
                            Если сюда заходят мультисистемщики вроде меня: в Windows этот способ также сработает. Дампы очень просто делаются Process Explorer'ом. Для консоли есть PMDump. А изучать дамп можно каким-нибудь HEX-редактором (к примеру, из бесплатных — HxD) или тем же grep.
                              +1
                              Большое спасибо!

                              Процитировал вас в блогозаписи (надеюсь, вы не против).
                                +2
                                Не против =)
                              +3
                              Вам понадобится утилита gcore, которая может делать дамп оперативной памяти, которую использует запущенный процесс с определённым PID.

                              Аррр, я такую искал году в 2008 в течение полугода, и так и не нашел, насколько помню. Спасибо за подсказку!
                                +1
                                Есть расширения и плагины, всеразличные форм-сейверы, тоже помогает, для тех кто часто постит большие тексты.
                                  +3
                                  Угу. Например, в упомянутом вопросе на superuser.com есть ссылка на расширение Lazarus. Так что это как раз один из случаев, когда можно и заранее обеспечить своим текстам дополнительную сохранность.
                                    +1
                                    А есть еще более мощные штуки ))) Ставятся в систему и запоминают N последних введенных символов, не важно куда. Не секурно конечно, но умные утилиты определяют когда вводятся пароли и не сейвят ввод. Зато железно!
                                      0
                                      Это ещё что! Есть такие устройства — можно через них клавиатуру подключить, и вообще тогда всё в безопасности. Даже если у вас операционная система аварийно завершится, всё равно весь ввод сможете прочитать. Да, что там говорить, если вы пароль BIOS забудете — всё равно сможете его получить, ведь эти устройства никак не зависят от операционной системы. :)
                                        0
                                        И совсем даже не для параноиков )) Похоже на регистратор, наверное когда память забивается, старье стирается. Ну или передается по секретному радиоканалу спецслужбам, нанятых за сохранность ввода.
                                          0
                                          Главное, уходя, не забыть повесить это устройство на монитор возле стикеров с паролями )
                                    +2
                                    А Lazarus вообще совсем-совсем не прокатит? Имхо, проще один раз поставить плагин и покрыть 99% случаем, а на оставшийся процентик можно уже и с дампами заморочиться. Но лучше Lazarus паставить сразу, ну или сразу после превого случая :")
                                      +2
                                      Вот тут как раз описывается, что делать, если последовательность оказалась обратная (сначала столкнулся с такой ситуацией, и уже потом поставил Lazarus или одно из других расширений). :)
                                        0
                                        Вот тут как раз описывается, что делать, если последовательность оказалась обратная

                                        Я так думаю, что столкнувшись с такой проблемой впервые, пострадавший вряд ли начнет гуглить способы решения по ключевым словам debug, dump, memory snapshot, выйдет на эту статью и начнет действовать по инструкции. Скорее всего она пригодится тогда, когда потенциальный пострадавший сначала прочитает статью, сделает себе пометочку в памяти, а потом, в далеком будущем, столкнется с проблемой и вспомнит о таком вот заковыристом пути ее решения. И тут самое время намекнуть, что расширение лучше поставить уже сейчас, чтобы с дампами возиться только когда расширение не спасет.

                                        И это… Lazarus есть и под хром
                                          0
                                          Ну не знаю, я написал в Гугле «firefox restore text» и нашёл это решение (как раз на superuser.com, на тот вопрос, где в одном из ответов предлагается именно такой вариант).
                                            +1
                                            Хм. действительно, 7-я ссылка сверху. Не ожидал что подобные инструкции окажутся настолько высоко по общим запросам с учетом засилия всевозможных плагинов для сохранения форм и инструкций по их установке и использованию «для чайников».
                                              0
                                              Кстати говоря:

                                              Скриншот
                                        +5
                                        Ещё strings(1) может помочь.
                                          +1
                                          Спасибо.

                                          Хотя у меня иногда получается, что во время набора текста на ноутбуке, я случайно тапаю по тачпаду. И, если курсор находится на ссылке, то я перехожу по ней. Насколько я понимаю, в этом случае, данный метод не поможет — ведь текст никуда не отправлялся.

                                          Я решал эту задачу с помощью дневника в PuntoSwitcher, но так как большие комментарии я редактирую, заменяю текст, переписываю абзацы — то и в журнале получается какая-то каша. В результате, отказался от Пунто, так как помогал редко, да и пароли тоже сохранял. Оно конечно шифруется и сам журнал паролем закрыт, но мало ли, утащат файл журнала, взломают, а там все пароли, переписка, номера карт с CVV и прочее.

                                          Поэтому, сейчас использую Lazarus. Хотя в его безопасности тоже не до конца уверен.
                                            0
                                            Сейчас специально попробовал сделать так, как вы описали:

                                            1. Набрал текст в форме комментария (прямо тут)
                                            2. Щёлкнул по ссылке (Raspberry Pi в качестве Time Capsule для Mac OS)
                                            3. Нажал кнопку «Назад» (текст моего комментария при этом исчез)

                                            Далее сделал дамп и проверил, остался ли в нём текст.

                                            И да, текст остался:

                                            # strings core.25166 | grep "So I type something"
                                            So I type something and accidentally click on a link.
                                            So I type something and accidentally click on a link.
                                              +2
                                              Кстати, а если много оперативы то можно сделать так.

                                              mkdir tmp
                                              mount -t tmpfs tmpfs tmp
                                              cd tmp
                                              gcore номер
                                              strings core.25166 | grep «So I type something»

                                              Явно будет шустрее чем гиг гонять на хард. А еще вроде как можно искать прямо на живом процессе из оперативки?

                                              Кстати, а что делать с хромом и его 20 процессами?
                                            +1
                                            Использую Lazarus для этих целей
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                +5
                                                …набирая команды в консоли точно так же, одним пальцем.
                                                  +5
                                                  Не выйдет.
                                                  C:\Users\user>ps -e | grep firefox
                                                  'ps' is not recognized as an internal or external command,
                                                  operable program or batch file.
                                                    +5
                                                    Не все так плохо
                                                    C:\Users\username>tasklist | findstr chrome
                                                    chrome.exe 4476 Console 1 165 508 КБ
                                                    chrome.exe 5108 Console 1 78 064 КБ
                                                    chrome.exe 5104 Console 1 28 428 КБ
                                                    chrome.exe 512 Console 1 19 652 КБ
                                                    chrome.exe 4900 Console 1 79 876 КБ
                                                    chrome.exe 5252 Console 1 24 632 КБ
                                                    chrome.exe 3340 Console 1 69 008 КБ
                                                  0
                                                  придётся кому-нибудь one-click ПО для всех основных браузеров написать
                                                  +4
                                                  не закрывайте браузер, читается как — «не переключайте канал», только из-за этого открыл статью
                                                    0
                                                    Как вариант: устанавливаем punto switcher включаем дневник и в случае чего восстанавливаем текст из дневника.
                                                      0
                                                      В linux пользуюсь менеджером буфера обмена Parcellite — главное, просто регулярно жать CTRL+A & CTRL+C.
                                                        +12
                                                        Как правило, перед отправкой формы копирую текст в буфер обмена; а иногда спасает „back”.

                                                        Но помню, чтобы восстановить ценный текст, однажды приходилось изменить файл hosts, добавить туда запись 127.0.0.1 site.ru, в скрипте PHP на localhost’е написать print_r($_POST) и нажать F5 в браузере дабы отравить данные заново. Цель была успешно достигнута.
                                                          +1
                                                          Открыть консоль разработчика, вкладку загрузок, поставить галку (запоминать), нажать F5, скопировать контент из данных post запроса.
                                                            0
                                                            Я точно не помню, но если не ошибаюсь тогда ещё не было «Web console» в Firefox (но уверен что было „Error console”).

                                                            Насчёт указанной Вами методе, проверил в Firefox’e: если сервер недоступен или интернет соединение разорвано, данный вариант не работает — вкладка „Sent Form Data” и „Response Headers” недоступны.
                                                          0
                                                          Вы знаете, под виндой я столкнулся с проблемой: могу найти в дампе нужную строку, но не могу ее скопировать в нужной кодировке. Хекс редакторы (некоторые) или даже тотал коммандер находят текст, но не отображают его полностью. Видимо проблема в том, что он хранится в уникоде и сдвинут относительно начала файла на 1-2 байта. Из за чего сам редактор неверно интерпретирует коды символов. Я сейчас с час потыкался и так и не понял, как решить эту проблему :(
                                                            0
                                                            так, отрезать от дампа кусок начиная с нужного смещения…
                                                              0
                                                              Можно отрезать конечно, но это уже три разных программы получается. К тому же придется скорее всего конвертировать размер смещения из шестнадцатеричного в десятичный и дамп резать на тома этого размера (тотал по умолчанию только так умеет). Если текста пару абзацев было, то честно говоря быстрее просто заново набрать, чем проводить столько операций.
                                                              0
                                                              winhex читает utf8
                                                              +2
                                                              Я в таких случаях пользуюсь плагином Textarea Cache для Firefox
                                                              addons.mozilla.org/en-US/firefox/addon/textarea-cache/
                                                                +1
                                                                Либо вышеупомянутый Lazarus Form Recovery.
                                                                Версия под Firefox
                                                                под Сhrome

                                                                Хранит историю последних введённых текстов, причём для каждого элемента – отдельную. Крайне удобно.
                                                                –1
                                                                Не могу представить себе человека, который бы пользовался подобным.
                                                                Зато на проблему можно посмотреть с точки зрения разработчика и вспомнить такую библиотеку как sisyphus.js
                                                                  0
                                                                  до этого никогда не слышал про gcore, по дефолту его нет на используемых дистрибутивах
                                                                  обычно дамп делается более стандартным способом kill -3 PID
                                                                    0
                                                                    Some of the more commonly used signals:
                                                                         1       HUP (hang up)
                                                                         2       INT (interrupt)
                                                                         3       QUIT (quit)
                                                                         6       ABRT (abort)
                                                                         9       KILL (non-catchable, non-ignorable kill)
                                                                         14      ALRM (alarm clock)
                                                                         15      TERM (software termination signal)


                                                                    и как же 3 сделает дамп???
                                                                    +2
                                                                    Имхо, так заморачиваться ради потерянного сообщения вконтакте не имеет смысла, лучше переписать его заново. А большие тексты, которые важно не потерять лучше в браузере и не писать.

                                                                    Меня же всегда выручал Punto Switcher с его дневником, в котором сохраняются все введенные данные.
                                                                      0
                                                                      Не знаю, я если вижу, что комментарий из одной строки вырастает в абзац и более — открываю OneNote, Блокнот или еще какой редактор и копирую после из формы в редактор и пишу пост/комментарий уже там.
                                                                        0
                                                                        Можно просто сидеть с постоянно включенным Fiddler2 :)
                                                                          –1
                                                                          вот и я о том же думаю. полный бред делать хип дамп чтобы узнать что там было отправлено. и не факт что ещё получится найти, хром может элементарно провести сборку мусора и все эти данные пропадут.
                                                                          0
                                                                          На MacOS дамп можно делать через lldb
                                                                          lldb --attach-pid PID
                                                                          

                                                                          Только что «спас» свой текст, часа два не сохранял, а потом тач «заел» и два раза назад перешел. Ух уж эти жесты.
                                                                            0
                                                                            Спасибо! Добавил способ тоже.

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

                                                                          Самое читаемое