Статьи

Паранойя: межсайтовый скриптинг

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

Хорошо, ты думаешь, что твой код в безопасности, а? У вас есть новейшее удобное шифрование, и вы готовы использовать свои патчи и пакеты обновлений. Но вы знаете, что? Вы делаете критическую ошибку на своем сайте, и вы можете даже не знать об этом.

Проблема

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

Скажем, вы передаете имя пользователя с одной страницы на другую, а затем отображаете значение строки запроса на странице с помощью 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, и следующая вещь, которую знает конечный пользователь, — это лицом к лицу причудливая картина, изображающая различные неумышленные предложения и ставки для онлайн-казино … Вы понимаете. Что-то, что ты не хочешь, чтобы твоя бабушка видела, когда она ожидает фотографии маленького Джонни…

Итак, как вы предотвращаете межсайтовый скриптинг? Хе-хе, я думал, ты никогда не спросишь!

Решение

Во-первых, давайте сделаем пару вещей прямо — будь умным, а не глупым. Следуйте этим простым правилам:

  1. Если вы ожидаете данные определенного типа, убедитесь, что это именно то, что вы ожидаете.

  2. Проверьте длину — если вы ожидаете fName только из 25 символов, отрежьте лишние символы и бросьте их. Не дай злому Эдди никакого шанса нанести большой урон.

  3. Ищите недопустимые символы — как < или > или вездесущий ; , Не просто берите то, что вы получаете из строки запроса; подвергните сомнению все ваши комментарии. Не доверять никому. В самом деле.

Хорошо, вот небольшой фрагмент кода — очевидно, вы захотите конкретизировать это, чтобы соответствовать вашему конкретному сайту:

 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");

Будьте осторожны с межсайтовым скриптингом. Это серьезная проблема, которую можно легко решить. И помните, что когда дело доходит до ввода пользователя, вы никогда не будете слишком параноиком … даже если они следят за вами.