2014-01-12 2 views
2

У меня есть страница PHP, которая имеет механизм аутентификации. Только после успешного входа в систему я хочу показать страницу PHP, которая находится на другом сервере. Я мог бы сделать это с помощью iframe, но я, конечно, хочу сказать, что кто-то может просто получить значение атрибута src в iframe и перейти на страницу напрямую - отсюда в обход механизмов безопасности.Безопасность Концерн с PHP загрузка iframe

Что было бы лучшим способом реализовать это? Как я могу заблокировать страницу в iframe от доступа напрямую, минуя начальный логин?

+2

Если у внешнего сайта нет безопасности, то нет смысла –

+0

У внешнего сайта есть/может быть безопасность - вопрос заключается в том, как выполнить защиту на внешнем сайте для работы с безопасностью с родительского сайта? Как заблокировать src в iframe от прямого доступа? – oneiros

+0

http://stackoverflow.com/questions/44509/single-sign-on-across-multiple-domains –

ответ

2

Если вы не хотите, чтобы внешний сайт был поднят, я бы предложил не использовать iframe вообще. Вы можете заставить php разместить содержимое внешнего сайта непосредственно на текущей странице, например, с помощью file_get_contents() Это также позволяет использовать простую форму безопасности, так как вы можете получать данные аутентификации POST с существующего сервера на удаленный один:

$opts = array('http' => 
    array(
    'method' => 'POST', 
    'header' => "Content-Type: text/xml\r\n". 
     "Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n", 
    'content' => $body, 
    'timeout' => 60 
) 
); 

$context = stream_context_create($opts); 
$url = 'https://'.$https_server; 
$result = file_get_contents($url, false, $context, -1, 40000); 

(пример из секции комментариев PHP локон руководство по file_get_contents 1)

более сложный путь (он же лучше в долгосрочной перспективе, если у вас есть время, чтобы понять это) является для использования curl вы можете увидеть, как получить результат POST с помощью кода с этого вопроса: PHP + curl, HTTP POST sample code?

Edit: только что видел ваш комментарий:

Проблема с этим подходом является то, что внешний сайт загружается в IFRAME выполняет множество запросов Аякса страниц, находящихся на одном сервере.

Нет ничего, что помешало бы вам выполнить запросы ajax на странице. Конечно, запросы должны поступать из того же домена по умолчанию, но есть способы вокруг этого:

  1. Есть скрипт PHP на вашей собственной странице выступать в качестве посредника: в основном это будет проходить Аякс к внешний сервер, а затем отправить ответ обратно (вверх, просто, обратная сторона, дополнительный трафик генерируется в результате запроса обрабатывается дважды)

  2. Cross-Origin совместного использования ресурсов https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS), в основном, вы говорите клиенту, что вы будете использовать ресурсов с другого сайта. Таким образом, браузеры не будут блокировать его как потенциальный захват.

(см http://css.dzone.com/articles/ajax-requests-other-domains)

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

Если вы должны использовать iframe, вы должны иметь аутентификацию, так как в противном случае он будет открыт для всего мира, так как клиенту необходимо напрямую обратиться к сайту. Вы можете получать данные POST в iframe (см. Sending data through post method to an iframe или How do you post to an iframe?), который включает в себя настройку iframe в качестве формы, а затем отправку формы (которую вы можете сделать автоматически через javascript) для получения результатов POST.

Поскольку это должно быть сделано на стороне клиента, оно не только предоставляет страницу, на которую нужно перейти, но и какие запросы отправлять. Независимо от того, является ли это проблемой, зависит от вас и от каких пользователей вы ожидаете использовать свою программу.

Что касается curl, завиток не решит проблему с вызовами iframe и ajax как таковой, но это более эффективная и гибкая команда/структура url/webpage, чем file_get_contents.

+0

Вот почему я не использую file_get_contents(): внешний сайт, загружаемый в iframe, выполняет многочисленные запросы ajax на страницы, находящиеся на одном сервере. Если бы я просто делал 'file_get_contents', он просто вставлял содержимое этого файла, не более того. Как бы завиток решить эту проблему для меня? (Я не против тратить время на изучение завитка? – oneiros

1

Не такой чистый, но эффективный способ - загрузить удаленный сайт через file_get_contents и вывести его. Возможно, у вас могут возникнуть проблемы с именами путей, которые понравились любимым изображениям, css, скриптам. Вы можете исправить их, используя абсолютные URL-адреса повсюду, если вы управляете удаленным сайтом.

Возможно, вы захотите рассмотреть вопрос о кешировании, если производительность является проблемой.

+0

Проблема с этим подходом заключается в том, что внешний сайт, загружаемый в iframe, выполняет многочисленные запросы ajax на страницы, находящиеся на одном и том же сервер. Если бы я просто делал 'file_get_contents', он просто вставлял содержимое этого файла, не более того. Все эти запросы ajax будут испорчены. – oneiros

+0

В этом случае вам необходимо реализовать какую-либо защиту на удаленном сервере. Вы не можете эффективно запретить пользователям захватывать URL-адрес iframe и вызывать его напрямую. Проверка реферера дает очень легкую защиту, если вы можете позволить себе полагаться на то, что пользователи не слишком умны. – MrTweek

Смежные вопросы