Рубрики
Uncategorized

Зная небольшую яму кота в простом запросе на получение

Автор оригинала: David Wong.

I. Предисловие

Получив запрос, я быстро закончил его, а затем провел местный тест и обнаружил, что:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

Поскольку данные параметра в запросе get-это имя пользователя, выполняющего запрос, они являются китайскими. В данной статье анализируется проблема.

II. Процесс анализа

В то время я сразу же проконсультировался с учителем Baidu, потому что Tomcat обновился в версии, следовал спецификации RFC для URL и не выпускал специальных символов. Есть два способа решить эту проблему:

1. Решите проблему с кодированием. 2. Понижаю рейтинг Tomcat.

Используя почтальона для переноса китайских параметров, вы можете получить обычный доступ к данным, с которыми раньше не сталкивались. Таким образом, java-сервер в порядке, и служба использует spring boot 1.5.3, а соответствующая версия Tomcat-8.5.14. Мы планируем начать с кодирования, не рассматривая развертывание пакета war.

На самом деле проблема довольно проста. Но из-за рамок дизайна услуг мы пошли по неправильному пути… Я хочу записать процесс анализа.

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

[18/Jun/2019:19:51:18 +0800] 0:0:0:0:0:0:0:1 "GET null null" 400 (0 ms)

Запросы были отфильтрованы до того, как они поступили.

Я закодировал параметры в JS

window.location.href='?p=ware&d=ware-register-query&agentName='+encodeURI($(".agent").val());

Параметры закодированы здесь и признаны бесполезными. Это трудно понять.

На самом деле, поскольку мы являемся архитектурой HTML + PHP + java, запрос отправляется в фон Java после обработки PHP. Параметры, закодированные в JS, будут автоматически декодированы, когда они будут отправлены на PHP для обработки:

Var_dump (check_trade_query. '? Agentname ='. $_get ['agentname ']); // print the spliced URL
$req = new httpRequest('get',check_merchant_query.'?agentName='.$_GET['agentName'],null,function($result){return $result;});

Результат, напечатанный здесь, был расшифрован. В то время я этого не заметил, но мне показалось, что URL-адрес был правильным, поэтому на это ушло много времени. Я думаю, что параметр get HTTP-запроса, созданный в PHP, был закодирован, поэтому в следующий раз я расскажу, как настроить Tomcat для выпуска специальных символов.

Если это обычный HTML + Java, приведенное выше кодирование в порядке, но я забыл пройти обработку PHP при анализе.

Наконец, мы можем закодировать параметры на PHP.

$req = new httpRequest('get',check_merchant_query.'?agentName='.urlencode($_GET['agentName']),null,function($result){return $result;});

Почему почтальон может получить доступ к Tomcat напрямую, введя китайские параметры? Потому что почтальон-это как браузер. При отправке запроса параметры были закодированы.