[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Безопасное использование информации пользователя
Владимир55
Целый день читал статьи про XSS, инъекции, htmlspecialchars, addslashes… И, в конце концов, запутался окончательно.

Задача стоит такая: на странице 1.php посетитель вводит данные в форму (без перезагрузки, с подсчетом количества введенных знаков), и эти данные записываются в базу. При следующем посещении страницы посетитель видит в форме ранее введенную им информацию и может её изменить.

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

Чтобы разобраться, как это работает, я сделал макет, в котором вместо базы инфа записывается в текстовые файлы. Вот их коды:

Файл 1.php:

<script src="/js/jquery-3.6.4.min.js"></script>

<!-- Подсчет оставшихся знаков -->
<script>
function
checklength(t){
var ml = $(t).attr('maxlength');
var diff = ml - $(t).val().length;
var ad = $(t).nextAll('div:first');
if (diff==ml){
ad.html(' ').css('color','green');
}
else if(diff>10){
ad.text('Осталось знаков: '+diff).css('color','green');
}
else{
ad.text('Осталось знаков: '+diff+'!').css('color','red');
}
}

</script>

<?php

$busedu = @file_get_contents('storage.txt');
// Замена сущностей на HTML
$busedu = html_entity_decode($busedu, ENT_QUOTES, 'UTF-8')
?>

<div
id="busedu">
<textarea
name="busedu" maxlength="500" onkeyup="checklength(this);" ><?php echo $busedu; ?></textarea>
<div
class="znak"> </div>
<div
class="maxznak"><p style="text-align:center; margin: 0;">Max 500</p></div>
</div>
<input
type="hidden" name="id-form" value="busedu-f">
<input
class="pusk" style="display:block;" type="submit" name="submit" value="Отправить">
</form>
<div
id="busedu-fs"></div>


<script>

$(document).ready(function () {
$('.group_b').submit(function () {
// Получение ID формы
var formID = $(this).attr('id');
// Добавление решётки к имени ID
var formNm = $('#' + formID);
var formNms = $('#' + formID + 's');
$.ajax({
type: "POST",
url: '/send.php',
data: formNm.serialize(),
beforeSend: function () {
// Вывод текста в процессе отправки
$(formNms).html('<p style="text-align:center">Отправка...</p>');
},
success: function (data) {
// Вывод текста результата отправки
$(formNms).html('<p style="text-align:center">'+data+'</p>');
},
error: function (jqXHR, text, error) {
// Вывод текста ошибки отправки
$(formNms).html(error);
}
}
);
return false;
});
});
</script>




Файл send.php
if ($_POST['id-form'] == "busedu-f")
{
// Замена HTML сущностями
$busedu = htmlentities($_POST['busedu'], ENT_QUOTES, 'UTF-8');

if (strlen($busedu) > 0)
{
file_put_contents('storage.txt', $busedu);
echo "Принято";
}
else
{
file_put_contents('storage.txt', "");
echo "Данные не введены или удалены";
}

/* Здесь какая-то обработка на уровне РНР, включая регулярку, в результате которой удаляются ссылки и вставляются шорт-коды, в результате чего из переменной $busedu формируется переменная $control
*/


file_put_contents(control.txt', $control);

}



Файл 2.php

$control = @file_get_contents(control.txt');
echo $control;


Здесь вместо базы используется запись в файлы, в реальном коде будет запись в базу. Тем не менее, как мне кажется, экранировать (использовать addslashes) нет нужды, поскольку кавычки заменены их сущностями.

Правильно ли здесь сделана защита от хакеров?
Или надо сделать что-то иначе?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.