На какой процент моего времени будет потрачен во вводе данных пользователем verfication во время веб-разработки?

Попробуйте сделать что-то вроде этого:

db.getCollection('collectionName').find({'ArrayName.1': {$exists: true}})

1 - это номер, если вы хотите получить запись больше 50, а затем ArrayName.50 Спасибо.

7
задан Jeremy Banks 21 September 2008 в 07:33
поделиться

7 ответов

@Jeremy - некоторые специфические особенности PHP

Когда дело доходит до запросов базы данных всегда пытайтесь использовать подготовленные параметризированные запросы. mysqli и PDO библиотеки поддерживают это. Это бесконечно более безопасно, чем использование функций выхода, таких как mysql_real_escape_string.

Да, mysql_real_escape_string является эффективно просто строковой функцией выхода. Это не чудодейственное средство. Все, что это сделает, выйти из опасных символов, чтобы их могло быть безопасно использовать в строке единого запроса. Однако, если Вы не санируете свои исходные данные заранее, то затем Вы будете уязвимы для определенных векторов атаки.

Вообразите следующий SQL:

$result = "SELECT fields FROM table WHERE id = ".mysql_real_escape_string($_POST['id']);

Необходимо смочь видеть, что это уязвимо для использования.
Вообразите id параметр содержал общий вектор атаки:

1 OR 1=1

Нет никаких опасных символов в их для кодирования, таким образом, это передаст прямо через фильтр выхода. Отъезд нас:

SELECT fields FROM table WHERE id = 1 OR 1=1

Который является прекрасным вектором Внедрения SQL.

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

Что касается htmlspecialchars (). Это - собственное минное поле.

Существует настоящая проблема в PHP, в котором она имеет целый выбор различных связанных с HTML функций выхода и никакое ясное руководство на точно, которое функции делают что.

Во-первых, если Вы в HTML-тэге, Вы находитесь в реальной проблеме. Посмотрите на

echo '<img src= "' . htmlspecialchars($_GET['imagesrc']) . '" />';

Мы уже в HTML-тэге, таким образом, нам не нужно <или> сделать что-либо опасное. Наш вектор атаки мог просто быть javascript:alert(document.cookie)

Теперь результирующий HTML похож

<img src= "javascript:alert(document.cookie)" />

Нападение добирается прямо через.

Это ухудшается. Почему? потому что htmlspecialchars только кодирует двойные кавычки и не единственный. Таким образом, если мы имели

echo "<img src= '" . htmlspecialchars($_GET['imagesrc']) . ". />";

Наш злой взломщик может теперь ввести целые новые параметры

pic.png' onclick='location.href=xxx' onmouseover='...

дает нам

<img src='pic.png' onclick='location.href=xxx' onmouseover='...' />

В этих случаях нет никакого чудодейственного средства, просто необходимо санировать вход сами. При попытке отфильтровать неверные символы, то Вы, конечно, перестанете работать. Проявите подход белого списка и только пропустите символы, которые хороши. Посмотрите на шпаргалку XSS для примеров о том, как разнообразные векторы могут быть

Даже при использовании htmlspecialchars ($string) за пределами HTML-тэгов Вы все еще уязвимы для векторов атаки многобайтового набора символов.

Самое эффективное, которым можно быть, должно использовать комбинацию mb_convert_encoding и htmlentities следующим образом.

$str = mb_convert_encoding($str, ‘UTF-8′, ‘UTF-8′);
$str = htmlentities($str, ENT_QUOTES, ‘UTF-8′);

Даже это оставляет IE6 уязвимый из-за способа, которым это обрабатывает UTF. Однако Вы могли отступить к более ограниченному кодированию, такому как ISO-8859-1, пока использование IE6 не понижается.

9
ответ дан 6 December 2019 в 07:08
поделиться

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

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

Особый случай для хранения под радаром - когда Вы позволяете богатому содержанию быть представленным, который может содержать html/javascript. Это может позволить злонамеренному пользователю вводить JavaScript в Ваших данных, которые инициируют код, которым Вы не управляете при рендеринге его. Не пробуйте к коду доступа самокрутки. Ищите сеть бесплатно, протестированный, сохраняемый код, который сделает это для Вас. У Jeff было несколько указателей в том отношении в одном из подкастов.

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

8
ответ дан 6 December 2019 в 07:08
поделиться

Нет. Это не нормально. Возможно, Вы должны:

  • Используйте компоненты прав для предотвращения Внедрения SQL (PreparedStatements в Java)
  • Создайте компонент, который "фильтрует" сообщения, появляющиеся от пользователя (сервлет Просачиваются Java).

Любой современный язык имеет поддержку обеих вещей.

С уважением

2
ответ дан 6 December 2019 в 07:08
поделиться

Я рад, что Вы заботитесь для защиты себя. Слишком многие не делают.

Однако как другие сказали, лучший выбор архитектуры заставит Ваши проблемы уйти. Используя подготовленные операторы (большинство языков должно иметь поддержку того) заставит атаки с использованием кода на SQL уйти. Плюс со многими базами данных они приведут к значительно лучшей производительности. Обработка атак с использованием кросс-сайтовых сценариев более хитра. Но основная стратегия должна состоять в том, чтобы решить, как Вы выйдете из ввода данных пользователем, решите, где Вы выйдете из него и всегда делать это в том же месте. Не попадайте в прерывание размышления, что больше лучше! Последовательно выполнение его одним способом в одном месте будет достаточно и избежит того, что вы имели необходимость выяснить, какой из нескольких уровней выхода вызывает определенную ошибку.

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

2
ответ дан 6 December 2019 в 07:08
поделиться

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

Вы не можете сделать реальной безопасности этот путь.

У Вас должны быть некоторые обертки, которые сделали бы производящий небезопасный код трудно, если не невозможным. Например, подготовленные операторы. Но можно хотеть использовать ORM, как ActiveRecord Ruby on Rails или некоторый эквивалент в платформе.

Для вывода и защиты XSS, удостоверьтесь, что производит, оставлен из HTML по умолчанию. Затем, если действительно необходимо произвести, генерировал HTML пользователю, Вы сделаете это явно, и будет легче проверить.

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

2
ответ дан 6 December 2019 в 07:08
поделиться

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

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

Относительно процента времени Вы тратите: проверка очень важна, и требуется некоторая мысль, если не некоторое время. Но процент зависит от того, насколько большой Ваше приложение, нет? В очень небольшом приложении, скажем, только регистрация новостной рассылки, довольно возможно, что проверка берет огромный процент Вашего времени.

В объемных приложениях, т.е. где у Вас есть много кода непрезентации, это не нормально.

1
ответ дан 6 December 2019 в 07:08
поделиться

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

Попытайтесь определить общие типы контроля ввода, в котором Вы нуждаетесь

  • числовой / представляют значения в виде строки / regex проверка
  • расположитесь / длина
  • выход из специальных символов
  • проверьте на общие ключевые слова, которые Вы не ожидаете в конкретном контексте ('сценарий', 'выберите', 'отбросьте'...) против черного списка

и назовите их систематически прежде, чем обработать данные.

Весь доступ к базе данных должен быть сделан с подготовленными операторами и не конкатенацией строки запроса.

Всего вывода нужно оставить, начиная с Вас, d'ont хотят сохранить все, вышел в Вашей базе данных.

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

1
ответ дан 6 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: