]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
doc: update http.user_agent keyword
authorjason taylor <jtfas90@gmail.com>
Fri, 5 Jan 2024 22:06:47 +0000 (22:06 +0000)
committerVictor Julien <victor@inliniac.net>
Wed, 10 Apr 2024 05:03:07 +0000 (07:03 +0200)
Ticket: 3025

Signed-off-by: jason taylor <jtfas90@gmail.com>
doc/userguide/rules/http-keywords.rst

index 733ef7f6f1bf9df6ae598d8d604b5797b9fb07b6..58ba1f6ec323f8269b680a036d7d084de46a2cf6 100644 (file)
@@ -396,59 +396,50 @@ Example HTTP Request::
 http.user_agent
 ---------------
 
-The ``http.user_agent`` sticky buffer is part of the HTTP request
-header. It makes it possible to match specifically on the value of the
-User-Agent header. It is normalized in the sense that it does not
-include the _"User-Agent: "_ header name and separator, nor does it
-contain the trailing carriage return and line feed (CRLF). The keyword
-can be used in combination with all previously mentioned content
-modifiers like ``depth``, ``distance``, ``offset``, ``nocase`` and
-``within``. Note that the ``pcre`` keyword can also inspect this
-buffer when using the ``/V`` modifier.
-
-Normalization: leading spaces **are not** part of this buffer. So
-"User-Agent: \r\n" will result in an empty ``http.user_agent`` buffer.
+The ``http.user_agent`` keyword is used to match on the User-Agent field that
+can be present in HTTP request headers.
 
-Example of the User-Agent header in a HTTP request:
+It is possible to use any of the :doc:`payload-keywords` with the
+``http.user_agent`` keyword.
 
+Example HTTP Request::
 
-Example of the purpose of ``http.user_agent``:
+  GET /index.html HTTP/1.1
+  User-Agent: Mozilla/5.0
+  Cookie: PHPSESSION=123
+  Host: suricata.io
 
+.. container:: example-rule
 
-Notes
-~~~~~
+  alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP User-Agent Example"; \
+  flow:established,to_server; :example-rule-options:`http.user_agent; \
+  content:"Mozilla/5.0";` bsize:11; classtype:bad-unknown; sid:90; rev:1;)
 
--  The ``http.user_agent`` buffer will NOT include the header name,
-   colon, or leading whitespace.  i.e. it will not include
-   "User-Agent: ".
+.. note:: The ``http.user_agent`` buffer does not include the header name (User-Agent),
+   colon, leading whitespace, or ending CRLF.
 
--  The ``http.user_agent`` buffer does not include a CRLF (0x0D
-   0x0A) at the end.  If you want to match the end of the buffer, use a
-   relative ``isdataat`` or a PCRE (although PCRE will be worse on
-   performance).
+.. note:: Using the ``http.user_agent`` generally provides better performance
+   than using :ref:`http.header`.
 
- If a request contains multiple "User-Agent" headers, the values will
+.. note:: If a request contains multiple "User-Agent" headers, the values will
    be concatenated in the ``http.user_agent`` buffer, in the order
    seen from top to bottom, with a comma and space (", ") between each
    of them.
 
-   Example request::
-
-          GET /test.html HTTP/1.1
-          User-Agent: SuriTester/0.8
-          User-Agent: GGGG
-
-   ``http.user_agent`` buffer contents::
-
-          SuriTester/0.8, GGGG
+Example Duplicate User-Agent Header Request::
 
--  Corresponding PCRE modifier: ``V``
+  GET /index.html HTTP/1.1
+  User-Agent: Mozilla/5.0
+  User-Agent: Chrome/2.0
+  Cookie: PHPSESSION=123
+  Host: suricata.io
 
--  Using the ``http.user_agent`` buffer is more efficient when it
-   comes to performance than using the ``http.header`` buffer (~10%
-   better).
+.. container:: example-rule
 
--  `https://blog.inliniac.net/2012/07/09/suricata-http\_user\_agent-vs-http\_header/ <https://blog.inliniac.net/2012/07/09/suricata-http_user_agent-vs-http_header/>`_
+  alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP User-Agent Example"; \
+  flow:established,to_server; :example-rule-options:`http.user_agent; \
+  content:"Mozilla/5.0, Chrome/2.0";` bsize:23; classtype:bad-unknown; sid:90; \
+  rev:1;)
 
 .. _http.accept: