Загрузка изображений TChromium

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

Загрузка изображений TChromium

Сообщение arriah » 11.07.2016 23:43:27

Столкнулся с такой проблемой, не знаю можно ли решить ее локально.

TChromium отображает страничку, в которой есть ссылка на изображение с другого сайта... Так вот эта картинка не отображается.
Я так понимаю, что скорее всего в настройках вэбсервера удаленного сайта стоит запрет на прямую закачку файлов.. это можно как-то обойти?

Вот пример странички (не реклама) http://psyfactor.org/lib/uspeh52.htm - если ее отобразить в TChromium ТО картинка не показывается.
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Загрузка изображений TChromium

Сообщение Alex_vcorp » 12.07.2016 02:53:41

У меня проблем нет, любые сетевые картинки видно из локального HTML-файла.
Натсройка Option.ImageLoading должна быть STATE_DEFAULT или STATE_ENABLED

В любом случае все файлы, на которые ссылается веб-страница, закачиваются отдельными http-запросами из браузера.
Сервер может контролировать выдачу картинок, если они запрашиваются не напрямую, а с параметрами, где присутствует хеш сессии или куки своего сайта, то-есть как правило через серверный скрипт.

Не исключена проблема с синтаксической ошибкой в HTML-файле или где там ещё (мало информации).
Можно открыть страничку в обычном браузере и посмотреть консоль ошибок для уверенности, что нет ошибок на странице.
Можно отправить локальную страницу на валидацию https://validator.w3.org/

Сайт может запретить себя показывать во фреймах (iframe например).

Мало информации, лучше сделать простую тестовую веб-страницу, которая иллюстрирует проблему, и привести её код здесь.
Alex_vcorp
незнакомец
 
Сообщения: 5
Зарегистрирован: 06.07.2016 13:09:21

Re: Загрузка изображений TChromium

Сообщение arriah » 12.07.2016 15:41:56

Alex_vcorp писал(а):Мало информации, лучше сделать простую тестовую веб-страницу, которая иллюстрирует проблему, и привести её код здесь.


Вот сделал тестовую страницу, итак, начальные данные:

Тестовая страница с двумя картинками по адресу http://wellsit.ru/index.html

1. Создаем проект
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.             
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Загрузка изображений TChromium

Сообщение Alex_vcorp » 12.07.2016 16:56:39

arriah писал(а):Вот примерно такое происходит на некторых сайтах - то есть запрещают хотлинки. В моем случае это можно обойти, подделав рефера. А есть еще способы обхода?

Универсального способа нет. Чтобы сервер что-то отдал, нужно выполнить его условия, отправив корректный с точки зрения сервера запрос.
Например, у меня есть свои секреты защиты, алгоритм периодически меняется, могу отключать и включать при необходимости.
Даже если существует автоматичнское распознавание капчи, запрос на сервер с отправкой сообщения ничего не даст, потому что есть скрытые хеши и параметры, которые работают на странице.
Свои секреты рассказывать разумеется не буду, я-бы не хотел, чтобы мои страницы были объектом сканирования и сомнительных действий, проще написать мне и попросить что-то сделать.
Alex_vcorp
незнакомец
 
Сообщения: 5
Зарегистрирован: 06.07.2016 13:09:21

Re: Загрузка изображений TChromium

Сообщение arriah » 12.07.2016 16:56:53

Немного порывшись в синапсе, обнаружил, если код ля загрузки изображений пописать так:

Код: Выделить всё
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;
  HTTP.Headers.Insert(0,'Referer: http://wellsit.ru'); //Подмена реферера
  if HTTP.HTTPMethod('GET','http://wellsit.ru/img/2.jpg') then begin
    showmessage(IntToStr(HTTP.ResultCode));
    HTTP.Document.SaveToFile('2.jpg')
   end;
end;       

Тогда изображения грузятся, при этом в логах на сервере:

Код: Выделить всё
[12/Jul/2016:15:53:48 +0300] "GET /images/1.jpg HTTP/1.0" 200 115727 "-" "Mozilla/4.0 (compatible; Synapse)"
[12/Jul/2016:15:53:58 +0300] "GET /img/2.jpg HTTP/1.0" 200 40410 "http://wellsit.ru" "Mozilla/4.0 (compatible; Synapse)"


А как подменить реферер в TChromium?

Добавлено спустя 35 минут 34 секунды:
Alex_vcorp писал(а):Свои секреты рассказывать разумеется не буду, я-бы не хотел, чтобы мои страницы были объектом сканирования и сомнительных действий, проще написать мне и попросить что-то сделать.

Наивный :)
Конечно, написать и попросить сделать что-то - это самый правильный выход. Но кто это будет делать? Тем более что это надо разово.
И если я сейчас могу подменить реферера что бы автоматом получить файл, зачем я буду писать админу сайта? Ведь файл доступен для скачивания если находишься на его сайте.. а то что бразуер в запросах может подменять реферера, так это вина не админа :) Поэтому я с правовой точки зрения ничего не нарушу. никаких деструтивных и сомнительных действий не несу... мне нужен файл. и я его получаю :)
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35


Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Рейтинг@Mail.ru