<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://db.gcve.eu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Thu, 29 Oct 2026 11:35:01 +0000</lastBuildDate>
    <item>
      <title>GHSA-3cmx-xjww-583x — i18next-http-backend: Query-parameter injection through &amp; and = in lng when loadPath/addPath puts {{lng}} in the query…</title>
      <link>https://db.gcve.eu/vuln/ghsa-3cmx-xjww-583x</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: i18next-http-backend&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;The URL-segment check added for GHSA-q89c-q3h5-w34g blocks `?`, `#`, `%`, `:`, `/` and `@` in `lng`, but not `&amp;amp;` or `=`, and the checked value is inserted into the URL without encoding. The README documents a multiload loadPath of the form `/locales/resources.json?lng=de+en&amp;amp;ns=ns1+ns2`. With a template like that, an attacker who controls the language value can add or override query parameters on the request the backend sends. By default the language comes from `?lng=`, a cookie or `Accept-Language`. This is the &amp;#34;query-string injection&amp;#34; impact described in GHSA-q89c; only the `?` form was closed.&lt;/p&gt;
&lt;p&gt;Server side (Express + i18next-http-middleware, default options), `GET /?lng=de%26ns%3Dprivate%26admin%3Dtrue` makes the application request `…?lng=de&amp;amp;ns=private&amp;amp;admin=true&amp;amp;ns=common` from its own translations API.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The checks are in `lib/utils.js`. The base check (https://github.com/i18next/i18next-http-backend/blob/v4.0.3/lib/utils.js#L26-L44) rejects:&lt;/p&gt;
&lt;p&gt;- empty or &amp;gt;128-character values and prototype keys;
- `..` and `\`;
- `/[?#%:\s]/`;
- control characters.&lt;/p&gt;
&lt;p&gt;`isSafeLangUrlSegment` (https://github.com/i18next/i18next-http-backend/blob/v4.0.3/lib/utils.js#L51-L55) adds only `/` and `@`. **Neither function rejects `&amp;amp;` or `=`.**&lt;/p&gt;
&lt;p&gt;```js
if (/[?#%:\s]/.test(v)) return false   // utils.js L40, no &amp;amp; or =
```&lt;/p&gt;
&lt;p&gt;`interpolateUrl` then splits on `+`, checks each segment, and joins the **raw** segments into the template, with no encoding (https://github.com/i18next/i1…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: i18next-http-backend&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;The URL-segment check added for GHSA-q89c-q3h5-w34g blocks `?`, `#`, `%`, `:`, `/` and `@` in `lng`, but not `&amp;amp;` or `=`, and the checked value is inserted into the URL without encoding. The README documents a multiload loadPath of the form `/locales/resources.json?lng=de+en&amp;amp;ns=ns1+ns2`. With a template like that, an attacker who controls the language value can add or override query parameters on the request the backend sends. By default the language comes from `?lng=`, a cookie or `Accept-Language`. This is the &amp;#34;query-string injection&amp;#34; impact described in GHSA-q89c; only the `?` form was closed.&lt;/p&gt;
&lt;p&gt;Server side (Express + i18next-http-middleware, default options), `GET /?lng=de%26ns%3Dprivate%26admin%3Dtrue` makes the application request `…?lng=de&amp;amp;ns=private&amp;amp;admin=true&amp;amp;ns=common` from its own translations API.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The checks are in `lib/utils.js`. The base check (https://github.com/i18next/i18next-http-backend/blob/v4.0.3/lib/utils.js#L26-L44) rejects:&lt;/p&gt;
&lt;p&gt;- empty or &amp;gt;128-character values and prototype keys;
- `..` and `\`;
- `/[?#%:\s]/`;
- control characters.&lt;/p&gt;
&lt;p&gt;`isSafeLangUrlSegment` (https://github.com/i18next/i18next-http-backend/blob/v4.0.3/lib/utils.js#L51-L55) adds only `/` and `@`. **Neither function rejects `&amp;amp;` or `=`.**&lt;/p&gt;
&lt;p&gt;```js
if (/[?#%:\s]/.test(v)) return false   // utils.js L40, no &amp;amp; or =
```&lt;/p&gt;
&lt;p&gt;`interpolateUrl` then splits on `+`, checks each segment, and joins the **raw** segments into the template, with no encoding (https://github.com/i18next/i1…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-3cmx-xjww-583x</guid>
    </item>
  </channel>
</rss>
