предотвращение xss в jquery, php, mysql в некоторых примерах - пожалуйста, совет - PullRequest
2 голосов
/ 28 марта 2012

Некоторое время я все больше смущаюсь из-за возможных уязвимостей XSS-атак на моей новой странице.Я много читал, здесь, на SO и других сайтах с гуглом.Я хотел бы защитить свою страницу настолько хорошо, насколько это возможно (да, я знаю, что не могу быть в безопасности на 100% :).

Я также знаю, как работает xss, но хотел бы попросить вас указать на некоторые уязвимые места в моем коде, которые могут быть там.Я использую jquery, javascript, mysql, php и html все вместе.Пожалуйста, дайте мне знать, насколько это безопасно, когда я использую такое кодирование.Вот идея.

html:

<input name="test" id="id1" value="abc">
<div id="button"></div>
<div id="dest"></div>

jQuery:

1. $('#id').click (function() {
2.        var test='def' 
3.        var test2=$('#id1').val();
4.        $.variable = 1;
5.        $.ajax({
6.        type: "POST",
7.          url: "get_data.php",
8.          data: { 'function': 'first', 'name': $('#id').val() },
9.          success: function(html){
10.                $('#dest').html(html);
11.                 $('#id1').val = test2;
12.            }
13.         })
14.  })

Я думаю, это довольно просто.У меня есть два элемента div - один - кнопка, второй - место назначения для текста, выводимого «get_data.php».Поэтому после нажатия моей кнопки значение ввода с идентификатором 'id1' переходит в get_data.php в качестве данных POST и в зависимости от значения этого значения mysql возвращает некоторые данные.Эти данные отправляются в виде html в div «destination».

get_data.php должен выглядеть следующим образом:

   [connecting to database]
   switch($_POST['function']) {
     case 'first':
3.       $sql_query = "SELECT data from table_data WHERE name = '$_POST[name]'";
         break;
     default:
         $sql_query = "SELECT data from table_data WHERE name = 'zzz'";    
   }
   $sql_query = mysql_query($sql_query) or die(mysql_error());
   $row = mysql_fetch_array($sql_query);    
   echo $row['data']

А пока посмотрим, что данные из mysql свободны от любых инъекций (я имею в видуmysql_real_escaped).

Хорошо, вот вопросы:

JQuery часть:

Строка 2: Кто-нибудь может изменить набор значений, например, то есть.инъекция?

Строка 3 и 11: Понятно, что указание того же значения, которое было набрано перед отправкой, является чрезвычайно опасной угрозой XSS.Как сделать его безопасным, не теряя функциональности (никакие html-теги не предназначены для копирования на ввод)

Строка 4: Кто-нибудь может изменить это значение путем инъекции (или любым другим способом?)

Строка8: Кто-нибудь может изменить значение переменной 'function', отправленной через POST?Если да, то как это предотвратить?

Строка 10: если данные POST экранируются перед помещением их в базу данных, они могут вернуть значение (я имею в виду повторный результат запроса sql), каким-то образом измененное между генерацией его с помощью сценария php ииспользовать его в jquery?

PHP часть:

Пожалуйста, посмотрите на третью строку.Безопасно ли писать: $ _POST [имя]?Я встретил совет, чтобы сделать что-то вроде этого:

     $sql_query = "SELECT data from table_data WHERE name = " . $_POST['name'];

вместо:

     $sql_query = "SELECT data from table_data WHERE name = '$_POST[name]'";

Отличается ли это каким-то образом, особенно в случае безопасности?Следующий вопрос к той же строке: если я хочу mysql_real_escape () $ _POST ['name'], какое было бы наилучшее решение (рассмотрим большой массив данных POST, а не только один элемент, как в этом примере): - to mysql_real_escape ()Каждые POST-данные в каждом запросе выглядят следующим образом:

$sql_query = "SELECT data from table_data WHERE name = " . mysql_real_escape($_POST['name']);
  • , чтобы экранировать весь запрос перед его выполнением

     $sql_query = "SELECT data from table_data WHERE name = " . $_POST['name'];
     $sql_query = mysql_real_escape($sql_query);
    
  • , чтобы написать функцию, котораяповторяет все данные POST и экранирует их:

     function my_function() {
        foreach ( $_POST as $i => $post ) {
             $_POST[$i] = mysql_real_escape($post)
        }
     }
    

