Что корректный путь состоит в том, чтобы заставить веб-форму ввести безопасный для множества контекстов?

Один путь состоял бы в том, чтобы записать разархивировать метод для взятия InputStreams. Затем модульный тест мог создать такой InputStream из использования массива байтов ByteArrayInputStream. Содержание того массива байтов могло быть константой в коде модульного теста.

8
задан Douglas Treadwell 16 August 2009 в 02:48
поделиться

3 ответа

Я более чем немного скептически отношусь к тому, что такая структура общего назначения может существовать и быть менее сложной, чем язык программирования.

слои

  • Проверка поля ввода, числа, даты, списки, почтовые индексы, регистрация транспортных средств
  • Проверка между полями
  • Проверка домена - это действительное показание счетчика? В этом месяце мисс Джонс использовала электричество на сумму 300000000 фунтов стерлингов?
  • Проверка между запросами - действительно ли вы заказываете для себя два трансатлантических перелета в один и тот же день?
  • Согласованность базы данных, проверка внешнего ключа
  • SQL-инъекция

Также учитывайте действия при обнаружении нарушений.

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

Возможно, я ' не хватает твоего зрения? Вы видели что-нибудь, что приближается к тому, что вы имеете в виду?

1
ответ дан 5 December 2019 в 23:16
поделиться

Вы не можете использовать один метод для очистки данных для всех целей, но хорошее начало:

  • Используйте Filter_Var для проверки / дезинфекции

Фильтр Var принимает ряд различных типов данных и удаляет плохие символы (например, нецифровые для тех, что вы ожидаете быть числами), и проверяет его правильный формат (IP-адреса).

Примечание. Адреса электронной почты являются намного сложнее, чем реализация Filter_Var, поэтому поискайте нужную функцию в Google.

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

0
ответ дан 5 December 2019 в 23:16
поделиться

Как уже было сказано, есть несколько вещей, которые следует учитывать, когда вы беспокоитесь о веб-безопасности. Вот несколько основных принципов, которые следует учитывать:

  • Избегайте прямого ввода от пользователей, интегрированного в запросы и переменные.

Это означает, что не должно быть чего-то вроде $ variable = $ _POST ['user_input'] . В любой подобной ситуации вы передаете пользователю слишком много контроля. Если ввод влияет на какой-либо запрос к базе данных, всегда есть белые списки для проверки ввода пользователя. Если запрос предназначен для имени пользователя, проверьте список хороших имен пользователей. НЕ просто выполняйте запрос с вводом данных пользователем.

Одно (возможное) исключение - для строки поиска. В этом случае вам нужно продезинфицировать, все просто.

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

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

  • НИКОГДА не выводите что-либо от пользователя в браузер, не удаляя его.

Это, вероятно, самая важная вещь, на которую обращали внимание консультанты по безопасности. мне. Вы не можете просто полагаться на дезинфекцию ввода, когда его получает пользователь. Если вы не писали вывод самостоятельно, всегда убедитесь, что вывод безвреден, кодируя любые символы HTML или заключая его в тег

