Некоторое время я все больше смущаюсь из-за возможных уязвимостей 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']. Что вы предлагаете и как вы предлагаете мне это сделать. Пожалуйста, напишите пример.