Столкнулся с такой проблемой, не знаю можно ли решить ее локально.
TChromium отображает страничку, в которой есть ссылка на изображение с другого сайта... Так вот эта картинка не отображается.
Я так понимаю, что скорее всего в настройках вэбсервера удаленного сайта стоит запрет на прямую закачку файлов.. это можно как-то обойти?
Вот пример странички (не реклама) http://psyfactor.org/lib/uspeh52.htm - если ее отобразить в TChromium ТО картинка не показывается.
Загрузка изображений TChromium
Модератор: Модераторы
-
Alex_vcorp
- незнакомец
- Сообщения: 5
- Зарегистрирован: 06.07.2016 12:09:21
У меня проблем нет, любые сетевые картинки видно из локального HTML-файла.
Натсройка Option.ImageLoading должна быть STATE_DEFAULT или STATE_ENABLED
В любом случае все файлы, на которые ссылается веб-страница, закачиваются отдельными http-запросами из браузера.
Сервер может контролировать выдачу картинок, если они запрашиваются не напрямую, а с параметрами, где присутствует хеш сессии или куки своего сайта, то-есть как правило через серверный скрипт.
Не исключена проблема с синтаксической ошибкой в HTML-файле или где там ещё (мало информации).
Можно открыть страничку в обычном браузере и посмотреть консоль ошибок для уверенности, что нет ошибок на странице.
Можно отправить локальную страницу на валидацию https://validator.w3.org/
Сайт может запретить себя показывать во фреймах (iframe например).
Мало информации, лучше сделать простую тестовую веб-страницу, которая иллюстрирует проблему, и привести её код здесь.
Натсройка Option.ImageLoading должна быть STATE_DEFAULT или STATE_ENABLED
В любом случае все файлы, на которые ссылается веб-страница, закачиваются отдельными http-запросами из браузера.
Сервер может контролировать выдачу картинок, если они запрашиваются не напрямую, а с параметрами, где присутствует хеш сессии или куки своего сайта, то-есть как правило через серверный скрипт.
Не исключена проблема с синтаксической ошибкой в HTML-файле или где там ещё (мало информации).
Можно открыть страничку в обычном браузере и посмотреть консоль ошибок для уверенности, что нет ошибок на странице.
Можно отправить локальную страницу на валидацию https://validator.w3.org/
Сайт может запретить себя показывать во фреймах (iframe например).
Мало информации, лучше сделать простую тестовую веб-страницу, которая иллюстрирует проблему, и привести её код здесь.
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.
-
Alex_vcorp
- незнакомец
- Сообщения: 5
- Зарегистрирован: 06.07.2016 12:09:21
arriah писал(а):Вот примерно такое происходит на некторых сайтах - то есть запрещают хотлинки. В моем случае это можно обойти, подделав рефера. А есть еще способы обхода?
Универсального способа нет. Чтобы сервер что-то отдал, нужно выполнить его условия, отправив корректный с точки зрения сервера запрос.
Например, у меня есть свои секреты защиты, алгоритм периодически меняется, могу отключать и включать при необходимости.
Даже если существует автоматичнское распознавание капчи, запрос на сервер с отправкой сообщения ничего не даст, потому что есть скрытые хеши и параметры, которые работают на странице.
Свои секреты рассказывать разумеется не буду, я-бы не хотел, чтобы мои страницы были объектом сканирования и сомнительных действий, проще написать мне и попросить что-то сделать.
Немного порывшись в синапсе, обнаружил, если код ля загрузки изображений пописать так:
Тогда изображения грузятся, при этом в логах на сервере:
А как подменить реферер в TChromium?
Добавлено спустя 35 минут 34 секунды:
Наивный
Конечно, написать и попросить сделать что-то - это самый правильный выход. Но кто это будет делать? Тем более что это надо разово.
И если я сейчас могу подменить реферера что бы автоматом получить файл, зачем я буду писать админу сайта? Ведь файл доступен для скачивания если находишься на его сайте.. а то что бразуер в запросах может подменять реферера, так это вина не админа
Поэтому я с правовой точки зрения ничего не нарушу. никаких деструтивных и сомнительных действий не несу... мне нужен файл. и я его получаю 
Код: Выделить всё
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 писал(а):Свои секреты рассказывать разумеется не буду, я-бы не хотел, чтобы мои страницы были объектом сканирования и сомнительных действий, проще написать мне и попросить что-то сделать.
Наивный
Конечно, написать и попросить сделать что-то - это самый правильный выход. Но кто это будет делать? Тем более что это надо разово.
И если я сейчас могу подменить реферера что бы автоматом получить файл, зачем я буду писать админу сайта? Ведь файл доступен для скачивания если находишься на его сайте.. а то что бразуер в запросах может подменять реферера, так это вина не админа
