Как вы можете проверить, изменил ли кто-то ваш HTML (используя что-то вроде Firebug)? - PullRequest
4 голосов
/ 06 марта 2011

Есть ли простой способ проверить, изменил ли кто-то ваш HTML?В настоящее время я пишу некоторый код, который берет данные из DOM и передает их в бэкэнд, где они, конечно, будут подвергнуты дезинфекции и проверке на точность, но мне было интересно, есть ли способ избежать этого на проходе.

Например, если у меня есть скрытый ввод с номером в нем, и кто-то изменяет это число в Firebug перед отправкой его на мой сервер, есть ли способ проверить, был ли изменен фактический HTML-код перед отправкойзапрос к серверу и, в основном, говорю им: «Эй, приятель, прекратите с моими вещами».

Я не совсем уверен, что это возможно, но если это так, я не знаю, как это сделать.

Ответы [ 4 ]

4 голосов
/ 06 марта 2011

Хм, я бы сказал, что HTML в браузере ваших пользователей на самом деле их .(т. е. с greasemonkey все в порядке) Материал снова не ваш, пока он не поступит на ваш сервер в виде URL-адреса, входных параметров формы HTML и файлов cookie - и все это, конечно, может быть изменено неизвестно вам.Таким образом, вы должны продолжать проверять такие данные;нет волшебной пули, которая позволила бы получить опыт надежного клиента.

3 голосов
/ 06 марта 2011

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

Конечно, это по-прежнему не будет настолько безопасным, поскольку кто-то может легко провести некоторые эксперименты на вашем сайте и выяснить, на чем основана эта секретная ценность, исключительно исходя из вашей скрытой ценности и значения проверки, а затем изменитьзначение проверки также.

Можно придумать вычисления, которые сделают довольно трудным (но не невозможным) взлом такого типа проверки.Однако со временем и усилиями, которые потребуются для разработки такого вычисления и последующего решения этого вопроса, чтобы не допустить появления новых эксплойтов, вам, вероятно, будет лучше просто очистить данные по мере их получения.

По моему мнению, вам лучше не полагаться на какие-либо данные, полученные пользователем.Конечно, есть некоторые приемы, которые можно сделать, чтобы выполнить то, что вы просите, и это может быть один из них, но большинство всех этих приемов, скорее всего, могут быть обнаружены злоумышленником при наличии достаточного времени.

3 голосов
/ 06 марта 2011

Вы можете увидеть, если кто-то изменяет скрытые input элементы с помощью Firebug, используя JavaScript, но идея звучит глупо.

Вся ваша критическая проверка должна выполняться на стороне сервера.

Вы не можете полагаться на то, что клиент посылает точно. Если кто-то действительно хочет «связываться с вашими вещами», он может легко (например) написать скрипт Python для отправки данных на ваш сервер.


Вот пример на основе jQuery того, на что я ссылался в своем комментарии:

Демонстрационная версия # 2

  • Нажмите «Отправить»: фон станет зеленым - ничего не изменилось.
  • Измените значение скрытого input, нажмите Submit: фон станет красным - что-то изменилось.

HTML:

<form id="myForm" method="post" action="">
    <input type="hidden" value="123" />
    <input type="hidden" value="456" />
    <input type="submit" />
</form>

JS # 2:

$('#myForm input[type="hidden"]').each(function() {
    $(this).data('originalValue', $(this).val());
});

$('#myForm').submit(function(){
    $(this).find('input[type="hidden"]').each(function() {
        if ($(this).val() != $(this).data('originalValue')) {
            $('body').css('background', 'red');
            return false;
        }
        //just for testing:
        $('body').css('background', 'green');
    });
    return false;
});
2 голосов
/ 06 марта 2011

Есть некоторые вещи, которые вы можете сделать в JavaScript, например, сохранение копии ожидаемого значения в JavaScript:

var originalHiddenFieldValue = document.getElementById("myHiddenField").value;

... позже ...

if (originalHiddenFieldValue !== document.getElementById("myHiddenField").value)
    alert("Hey, stop it!");

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

Если вы пытаетесь проверить эти вещи, единственный способ сделать это со 100% -ной уверенностью - это проверить скрытое поле на стороне сервера и сравнить значения, как вы уже сказали, что делаете.

...