Они следят за тобой, ты знаешь это? Они уже давно вас разглядывают, ищут способы облажаться с вами и вашим сайтом.
Хорошо, ты думаешь, что твой код в безопасности, а? У вас есть новейшее удобное шифрование, и вы готовы использовать свои патчи и пакеты обновлений. Но вы знаете, что? Вы делаете критическую ошибку на своем сайте, и вы можете даже не знать об этом.
Проблема
Если вы принимаете информацию, переданную в строке запроса, а затем отвечаете. Запишите ее на странице, э-э-э, брат, у вас есть проблемы … Вы готовы к выбору с помощью межсайтового скриптинга. Если вы уже не знаете, куда я иду с этим, продолжайте читать.
Скажем, вы передаете имя пользователя с одной страницы на другую, а затем отображаете значение строки запроса на странице с помощью Response.Write
, вы настраиваете себя на случай катастрофы! Посмотрите на эту невинную строку запроса:
http://whatzit.com/whatthe/WebForm1.aspx?fName=Lumpy
Вы пытаетесь сделать работу с бедным Lumpy более яркой, поэтому вы хорошо выполняете следующий код:
Response.Write(\"Hello \" + Request.QueryString(\"fName\"));
Когда вы запускаете этот код, вы получаете следующий вывод:
Hello Lumpy
Вот посмотрите на строку запроса, которая выдаст «Hello Lumpy»:
http://whatzit.com/whatthe/WebForm1.aspx?fName=Lumpy
Но если бы я был злым Эдди, я бы немного подсунул вам JavaScript, когда вы не смотрели!
http://whatzit.com/whatthe/WebForm1.aspx?fName= <script language='javascript'>alert("beotch");</script>
Угадай, что? Если вы вставите это в свой URL, в браузере появится всплывающее окно с сообщением «beotch»… что бы это ни значило!
Как в мире это произошло? Боже мой! Любой код, который вы выполняете в JavaScript, может быть передан на ваш сайт с помощью уязвимости Cross Site Scripting.
Проверьте этот URL …
http://whatzit.com/whatthe/WebForm1.aspx?fName=<script language='javascript'>window.navigate('http://mrPron');</script>
Хорошо да Теперь становится страшно… »Но« ты думаешь: «И что? Я имею в виду, кого волнует, могу ли я вставить JavaScript на чей-то сайт? Ну, подожди минутку. Проверьте следующую строку … Это заставит вас думать.
<a href="http:// whatzit.com/whatthe/WebForm1.aspx?fName=<script language='javascript'>window.navigate('http://mrPron');</script>">Mole Hair Removal</a>
Я посылаю кому-то, казалось бы, действительную ссылку на URL-адрес, и на самом деле, возможно, они действительно попадают на сайт, но они также получают что-то еще … маленький неприятный JavaScript, который я встроил в ссылку.
Довольно плохо, а? Представьте, что кто-то разослал ваш URL, и следующая вещь, которую знает конечный пользователь, — это лицом к лицу причудливая картина, изображающая различные неумышленные предложения и ставки для онлайн-казино … Вы понимаете. Что-то, что ты не хочешь, чтобы твоя бабушка видела, когда она ожидает фотографии маленького Джонни…
Итак, как вы предотвращаете межсайтовый скриптинг? Хе-хе, я думал, ты никогда не спросишь!
Решение
Во-первых, давайте сделаем пару вещей прямо — будь умным, а не глупым. Следуйте этим простым правилам:
- Если вы ожидаете данные определенного типа, убедитесь, что это именно то, что вы ожидаете.
- Проверьте длину — если вы ожидаете fName только из 25 символов, отрежьте лишние символы и бросьте их. Не дай злому Эдди никакого шанса нанести большой урон.
- Ищите недопустимые символы — как
<
или>
или вездесущий;
, Не просто берите то, что вы получаете из строки запроса; подвергните сомнению все ваши комментарии. Не доверять никому. В самом деле.
Хорошо, вот небольшой фрагмент кода — очевидно, вы захотите конкретизировать это, чтобы соответствовать вашему конкретному сайту:
private bool checkValueQS(string QS) { Regex r = new Regex("[^0-9a-zA-Z]"); // Find a single match in the string. Match m = r.Match(QS); if (m.Success) { return true; } return false; }
Это не Rocket Science — это довольно просто в концепции. Все, что я делаю, это пытаюсь НЕ сопоставить цифры 0-9 и действительные буквы az и AZ. Все остальное запрещено. Затем вы можете перенаправить вашего злонамеренного конечного пользователя, который пытался передать теги ‘ol script.
Попробуйте это в следующий раз, когда захотите проверить Lumpy:
private void Page_Load(object sender, System.EventArgs e) { if (Request.QueryString["fName"] != null) { if (checkValueQS(Request.QueryString["fName"].ToString()) == false) { Response.Write("Hello " + Request.QueryString["fName"]); } else { Response.Write("Hello... JERK!"); } } }
Обратите внимание, что если конечный пользователь пытается передать что-либо, кроме числа или буквы, ему сообщают с помощью Response.Write("Hello... JERK");
Будьте осторожны с межсайтовым скриптингом. Это серьезная проблема, которую можно легко решить. И помните, что когда дело доходит до ввода пользователя, вы никогда не будете слишком параноиком … даже если они следят за вами.