Alex_vcorp писал(а):Мало информации, лучше сделать простую тестовую веб-страницу, которая иллюстрирует проблему, и привести её код здесь.
Вот сделал тестовую страницу, итак, начальные данные:
Тестовая страница с двумя картинками по адресу
http://wellsit.ru/index.html1. Создаем проект
2. В каталоге проекта создаем файлик local.html и закидываем туда такое:
- Код: Выделить всё
<HTML>
<body>
<center>
<img src="http://wellsit.ru/images/1.jpg"><br /><br />
<img src="http://wellsit.ru/img/2.jpg">
</center>
</body>
</HTML>
3. Кидаем на форму компонент хрома и три кнопки Button1 - Открыть сайт, Button2 - Открыть локальную страницу, Button3 - Загрузить изображение
для Button1 пишем:
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
Chromium1.Load('http://wellsit.ru/index.html');
end;
Для Button2 пишем:
- Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
begin
Chromium1.Load('file:///local.html');
end;
Для Button3 пишем:
- Код: Выделить всё
procedure TForm1.Button3Click(Sender: TObject);
var
HTTP:THTTPSend;
begin
HTTP:=THTTPSend.Create;
if HTTP.HTTPMethod('GET','http://wellsit.ru/images/1.jpg') then begin
showmessage(IntToStr(HTTP.ResultCode));
HTTP.Document.SaveToFile('1.jpg');
end;
HTTP.Clear;
if HTTP.HTTPMethod('GET','http://wellsit.ru/img/2.jpg') then begin
showmessage(IntToStr(HTTP.ResultCode));
HTTP.Document.SaveToFile('2.jpg')
end;
HTTP.Free;
end;
На сервере (ngin+php-fpm):
- Код: Выделить всё
location ^~ /img/ {
valid_referers server_names ~(wellsit|yandex|google); //для примера разрешен доступ в этот каталог только этим реферерам
if ($invalid_referer){
return 403;
}
}
Тестируем:
Запускаем софтину жмем "Открыть сайт" - видим две картинки. Если нажать на "Открыть локальную страницу" то тоже будет 2 картинки - ибо они в кэше, лениво бло возится с очисткой, поэтому закрываем софтину - открываем заново, жмем "Открыть локальную страницу" - видим одну картинку, ко второй доступа нет.
Пробуем загрузить картинки - жмем "Загрузить изображения" в первом случае получаем код 200 - все нормально, вторая картинка возвращает 403 - доступ запрещен.
Вот примерно такое происходит на некторых сайтах - то есть запрещают хотлинки. В моем случае это можно обойти, подделав рефера. А есть еще способы обхода? Ведь можно запретить доступ к картинкам и так:
- Код: Выделить всё
locale ^ ~ /img/ {
allow IP_адрес_сервера;
deny all;
}
Есть мысли?
Весь код тестового проекта:
- Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, cef3lcl, Forms, Controls, Graphics, Dialogs,
StdCtrls, httpsend;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Chromium1: TChromium;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
Chromium1.Load('http://wellsit.ru/index.html');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Chromium1.Load('file:///local.html');
end;
procedure TForm1.Button3Click(Sender: TObject);
var
HTTP:THTTPSend;
begin
HTTP:=THTTPSend.Create;
if HTTP.HTTPMethod('GET','http://wellsit.ru/images/1.jpg') then begin
showmessage(IntToStr(HTTP.ResultCode));
HTTP.Document.SaveToFile('1.jpg');
end;
HTTP.Clear;
if HTTP.HTTPMethod('GET','http://wellsit.ru/img/2.jpg') then begin
showmessage(IntToStr(HTTP.ResultCode));
HTTP.Document.SaveToFile('2.jpg')
end;
end;
end.