</code>. Это простая халатность со стороны разработчика, если пользователь A загружает фрагмент javascript, который вредит другим пользователям, просматривающим эту страницу. Вы будете спать лучше по ночам, зная, что любой пользовательский вывод не может делать ничего, кроме как отображаться в виде текста во всех браузерах. </p> <ul> <li> Никогда не позволяйте никому, кроме пользователя, управлять формой. </li> </ul> <p> XSS проще, чем должно быть, и настоящий боль покрыть одним абзацем. Проще говоря, всякий раз, когда вы создаете форму, вы предоставляете пользователям доступ к сценарию, который будет обрабатывать данные формы. Если я украду чью-то сессию или чей-то cookie, теперь я могу разговаривать со скриптом, как если бы я находился на странице формы. Я знаю тип ожидаемых данных и имена переменных, которые он будет искать. Я могу просто передать ему эти переменные, как если бы я был пользователем, а сценарий не мог отличить. </p> <p> Вышесказанное касается не санитарии, а проверки пользователем. Мое последнее замечание напрямую связано с этой идеей. </p> <ul> <li> Избегайте использования файлов cookie для проверки пользователей или ролей. </li> </ul> <p> Если я смогу украсть файл cookie пользователя, я смогу сделать больше, чем заставить этого одного пользователя пережить плохой день . Если я замечаю, что cookie имеет значение, называемое «член», я могу очень легко изменить это значение на «admin». Возможно, это не сработает, но для многих скриптов у меня будет мгновенный доступ к любой информации на уровне администратора. </p> <p> Проще говоря, нет одного простого способа защитить веб-форму, но есть основные принципы, которые упрощают то, что вы должны делать это, и это облегчит стресс, связанный с защитой ваших скриптов. </p> <p> Еще раз для хорошей меры: </div> <div class="votes-answer green"> <div class="vote-count" itemprop="upvoteCount">4</div><i class="fa fa-thumbs-o-up"></i> </div> <div class="clearfix"></div> <div class="action-time"> ответ дан <span title="5 December 2019 в 23:16 ">5 December 2019 в 23:16 </span> </div> <a class="s-link" href="/questions/201544/chto-korrektnyj-put-sostoit-v-tom-chtoby-zastavit-veb-formu-vvesti-bezopasnyj-dlja-mnozhestva-kontekstov#584" title="поделиться">поделиться</a> </div> <div class="post-layout--right"> <div id="comments-548732"> <ul class="comments-list js-comments-list" data-remaining-comments-count="0" data-canpost="false" data-cansee="true" data-comments-unavailable="false" data-addlink-disabled="true"> </ul> </div> </div> </div> </div> <div style="margin-top: 20px;"> Другие вопросы по тегам: <div class="tags" style="display: inline-block; float: none;"> <a href="/questions/tagged/php" class="tag" title="php" rel="tag">php</a> <a href="/questions/tagged/design-patterns" class="tag" title="design-patterns" rel="tag">design-patterns</a> <a href="/questions/tagged/user-input" class="tag" title="user-input" rel="tag">user-input</a> <a href="/questions/tagged/sanitization" class="tag" title="sanitization" rel="tag">sanitization</a> </div> <h3 class="m-t-20">Похожие вопросы:</h3> <div class="related-block"> <ul> <li><div class='votes-answer green'><span class='vote-count'>78</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/131613/skrytye-funkcii-php-zakrytyj" title="Скрытые функции PHP? [закрытый]">Скрытые функции PHP? [закрытый]</a> - 16 November 2012 17:08 </li> <li><div class='votes-answer green'><span class='vote-count'>43</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/172039/luchshij-redaktor-php-dlja-zakrytogo-vista" title="Лучший редактор PHP для [закрытого] Vista">Лучший редактор PHP для [закрытого] Vista</a> - 15 September 2008 22:49 </li> <li><div class='votes-answer green'><span class='vote-count'>34</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/82789/chto-takogo-plohogo-v-singletah-zakryto" title="Что такого плохого в синглетах? [закрыто]">Что такого плохого в синглетах? [закрыто]</a> - 27 July 2017 09:09 </li> <li><div class='votes-answer green'><span class='vote-count'>31</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/13430/kak-rasschitat-chislo-yanvar-mesyacz-mezhdu-dvumya-datami-s-ispol-zovaniem-php-duplicate" title="как рассчитать число Январь месяц между двумя датами с использованием php [duplicate] ">как рассчитать число Январь месяц между двумя датами с использованием php [duplicate] </a> - 22 March 2017 17:23 </li> <li><div class='votes-answer green'><span class='vote-count'>30</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/28173/neopredelennaya-peremennaya-v-fiktivnom-php-duplicate" title="Неопределенная переменная в фиктивном PHP [duplicate] ">Неопределенная переменная в фиктивном PHP [duplicate] </a> - 12 March 2018 02:52 </li> <li><div class='votes-answer green'><span class='vote-count'>30</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/28168/forma-e-lektronnoj-pochty-php-zastryavshaya-v-validacii-dublikat" title="Форма электронной почты PHP, застрявшая в валидации [дубликат] ">Форма электронной почты PHP, застрявшая в валидации [дубликат] </a> - 12 March 2018 02:52 </li> <li><div class='votes-answer green'><span class='vote-count'>30</span> <i class="fa fa-thumbs-o-up"></i></div> <a href="/questions/16603/php-proverit-proxodit-li-data-drugoj-dublikat" title="PHP - проверить, проходит ли дата другой [дубликат] ">PHP - проверить, проходит ли дата другой [дубликат] </a> - 29 January 2015 03:07 </li> </ul> </div> </div> </div> </div> </div> <aside class="sidebar"> <div class="awrap"> <script async src="https://yastatic.net/pcode-native/loaders/loader.js"></script> <script> (yaads = window.yaads || []).push({ id: "553274-2", render: "#id-553274-2" }); </script> <div id="id-553274-2"></div> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:inline-block;width:300px;height:600px" data-ad-client="ca-pub-2355906945027976" data-ad-slot="8038370725"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </aside> </div> </div> <footer class="footer"> <div class="wrapper wrapper--sm"> <div class="footer-navs-col"> <div class="footer-nav footer-nav--menu"> <div class="footer-coryright">© 2017 - 2020 Вопросы и ответы по программированию</div> </div> <div class="footer-nav footer-nav--catalog"> </div> </div> <div class="footer-contacts-col"> <div class="soc-widget-col"> </div> </div> <div class="clearfix"></div> </div> </footer> </div> <script type="text/javascript" src="/js/ui/jquery-ui-1.8.16.custom.min.js"></script> <script type="text/javascript" src="/js/ui/external/jquery.cookie.js"></script> <script type="text/javascript" src="/js/versions/menu.ru.u1607887878.js"></script> <script type="text/javascript" src="/js/jquery.fancybox.min.js"></script> <script type="text/javascript" src="/js/slick.min.js"></script> <script type="text/javascript" src="/js/jquery.maskedinput.min.js"></script> <script type="text/javascript" src="/js/versions/scripts.ru.u1607887878.js"></script> <!-- Yandex.Metrika counter --> <script type="text/javascript" > (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; var z = null;m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(90030325, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true }); </script> <noscript><div><img src="https://mc.yandex.ru/watch/90030325" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-123993370-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-123993370-1'); </script> </div> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "WebSite", "name": "Программирование - вопросы и ответы", "alternateName": "Программирование - вопросы и ответы", "url": "https://legkovopros.ru", "potentialAction": { "@type": "SearchAction", "target": "https://legkovopros.ru/search?search={search_term_string}", "query-input": "required name=search_term_string" } } { "@context": "https://schema.org", "@type": "Organization", "name": "Программирование - вопросы и ответы", "url": "https://legkovopros.ru", "logo": "https://legkovopros.ru/i/logo.png", "email": "info@legkovopros.ru", "telephone": "" } </script> </body> </html>