In my problem there is an existing system that works as a alerting or clipping service that runs user defined searches and generates results lists. These are setup by authenticated users and this internal system uses a GUID as the identifier to fetch the results, which are stored in a database.
There is a requirement to expose these results via RSS. However, other than embedding username:password@
in the URL, I am not aware of any technique that works across RSS readers. The naive idea is to make the URLs something like /alert/{guid}/rss
which has a few problems. Since GUIDs are intended for uniqueness and not randomness, I am worried about guessing attacks since every guess attempt would proxy the request from the web facing system to the internal system, and access the database. I am looking for a way to both add some uniqueness to the URL and prevent unneeded database access, while preserving the GUID based key.
My ideas is to expand the /feed/{guid}/rss
URL to something like /feed/v1/{hash}/{guid}/rss
which contains an additional hash segment. This segment would be generated by combining the existing guid and an application provided secret via concatenation or XORing or something? This would be the URL that would be provided to RSS readers from inside the application. Then, when a URL comes into the system, the hash segment can be recomputed in memory, compared, and rejected without a trip to the internal service and database. The leading /feed/
segment of the URL is unique in the system to enable future URL routing/load balancing to feed cache. The /v1/
segment is in place if the secret has to change for future feed URLs.
Since I don't want to be another proof for "Schneier's Law", what are the problems with this pattern? I think it helps with the denial-of-service for brute force attacks (but not if at least one valid URL is known). I also think it creates "random" URLs for the sensitivity of the data. I am open to criticism or other ideas, but I am stuck with the GUID based keys.