Сценарий комментариев к неструктурированным файлам

  • Автор темы leha666
  • 44
  • Обновлено
  • 15, May 2024
  • #1
Всем привет, Я написал небольшую систему комментирования плоских файлов, и все работает отлично! Он получает идентификатор сообщения со страницы, и отображаются все комментарии, помеченные этим идентификатором. Форма тоже работает отлично.

Однако мне было интересно, насколько это безопасно и есть ли способ сделать так, чтобы люди не могли использовать его для взлома моего сайта.

Я знаю, что при добавлении комментария в текстовый файл нет никаких проблем, но меня беспокоит отображение комментария обратно на странице.

Процесс утверждения отсутствует, поэтому как только комментарий будет оставлен, он появится. Я использовал PHP Strip_tags, чтобы удалить код из трех полей, но не уверен, достаточно ли этого.

Любая помощь будет очень признательна!
  <!-- ADD COMMENT -->

<?php

if (isset($_POST['submit'])) {

// CHECK FOR EMPTY FIELDS

$required = array('id', 'date', 'name', 'email', 'comment');

$error = false;

foreach($required as $field) {

if (empty($_POST[$field])) {

$error = true;

}

}

if ($error) {

$name = $_POST['name'];

$email = $_POST['email'];

$comment = $_POST['comment'];

echo 'All Fields Are Required';

} else {

$id = $postid;

$date = $_POST['date'];

$name = strip_tags($_POST['name']);

$email = strip_tags($_POST['email']);

$comment = strip_tags($_POST['comment']);

$fp = fopen("comments.txt","a");

// WRITE COMMENT TO FILE

if (@fwrite($fp, $id.'|'.$date.'|'.$name.'|'.$email.'|'.$comment."\n")) {

echo 'Your Comment Was Added';

$name = "";

$email = "";

$comment = "";

fclose($fp);

} else {

echo 'Your Comment Was Not Added';

fclose($fp);

}

}

}

?>

<div class="clear"></div>

<!-- COMMENT FORM -->

<form name="input" method="post" action="<?php echo $_SERVER['SCRIPT_NAME']?>">

<input type="hidden" name="id" id="id" value="<?php echo $postid ?>">

<input type="hidden" name="date" id="date" value="<?php echo date('F j, Y'); ?>">

<input type="text" class="comment-name" name="name" id="name" placeholder="Ваше имя" value="<?php echo $name ?>">

<input type="text" class="comment-email" name="email" id="email" placeholder="Адрес электронной почты" value="<?php echo $email ?>">

<textarea name="comment" id="comment" placeholder="Какой у вас вопрос или комментарий?"><?php echo $comment ?></textarea>

<input class="button" type="submit" name="submit" value="Ask A Question &middot; Comment">

</form>

<div class="clear"></div>

<!-- DISPLAY COMMENTS -->

<?php

$file = fopen("comments.txt", "r");

// WRITE EACH COMMENT

while (!feof($file) ) {

$line_of_text = fgets($file);

$parts = explode('|', $line_of_text);

if ($parts[0] == $postid) {

print "<div class='name-comment'>" . $parts[2] . " Said:</div><div class='text-comment'>" . $parts[4] . "</div><div class='date-comment'>" . $parts[1] . "</div>";

}

}

fclose($file);

?>
PHP:

leha666


Рег
11 Sep, 2013

Тем
1

Постов
2

Баллов
12
  • 21, May 2024
  • #2
Почему ты считаешь это шуткой? Это отличный способ хранить данные таким образом, чтобы их нельзя было случайно «запустить». На самом деле я предпочитаю его для параметров конфигурации, поскольку его может редактировать любой идиот, и он на удивление хорош для хранения именованных запросов.

Довольно часто это во много раз проще и эффективнее, чем XML.

но, честно говоря, почти ВСЕ более эффективно, чем XML, с точки зрения места для хранения и обработки данных.



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





На самом деле видел много шутников, называющих base64 «собственным форматом» и «эффективным хранилищем» - чего не было со времен мейнфреймов с 6-битными пространствами имен; ЕДИНСТВЕННАЯ причина, по которой электронные письма вообще используют его; 6 O 1. Еще смешнее, когда некоторые придурки называют это 64-битным форматом, это не перезапись, это формат 64 ЗНАЧЕНИЙ, потому что каждый символ соответствует 6-битному пространству имен!

Но да, сложные данные? Пора надеть штаны большого мальчика и воспользоваться БД.
 

Саня Притыка


Рег
02 Jan, 2013

Тем
0

Постов
2

Баллов
2
  • 01, Jun 2024
  • #3
Этого можно обойти с помощью временных файлов и/или просто проверить, доступен ли файл для записи (если нет, отложить запись на x мс) - метод не очень хорош в любом случае, но, по крайней мере, сделает это немного более крепкий.
 

neos1


Рег
18 Mar, 2015

Тем
1

Постов
3

