У меня в основном есть форма поиска с вводом:
<input type="text" name="search" />
Это в конечном итоге отправляет пользователя на:
/search/[URL_ENCODED_STRING]
Так что, если они искали
http://www.stackoverflow.com/
URL будет:
/search/http%253A%252F%252Fwww.stackoverflow.com%252F
Моя проблема состоит в том, чтобы знать, безопасен ли ввод, который я затем прочитал позже. Затем я бы на странице поиска использовал присущие Drupal способы чтения значения (arg (1)). Но даже без друпала результат был бы таким же. Я бы закончил с:
$variable = urldecode($input);
Если я распечатаю переменную $, она покажет:
http://www.stackoverflow.com/
Мой вопрос заключается в том, какую очистку я должен применить к этой строке, прежде чем использовать ее в SQL? Это просто «аддлэш»? Или я должен удалить все не буквенно-цифровые и числовые значения?
НОТА
Я еще не дошел до этой части, но я вполне уверен, что Drupal будет применять свою собственную дезинфекцию, если я передам эту переменную во встроенную функцию поиска, но я все еще хотел бы знать, как правильно дезинфицировать эту ввод, чтобы злоумышленники не делали странные вещи на сайте.
ОБНОВИТЬ
Я добрался до части, и Drupal действительно заботится о подготовленной части заявления. Но я до сих пор не знаю, как бы очистить строку при ее печати здесь:
<div id="searchedFor">
<span class="preLabel">You searched for</span>
<h2><?php print $_REQUEST['search']; ?></h2>
</div>
Как правильно распечатать это?
Чтобы продезинфицировать страницу, используйте htmlentities()
или же strip_tags()
или же htmlspecialchars()
:
<div id="searchedFor">
<span class="preLabel">You searched for</span>
<h2><?php echo htmlentities($_REQUEST['search'], ENT_QUOTES); ?></h2>
</div>
Пример:
<?php echo htmlentities("<script>NastyJS('code');</script>", ENT_QUOTES); ?>
<!-- Shows in browser this way -->
<script>NastyJS('code');</script>
<!-- but shows in source this way -->
<script>NastyJS('code');</script>
Других решений пока нет …