Secure FormIt, MODX Zone - Информация за системата MODX Revolution и др
Предминалата година, когато правех формуляр за обратна връзка за себе си с помощта на добавката FormIt, по време на тестване открих интересна функция (всъщност потенциална дупка) - във формуляра могат да бъдат посочени MODX тагове (парчета, фрагменти, полета). FormIt обработва само HTML тагове, пропуска MODX тагове. И това се проявява при използване на имейл куки и FormItAutoResponder (автоматичен отговор). След като се разрових в документацията и потърсих в Google, не намерих основно решение на този проблем за избягване на MODX тагове. Затова просто глупаво поставих филтъра esc в частта на шаблона за имейл. Той избягва квадратните скоби и обратните кавички. Това решение ме устройваше на 100% и го забравих.
Преди няколко дни човек се свърза с мен чрез формата за обратна връзка с много наивен въпрос - възможно ли е да се посочват парчета в полето [[*content]]? Като въпрос като въпрос. Но след известно време започна да ме завладява подозрението, че този въпрос е с обрат. Дублирах този въпрос без филтър и получих стария проблем. По принцип това не трябва да ме плаши - esc филтърът работи добре. Но имаше едно обстоятелство, за което тогава не се замислих. Това е шаблонът на Fenom. Когато разработих формата, не я използвах. Но по-късно преминах към него, но, разбира се, дори забравих да мисля за формата. И етикетите му няма да избягат.
Още веднъж влязох в документацията и се уверих, че там не се появява нищо ново за това. По този начин FormIt прехвърля цялата отговорност за обработката на данни на разработчика и не се дават препоръки в това отношение.
А проблемът е сериозен. Ако внезапно използвате кука за автоматичен отговор и в шаблона за имейл имате етикет на полето на формуляра (например „Уважаеми [[+име]]!“), тогава потребителят може да получи всякосистемна информация. Например същият префикс на таблицата. И това се дължи на факта, че потребителските данни се предават на анализатора без филтриране чрез извикване на метода getChunk().
Има няколко възможни решения. Например, заменете скобите със съответните кодове. Но аз избрах решение с персонализиран валидатор, който ще разрешава разрешени и забранява забранени знаци. За nefig във формата за обратна връзка да използвате твърде много. За да направя това, създадох няколко фрагмента. Първият се нарича alphaNum:
Сега в полето "Име" можете да въведете само цифри, букви и още няколко символа.
За полето „Съобщение“ създадох валидатор с модела /^[^\\[\]]+$/, който просто забранява скобите за тагове MODX и Fenom.
Като цяло FormIt има вграден валидатор на регулярни изрази. Но не можах да го накарам да работи правилно. И ми се струва, че решението под формата на отделен валидатор изглежда малко по-практично.
След това трябва да ги вмъкнете в извикването на FormIt:
Заключение
Може би има готови решения, но не ги намерих. Да, беше забавно да карам колело.
P.S. Не реших веднага да пиша за това, за да не създавам ненужни проблеми от всякакви мегахакерски ученици. Но накрая реших, че има повече печалба от това знание - предупреден, после въоръжен.
Коментари ( )
Сергей, нещо не работи, може би съм го направил погрешно.
1. Създаден фрагментmyAlphaNum
2. Създаден фрагментmyNoModxTags
3. Изходен фрагмент от FormIt:
Ако всички полета са попълнени правилно и в полето "съобщение" въведете: AjaxForm пише:
т.е. дава съобщение от: пощата идва:
Ако в полето "име" въведете, например: "Саша /", тогава се показва съобщение от:
Кажи ми какво правя грешно. Икак да го направя правилно?
Опитайте да вмъкнете noModxTags във фрагмента в самото начало и вижте какво се показва в регистъра на грешките. Най-вероятно имате кодирани скоби. Използвам различен подход.
съвет. Добавете валидаторstripTagsза полето за съобщение.
Опитайте да вмъкнете във фрагмента noModxTags в самото начало и вижте какво се показва в регистъра на грешките. Най-вероятно имате кодирани скоби.
Нищо не се показва в дневника, ако контейнерът съществува, например, ако въведете това: и в имейла, където трябва да бъде текстът на съобщението, се показва заглавието на страницата на ресурса за обратна връзка.
Ако зададете: , тогава в дневника се показват две еднакви грешки:
такива грешки бяха показани дори без да се посочва във фрагмента myNoModxTags
Кодът за извикване на фрагмент myNoModxTags е както следва:
Интересуваше ме друг подход, но тъй като не съм много силен в php и наскоро се запознах с MODX, не е съвсем ясно как да го приложа. Ако нямате нищо против, можете да дадете в тази статия пример за внедряване сpluginи използване на компонентаMiddlewares. Сега в тази статия ще задам този въпрос.
Нищо не се появява в дневника
И трябва. Така че фрагментът myNoModxTags не работи.
Добавен е валидатор на stripTags, но не помага
Не е необходимо да се посочва в параметъра customValidators. Вграден е.
Интересувам се от различен подход, но тъй като не съм много силен в php и наскоро се запознах с MODX
Благодаря ти. Използвам Fenom... само изходът от фрагмента не беше на Fenom. Сега го пренаписах на Fenom и проработи.
Кажете ми, ако приложите различен подход и, както препоръчахте, създадете плъгин за събитието OnHandleRequest с приоритет "-1000", тогава методът за филтриране, описан в тази статия, вече няма да е от значение.Или можете да направите това и това?
Ако в допълнение към формата за обратна връзка няма въвеждане на потребителски данни, тогава можете да преминете с валидатор, т.е. без филтриране на всички входящи данни.
Кажете ми, ако приложите различен подход и, както препоръчахте, създадете плъгин за събитието OnHandleRequest с приоритет "-1000", тогава методът за филтриране, описан в тази статия, вече няма да е от значение. Или можете да направите това и това?
Въпреки че тази статия не описва филтриране, а валидиране на формуляр, мисля, че ако използвате само филтриране на всички $_GET, $_POST, $_REQUEST и $_COOKIE и не прилагате валидиране на формуляр, тогава формулярът ще бъде изпратен, само квадратните скоби ще бъдат изрязани. И с валидирането на формуляра, формулярът няма да бъде изпратен и ще се покаже съобщението „Формулярът съдържа грешки!“ Следователно можете да използвате и двата метода едновременно.