2011-01-07 2 views
3

Я реализовал идентификатор OpenJain на моем веб-сайте Codeigniter 2.0. Он отлично работал, пока я не включил защиту CSRF в моем конфигурационном файле codeigniter.Внедрение CSRF в OpenID iframe

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

Это все прекрасно и dandy, но где я немного застрял, когда я пытаюсь войти в мой сайт сейчас, используя OpenID (форма входа в систему входит из iframe, размещенного на janrain.com) I не может включать какие-либо скрытые значения сообщений, потому что я не могу контролировать, как выглядит форма, и может предоставить только возвращаемый URL-адрес, чтобы janrain знал, на какую страницу мне возвращаться.

Как я могу получить свой токен CSRF с формой, если форма находится в iframe, который я не контролирую?

ответ

1

Понадобилось решить. Я закончил тем, что отправил iframe мой URL-адрес возврата, из которого я включил токен CSRF в качестве части URL-адреса. Когда Janrain возвращается к моему URL-адресу возврата, так как Codeigniter проходит проверку безопасности внутри Security :: csrf_verify() Я делаю небольшую проверку против URL-адреса, чтобы узнать, соответствуют ли мои токены (к сожалению, я не смог использовать библиотеки CI по какой-либо причине поэтому я в конечном итоге разобрал URL-адрес, используя explode ('/', $ _SERVER [REQUEST_URI])). Если я найду совпадение в URL-адресе к токену csrf cookie, мы все хорошо, и я не проверяю переменные POST, которые обычно выполнял бы Codeigniter.

0

Я также искал решение, как отключить CSRF на контроллер. Я сделал это таким образом:

if(stripos($_SERVER["REQUEST_URI"],'/controller') === FALSE) 
{ 
    $config['csrf_protection'] = TRUE; 
} 
else 
{ 
    $config['csrf_protection'] = FALSE; 
} 

в config.php я не знаю, если это надежный, но это работает для меня.

1

Вы также можете просто добавить это к концу вашего маркера URL:

?ci_csrf_token='.$this->security->get_csrf_hash() 

Так скажем, вы с помощью поместить его IFRAME для JanRain, полный код будет в конечном итоге выглядит, как это с:

<iframe src="https://MYACCOUNT.rpxnow.com/openid/embed?token_url=<?PHP echo rawurlencode($token_url).'?ci_csrf_token='.$this->security->get_csrf_hash(); ?>" scrolling="no" frameborder="0" seamless="seamless" style="width:400px; height:240px;"></iframe> 

Я это работает прекрасно на моем CodeIgniter, и вам не нужно, чтобы отключить защиту CSRF :)

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