Баллов
13
  • 03, Jun 2024
  • #4
Две вещи: 1) Вам нужно избежать ввода, чтобы удалить js/css/etc.. чтобы избежать XSS

атаки. 2) Вы должны понимать, что, поскольку вы используете файлы, у вас могут возникнуть проблемы с блокировкой/гонкой, если два человека одновременно отправляют комментарий - это не является серьезной проблемой на веб-сайтах с низким трафиком.
 

webweb


Рег
14 Apr, 2015

Тем
1

Постов
3

Баллов
13
  • 04, Jun 2024
  • #5
Я не вижу веской причины для использования плоского файла для хранения данных, отличных от xml, yaml,..., ini (шутка) для конфигурации... Нужно хранить данные? Используйте базу данных. Скорее всего, он уже установлен на вашем сервере и его проще использовать.
 

Pfent


Рег
14 Jun, 2014

Тем
0

Постов
1

Баллов
1
  • 05, Jun 2024
  • #6
Ваш список $required содержит поля, к которым вы пытаетесь получить доступ, внутри if ($error) — это означает, что эти значения могут существовать, а могут и не существовать, вызывая ошибки.

Я бы посоветовал при этой проверке ошибок выйти из цикла, как только вы узнаете, что есть ошибки, чтобы не тратить время на проверку дополнительных элементов, когда вы уже знаете, что есть ошибка, и я бы, вероятно, не стал создавать «переменные просто так». "там.

Точно так же пустой индекс массива может вызвать проблемы и ошибки, поэтому лучше использовать $_POST, используя вместо этого array_key_exists. ... и @ThePHPMaster совершенно прав, вам нужно очистить эти данные.

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

Хотя в CSV можно добавить несколько символов, его относительная простота делает его идеальным выбором, поэтому я бы записывал эти данные с помощью такой функции, как fputcsv.
http://php.net/manual/en/function.fputcsv.php
 

azaribenjamin


Рег
01 Jan, 2011

Тем
1

Постов
2

Баллов
12
  • 07, Jun 2024
  • #7
Здесь 4 вещи.

1. Вы используете $line_of_text = fgets($file)

чтобы получить ваш комментарий.

Однако все эти комментарии не являются однострочным комментарием.

Вы предоставили текстовое поле для написания комментария.

В конце концов, кто-то напишет длинный комментарий с разрывами строк, и ваш PHP-скрипт, читающий комментарий, разобьет его.

В конечном итоге вы отобразите только первую строку комментария, а остальная часть комментария исчезнет.

Вам следует заменить символ '\n' в комментарии чем-то другим.

Например, это будет работать:

$comment = Strip_tags($_POST['comment']);

$comment= str_replace( "\n", '\n', $comment);

«\n» — это разрыв строки, а «\n» — нет (для PHP).

Обратите внимание на разницу между знаками «» и «».

При отображении сделайте обратное:

$line_of_text = str_replace( '\n', "\n", $line_of_text );

$line_of_text = nl2br($line_of_text);

Это позволит правильно отобразить комментарий.

2. Вы не используете функцию обрезки() для удаления лишних разрывов строк из поля комментариев.

$comment = Strip_tags($_POST['comment']);

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

Использовать:

$comment = Trim(strip_tags($_POST['comment']));

3. Я думаю, что если ваш веб-сайт большой или может вырасти в будущем, то чтение огромного файла комментариев займет время и замедлит работу вашего сайта.

Поэтому вместо того, чтобы записывать все комментарии в один файл, создайте папку, создайте в ней отдельные файлы для каждого идентификатора, используя идентификатор, например (1234.txt, 444.txt и т. д.), и записывайте свои комментарии в эти файлы.

Затем при отображении комментария вы можете просто открыть файл для этого конкретного идентификатора статьи и прочитать комментарии построчно.

Это будет очень быстро.

Вероятно, вы не получите более 50–100 комментариев на статью, а прочитать такое количество строк можно довольно быстро.

4. Использовать Strip_tags можно.

Но это скроет только тег HTML, например Это нормально, текст ';

//эхо Strip_tags($s);

// напечатаем - alert(" "); Это нормально, текст

//Вместо этого используйте код preg_replace:

$pattern= '/\<(.?)\>(.?)\<(.*?)\>/is'; $replace= ''; echo preg_replace ($pattern, $replace, $s); // напечатаем текст «Это нормально» ?>

Тот, кто хочет сделать дрянные вещи, поместит много дерьмового текста между тегами , например, URL-адрес порносайта и т. д., например window.location="какой-то URL-адрес здесь";

который вы не хотите отображать.

Когда вы используете этот код preg_replace, вы в конечном итоге удалите все эти дрянные вещи, которые они помещают в теги html.

Удачи!
 

Naitan


Рег
23 Oct, 2014

Тем
1

Постов
3

Баллов
13
Тем
49554
Комментарии
57426
Опыт
552966

Интересно