Ihr Worst-Case-Szenario ist nicht so schlimm, wie Sie denken.
Sie analysieren bereits den RSS-Feed, sodass Sie bereits über die Bild-URLs verfügen. Angenommen, Sie haben eine Bild-URL wie http://otherdomain.com/someimage.jpg
. Sie schreiben diese URL um alshttps://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. Auf diese Weise stellt der Browser immer eine Anfrage über https, sodass Sie die Probleme beseitigen können.
Der nächste Teil - Erstellen Sie eine Proxyseite oder ein Servlet, das Folgendes ausführt:
- Lesen Sie den URL-Parameter aus der Abfragezeichenfolge und überprüfen Sie den Hash
- Laden Sie das Bild vom Server herunter und übertragen Sie es zurück in den Browser
- Optional können Sie das Image auf der Festplatte zwischenspeichern
Diese Lösung hat einige Vorteile. Sie müssen das Bild zum Zeitpunkt der Erstellung des HTML-Codes nicht herunterladen. Sie müssen die Bilder nicht lokal speichern. Außerdem bist du staatenlos; Die URL enthält alle Informationen, die zur Bereitstellung des Bildes erforderlich sind.
Schließlich dient der Hash-Parameter der Sicherheit. Sie möchten nur, dass Ihr Servlet Bilder für von Ihnen erstellte URLs bereitstellt. Wenn Sie also die URL erstellen, berechnen Siemd5(image_url + secret_key)
und hängen Sie sie als Hash-Parameter an. Bevor Sie die Anfrage bearbeiten, berechnen Sie den Hash neu und vergleichen Sie ihn mit dem, was an Sie übergeben wurde. Da der secret_key nur Ihnen bekannt ist, kann niemand sonst gültige URLs erstellen.
Wenn Sie in Java entwickeln, besteht das Servlet nur aus wenigen Codezeilen. Sie sollten in der Lage sein, den folgenden Code auf jede andere Back-End-Technologie zu portieren.
/*
targetURL is the url you get from RSS feeds
request and response are wrt to the browser
Assumes you have commons-io in your classpath
*/
protected void proxyResponse (String targetURL, HttpServletRequest request,
HttpServletResponse response) throws IOException {
GetMethod get = new GetMethod(targetURL);
get.setFollowRedirects(true);
/*
* Proxy the request headers from the browser to the target server
*/
Enumeration headers = request.getHeaderNames();
while(headers!=null && headers.hasMoreElements())
{
String headerName = (String)headers.nextElement();
String headerValue = request.getHeader(headerName);
if(headerValue != null)
{
get.addRequestHeader(headerName, headerValue);
}
}
/*Make a request to the target server*/
m_httpClient.executeMethod(get);
/*
* Set the status code
*/
response.setStatus(get.getStatusCode());
/*
* proxy the response headers to the browser
*/
Header responseHeaders[] = get.getResponseHeaders();
for(int i=0; i<responseHeaders.length; i++)
{
String headerName = responseHeaders[i].getName();
String headerValue = responseHeaders[i].getValue();
if(headerValue != null)
{
response.addHeader(headerName, headerValue);
}
}
/*
* Proxy the response body to the browser
*/
InputStream in = get.getResponseBodyAsStream();
OutputStream out = response.getOutputStream();
/*
* If the server sends a 204 not-modified response, the InputStream will be null.
*/
if (in !=null) {
IOUtils.copy(in, out);
}
}