Что, по вашему мнению, является лучшей и наиболее безопасной идеей?

Этот пост стал довольно большим, но xss действительно занимаетя сплю :) Надеюсь получить помощь здесь, парни, еще раз :) Все, что я здесь написал, было написано, а не скопировано, поэтому в нем могут быть небольшие ошибки, потеря запятых и т. д., поэтому не беспокойтесь об этом.

РЕДАКТИРОВАТЬ

Хорошо, так ... если я правильно понимаю, фильтрация данных не нужна на уровне JavaScript или на стороне клиента вообще.Все должно быть сделано через php.Итак, у меня есть некоторые данные, которые идут в ajax и далее в php, и в результате я получаю некоторые другие виды данных, которые выводятся на экран.Я фильтрую данные в php, но не все данные отправляются в mysql - часть этого может быть каким-то образом изменена и выведена на экран и возвращена как возвращаемое значение html успешно вызванного ajax.Я также должен упомянуть, что я не чувствую себя комфортно в ООП и предпочитаю структурный способ.Я мог бы использовать PDO, но все же (поправьте меня, если я ошибаюсь), я должен добавить фильтрацию вручную для каждого POST-данных.Конечно, я получаю некоторые преимущества в скорости.Но экранирование данных с использованием mysql_real_escape выглядит для меня пока «ручным на том же уровне».Поправь меня, если я ошибаюсь.Возможно, mysql_realescape не так безопасен, как PDO - если это так, то это причина для его использования.

Также я должен отметить, что данные, которые не попадают в базу данных, должны быть удалены для всех вредоносных текстов. Пожалуйста, посоветуйте, какую функцию мне следует использовать, потому что я нахожу много сообщений об этом. они говорят «использовать htmlentities ()» или «использовать htmlspecialchars ()» и так далее. Рассмотрим эту ситуацию: Ajax вызывается с атрибутом POST и вызывает file.php. Он отправляет в файл POST file.php данные, т.е. $ _POST ['data'] = 'malware alert ()'. Первое, что я должен сделать в file.php, это убрать все части угроз из $ _POST ['data']. Что вы предлагаете и как вы предлагаете мне это сделать. Пожалуйста, напишите пример.

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

XSS - Межсайтовый скриптинг .Вы говорите о SQL-инъекции .Я буду ссылаться на последнее.

JQuery Part

Можно изменить каждую команду JavaScript.Вы можете попробовать сами, просто установите Firebug, измените исходный код или вставьте новый код JavaScript в загруженную страницу и выполните запрос POST.Или используйте такие инструменты, как RestClient , чтобы напрямую отправить любой запрос POST.

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

PHP Part

Это всегда хорошая идея, чтобы дважды проверить каждый пользовательский ввод.Обычно обязательны два шага:

  1. Проверка ввода пользователя : Это в основном проверка правильности синтаксически ввода пользователя (например, регулярное выражение, проверяющее, является ли введенный пользователем текст вернымадрес электронной почты)
  2. Escape-запросы к базе данных : всегда экранировать динамические данные при подаче их в запрос к базе данных.Независимо от того, откуда он.Но не избегайте всей строки запроса, которая может привести к неожиданным результатам.

Возможно (и, надеюсь, вам) понравится идея использования решения ORM .Для PHP есть, например, Propel и Doctrine .Среди множества других полезных вещей они предоставляют надежные решения для предотвращения внедрения SQL.

Пример в Propel:

$result = TableDataQuery::create()
    ->addSelectColumn(TableDataPeer::DATA)
    ->findByName($_POST['name']);

Пример в Doctrine:

$qb = $em->createQueryBuilder();
$qb->add('select', 'data')
   ->add('from', 'TableData')
   ->add('where', 'name = :name')
   ->setParameter('name', $_POST['name']);
$result = $qb->getResult();

AsВы можете видеть, что нет необходимости экранировать пользовательский ввод вручную, ORM сделает это за вас (это называется параметризованными запросами ).

Обновление

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

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

Да,абсолютно!

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

0 голосов
/ 28 марта 2012

Существует дополнение Firefox для проверки вашего сайта на XSS, оно называется XSS Me

Также вы можете перейти на

http://ha.ckers.org/xss.html

для большинства XSS-атак

и перейдите на

http://ha.ckers.org/sqlinjection/

для большинства SQL-инъекций

и попробуйте их на своем сайте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...