Form protection + Facebook + Internet Explorer = nekde je tu zakopany asipes
- chemix
- Nette Core | 1310
Problem je ze netusim co ten asipes je
Mam stranku co ji potrebuji zobrazovat ve facebookovem prostredi a v ni mam formular ve kterem bych chtel mit zaplou CSRF protekci.
Vzal jsem piskoviste a upravil nasledujici
config.neon
common:
php:
date.timezone: Europe/Prague
# session.save_path: "%tempDir%/sessions"
# zlib.output_compression: yes
nette:
security:
frames:
session:
autoStart: yes
expiration: '+ 14 days'
production < common:
development < common:
HomepagePresenter.php
<?php
/**
* Homepage presenter.
*
* @author John Doe
* @package MyApplication
*/
class HomepagePresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->time = new DateTime;
}
public function createComponentCsrfForm()
{
$form = new NAppForm();
$form->addProtection('CSRF Protection Error');
// email
$control = $form->addText('email', 'E-mail:')
->setRequired();
$control->setType('email')
->addCondition(NForm::FILLED)
->addRule(NForm::EMAIL, 'not valid email address');
$form->addCheckbox('maillist', 'radio');
$form->addSubmit('actionSend', 'send');
$form->onSuccess[] = callback($this, 'saveUserToDb');
return $form;
}
public function saveUserToDb($form)
{
print_r($form->getValues());
exit('--OK--');
}
}
a sablonu Homepage/default.latte
{* This is the welcome page, you can delete it *}
{block content}
<div id="banner">
<h1>Facebook problem</h1>
</div>
<div id="content">
{$time|date:'Y-m-d H:i:s'}
{control csrfForm}
</div>
{/block}
Firefox , chrome neni problem … az na Internet Explorer (zkousel 7,9) ten mi proste vzdy hodi CSRF error
viz stranka co pak tohle cele zobrazuje
!!!POZOR nema to zaplou podporu pro HTTPS!!!
http://apps.facebook.com/drzhubuakrok/
netusite nekdo proc by se to melo chovat takhle divne ?
- enumag
- Člen | 2118
Dneska jsem studoval .htaccess z HTMLBolerPlate a našel jsem něco co by mohlo souviset:
# ----------------------------------------------------------------------
# Cookie setting from iframes
# ----------------------------------------------------------------------
# Allow cookies to be set from iframes (for IE only)
# If needed, specify a path or regex in the Location directive.
# <IfModule mod_headers.c>
# Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
# </IfModule>
- ic
- Člen | 430
Jo, P3P jsem kdysi i rozuměl… ale človek rýchlo zabúda.
Šlo tam o jakési prohlášení o tom, jak zacházím (co ukládám, jak dlouho, kdo to kontroluje a tak dále) s cookies, které používám. Jde tam toho nastavit opravdu hodně a člověk si na sebe může vymyslet i pokuty a takové věci.
Asi by to nikdo moc nevyplňoval, pokud by IE6+ nepřišel s tím, že nebude ukládat cookies 3. stran, pokud nebudou mít toto P3P (a jen pokud tam budou ty údaje, co se mu líbí). To by mohl být právě tento případ.
Výsledkem má být soubor, kde jsou tyto údaje zapsány v XML v nějakém strojovém jazyku, soubor s tím samým lidsky-čitelným, nějaké hlavičky do stránky a pak tady ta hlavička http protokolu. Ta jediná tomu IEčku stačila, aby nedělal problémy.
Dá se tam jen tak střelit ta hlavička opsaná odněkud odjinud, ale
každé to písmenko něco říká, tak aby se pak člověk nedivil XD
Nějaké minimum, aby to fungovalo je asi P3P: CP="NON DSP COR NOR"
(snad se to od dob IE6-ky nezměnilo) více zde: http://php.vrana.cz/p3p.php
Člověk si to může nastudovat, je k tomu i knížka přes 300 stran http://www.amazon.com/…p/0596003714
Nebo použít nějaký z generátorů:
- jednoduší : http://www.krypta.cz/p3p/info.php
- a složitější : http://www.eder.us/…en/index.php
nicméně jak jsem psal… když si to člověk nakliká příliš benevolentně, tak to IEčko stejně nesežere, takže to chce párkrát zkusit.