Недавно мы разработали собственную тему для нашего веб-сайта Wordpress,
и я использовал собственную систему комментариев Wordpress, код которой выглядит примерно так, как показано ниже.
вопрос в том, как мы можем защитить форму комментариев от атаки xss? кажется, что такие скрипты, как <script>alert('hi');</script>
, запускаются просто в форме комментариев.
Есть идеи?
Спасибо.
<section>
<main>
<div class = "comment-area">
<h2 class = "comment-title -pb-20">
number of comments: <span><?php echo get_comments_number(); ?></span>
</h2>
<div class = "comment-form">
<h3>Insert you comment here please.</h3>
<?php
$arg = array(
'title_reply' => '',
'comment_notes_before' => '',
'label_submit' => 'submmit',
);
comment_form($arg);
?>
</div>
<?php if (have_comments()) : ?>
<div class = "comment-list">
<h1>all comments</h1>
<ul>
<?php
$args = array(
'style' => 'ul',
'callback' => null,
'end-callback' => null,
'type' => 'comment',
'reply_text' => 'reply',
'page' => '',
'per_page' => '',
'avatar_size' => 32,
'reverse_top_level' => true,
'reverse_children' => '',
'format' => 'html5',
'echo' => true,
);
wp_list_comments($args);
?>
</ul>
</div>
<div class = "comments-pagination">
<?php if (get_comment_pages_count() > 1 && get_option('page_comments')) : ?>
<div>
<?php previous_comments_link('prev'); ?>
</div>
<div>
<?php next_comments_link('next'); ?>
</div>
<?php endif; ?>
</div><!-- .comments-pagination -->
<?php endif; ?>
</div>
</main>
</section>
Я понятия не имею, как это сделать!
Спасибо за ваш ответ. но я думаю, что этот метод является защитой на стороне клиента. как насчет серверной части? есть ли способ сделать это с помощью PHP-кода?
Ах да, конечно, это намного лучше и на самом деле безопасно (защита на стороне клиента дает ложное чувство безопасности), так что вы можете просто делать то, что вы делаете на стороне клиента при проверке данных, но вместо этого делать это на стороне сервера прямо перед тем, как решить, хотите ли вы хотите обработать данные. Например, если у вас могут быть регулярные выражения в PHP, то не сопоставляйте никакие распознанные теги — или только теги <script>
, если хотите. Обновлено: см. решение здесь: stackoverflow.com/questions/7891771/… и посмотрите, будет ли оно полезным.
Да, ты прав. но вы знаете, не похоже, что система комментариев по умолчанию в WordPress дает мне какой-либо HTML-тег, чтобы я мог его проверить, очистить. вот почему я задал этот вопрос. Кстати, большое спасибо за вашу помощь и время, братан.
Вы отправляете свой ввод на сервер или что-то еще, прежде чем разрешать публичное отображение опубликованных комментариев? Я говорю, что вы должны очистить его там и решить прямо там (на стороне сервера), следует ли его публиковать или нет.
хм, может быть, в Wordpress есть фильтр, я должен найти его. спасибо за подсказку
add_filter( 'comment_text', 'sanitize_comment' );
function sanitize_comment( $comment_text ) {
$comment_text = sanitize_text_field($comment_text);
return $comment_text;
}
Разве вы не можете упростить процесс и просто использовать тег
<input>
, подключающий событиеchange
для фильтрации<script>
или всех теговhtml
?