parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Экранирование посторонних символов строки

G_Z 13.11.2017 19:09

Ряд кривых сайтов может генерировать значения cookie (а возможно и любых заголовков) с недопустимыми символами, например:
>curl --head …
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Mon, 13 Nov 2017 15:55:51 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.9-1ubuntu4.21
Set-Cookie: PHPSESSID=gus7n49djcd5odv906lijjcq10; path=/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: _csrf=05d0d9e4690ba910cd25dd15cf9b898e8d20c7b828b31e89e82b4cec641a8a26a%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%22%E8w%F8%B7y%D50u%91%82%7D%1E%16%BFR%F3%AFK%AC%8D%A2%15z%82%BE%FC%E9+%B3R%B5%B0%22%3B%7D; path=/; httponly
В Парсере получаем это в декодированном виде:
^curl:session{
	$response[^curl:load[
		$.url[]
		$.ssl_verifypeer(false)
	]]

	^if(^response.cookies.locate[name;_csrf]){
		$response.cookies.value
	}
}
6526353df8a43d92e842e33526a5217fa09c652c687d6c7f9e651aef97bd7caea:2:{i:0;s:5:"_csrf";i:1;s:32:"Og�(wHf��m�.�z�!.��.�ek��å�e��+";}
Если такое пытаться обрабатывать или, скажем, положить в БД в виде JSON — легко получить ошибки обработки строки или экранирования:
Invalid JSON text: "Invalid escape character in string." at position 1775 in value for column 'storage.data'.

Хотелось бы процентно закодировать невалидные символы, а как это сделать не совсем ясно.
В данном случае по RFC6265 допустимы:
cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
; US-ASCII characters excluding CTLs,
; whitespace DQUOTE, comma, semicolon,
; and backslash
Js-escape закодирует всё non-ASCII, что избыточно.
Match не работает — UTF-8 validation failed during pcre_exec (-10).

Нет ли у общественности идей?

  • Экранирование посторонних символов строки, G_Z [M] 13.11.2017 19:09