Вопрос о PHP + AJAX + Безопасность.

[Удален]
2979

Здравствуйте.

Человек А обращается к файлу 1.php и там во взаимодействии с интерфейсом может посредством AJAX делать запрос к 2.php и там же (в 1.php) не перегружая страницу получать результат.

2.php возвращает на POST запрос XML ответ, который 1.php обрабатывает и выводит на экран.

Но есть человек B, который сделал свой интерфейс и посредством подделки реферера получает информацию из 2.php и выводит у себя.

Вопром: Как сделать, не нарушая принцип работы, защиту для 2.php, которая не позволит ему запускаться кроме как через 1.php? Т.е. чтобы по прямому обращению к нему, он не давал ответ.

png princip.png
ewg777
На сайте с 04.06.2007
Offline
225
#1

define и defined

1 и 2 связываются (гетом|постом) или инклудом?

[Удален]
#2
ewg777:
define и defined
1 и 2 связываются (гетом|постом) или инклудом?

сейчас они вообще никак не связаны ср-ми php)

Листинг для 1.php

function parseXml(xml)

{

// разбираем ответ

}

function SomeF() {

data = "?asd=213";

$(document).ready(function()

$.ajax({

type: "POST",

url: "2.php"+data,

dataType: "xml",

success: parseXml

});

});

}

Листинг 2.php

<?php

$abc = htmlspecialchars($_GET['asd']);

$whois = getenv("HTTP_REFERER");

If ($whois <> "our_site") {

$abc = 0;

}

Else {

$abc = $abc+1

}

?>

<?php

header('Content-type: text/xml');

echo <<<END

<?xml version="1.0" encoding="UTF-8"?>

<ans>

<a1>{$abc}</a1>

</ans>

END;

?>

приблизительно так

T.R.O.N
На сайте с 18.05.2004
Offline
314
#3
Чеширский:
Т.е. чтобы по прямому обращению к нему, он не давал ответ.

проверять метод запроса (не пропускать GET) и Refferer

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
[Удален]
#4
T.R.O.N:
проверять метод запроса (не пропускать GET) и Refferer

Рефер подделывается, запрос (пост или гет) можно тоже выбирать. Не канает.

[Удален]
#5

"ключик" добавьте

2.php?mysecretkey=yahahahah_you_are_fucking_hacker_lamer

ну и 2.php

<?

if($_GET['mysecretkey'] != "yahahahah_you_are_fucking_hacker_lamer")

{

die(strtoupper(str_replace("_"," ","yahahahah_you_are_fucking_hacker_lamer")));

}

S
На сайте с 15.07.2008
Offline
139
#6
Чеширский:
Рефер подделывается, запрос (пост или гет) можно тоже выбирать. Не канает.

Именно так. Рекомендация нулёвая.

Самый простой метод: сделать через сессии. При обращении к 1.php создаётся сессия, кук с её идентификатором попадает в браузер, где выполняется ajax-запрос. Вместе с этим запросом в 2.php уходит кук с айди открытой сессии. В 2.php необходимо сделать проверку на существование сессионного кука, на существование этой сессии и только тогда отдавать XML. Т.о. мы получаем _обязательную_ необходимость посещения 1.php перед тем как получить данные из 2.php.

Скажу честно, такую защиту я поломаю с помощью Curl примерно минут за 10. Но не зная методики защиты, для большинства это будет проблемой. Так что, лучше так, чем вообще никак. :)

Дальше уже можно навернуть ещё что-то сверху этого метода. Для начала, думаю, и этого хватит.

Santyago добавил 12.02.2010 в 18:24

bearman:
"ключик" добавьте

2.php?mysecretkey=yahahahah_you_are_fucking_hacker_lamer

ну и 2.php
<?
if($_GET['mysecretkey'] != "yahahahah_you_are_fucking_hacker_lamer")
{
die(strtoupper(str_replace("_"," ","yahahahah_you_are_fucking_hacker_lamer")));
}

Т.е. один ключик для всех? Смотришь исходник в браузере, копируешь ключик и используешь сколько влезет?

[Удален]
#7

Santyago, я так понял, что 2.php не вызывается браузером напрямую, а через 1.пхп, если неправ, то очевидно что этот метод не сканает :)

bearman добавил 12.02.2010 в 18:26

Santyago:
такую защиту я поломаю с помощью Curl примерно минут за 10

минута от силы.

[Удален]
#8
bearman:
"ключик" добавьте

2.php?mysecretkey=yahahahah_you_are_fucking_hacker_lamer

ну и 2.php
<?
if($_GET['mysecretkey'] != "yahahahah_you_are_fucking_hacker_lamer")
{
die(strtoupper(str_replace("_"," ","yahahahah_you_are_fucking_hacker_lamer")));
}

запрос отправляется от браузера... Его легко поймать... да и к тому же запрос отправляется через js... что упрощает задачу до банального просмотра исходников 1.php в браузере.

Чеширский добавил 12.02.2010 в 18:28

bearman:
Santyago, я так понял, что 2.php не вызывается браузером напрямую, а через 1.пхп, если неправ, то очевидно что этот метод не сканает :)

bearman добавил 12.02.2010 в 18:26

минута от силы.

2.php вызывается через бразуер, так как вызывается средствами JS.

[Удален]
#9
Чеширский:
Человек А обращается к файлу 1.php и там во взаимодействии с интерфейсом может посредством AJAX делать запрос к 2.php и там же (в 1.php) не перегружая страницу получать результат.

видимо да, 2.пхп должен аяксом из браузера браться. тогда сессия спасет 100%. ито до использования курла =)

в общем то есть правило - "что может увидеть пользователь, невозможно защитить от скачивания/парсинга"

bearman добавил 12.02.2010 в 18:29

Чеширский, да, прошу продения, глянул на картинку а не в текст :)

по картинке думается, будто 1.php выступает в роли "прокси" между пользователем и 2.

спрячте ее)

S
На сайте с 15.07.2008
Offline
139
#10
bearman:
Santyago, я так понял, что 2.php не вызывается браузером напрямую, а через 1.пхп, если неправ, то очевидно что этот метод не сканает :)

Судя по этому

$.ajax({

type: "POST",
url: "2.php"+data,
dataType: "xml",
success: parseXml
});
});

Таки вызывается из браузера и задача как раз в том, чтобы запретить прямые вызовы без захода на страницу сайта. Если не прав - тоже поправьте... :)

bearman:
bearman добавил 12.02.2010 в 18:26минута от силы.

Гм... А кофе заварить?.. :D

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий