Я реализовал функции csrfGenerateToken и csrfVerifyToken, пытаясь предотвратить атаку CSRF.
Я настроил заголовок веб-страницы следующим образом:
set X-XSS-Protection "1; mode=block"
always set X-Frame-Options SAMEORIGIN
X-Content-Type-Options nosniff
Strict-Transport-Security "max-age=63072000" env=HTTPS
Я провел некоторое исследование и продолжаю в соответствии с рекомендациями Adobe, выполняя что-то вроде этого:
<cfset tokenVar = 't' & lCase( hash( createUUID() & randRange( 1000, 100000 ), 'MD5', 'UTF-8', 250 ) )>
<form action="updateprofile.cfm" method="post">
<input type="hidden" name="f#hash( 'tokenVar', 'SHA-256', 'UTF-8')#" value="#tokenVar#">
<input type="hidden" name="f#hash( 'formToken', 'SHA-256', 'UTF-8')#" value="#csrfGenerateToken( tokenVar, true )#">
<input type="text" name="emailAddress" value="#EmailAddress#">
<input type="text" name="phoneNumber" value="#PhoneNumber#">
<input type="submit" name="btnSubmit" value="Change Profile Info">
</form>
Updateprofile.cfm будет иметь:
<cfparam name="FORM[ 'f' & hash( 'tokenVar', 'SHA-256', 'UTF-8')]" default="0">
<cfparam name="FORM[ 'f' & hash( 'formToken', 'SHA-256', 'UTF-8')]" default="0">
<cfif not csrfVerifyToken( FORM[ 'f' & hash( 'formToken', 'SHA-256', 'UTF-8')], FORM[ 'f' & hash( 'tokenVar', 'SHA-256', 'UTF-8')] )>
<!--- CSRF attack. Clear cookies and kick user out --->
<cfinclude template="clearcookies.cfm">
<cflocation url="signin.htm" addToken = "no">
</cfif>
Это будет работать, если в одном и том же браузере вошли 2 учетных записи и одна попытается обновить другую.Однако, когда я просто сохранил копию получившегося html от одного из них и сохранил ее как csrf-attack.htm локально:
<html><body>
<script>history.pushState('', '', '/')</script>
<form action="http://www.exsample.com/updateprofile.cfm" method="post">
<input type="hidden" name="f41BE6B4E09CBA69BDB76DBB69B493E8D49F5DD9ED230085913397B4C751D4E60" value="t93315a7c3ecb43d4d1b9422da97ffb09">
<input type="hidden" name="f08DFC2607D4119D7B16B4C01DC5C00F54B044DC937257ABC411F9A7E55BB4191" value="A0EED67C55F5E17683E2E1B21FF3454FE690E0B1">
<input type="text" name="emailAddress" value="test@test.com">
<input type="text" name="phoneNumber" value="1-222-3333">
<input type="submit" name="btnSubmit" value="Change Profile Info">
</form>
</body><html>
, я обработал исходную форму, чтобы обновить номер телефона до 1-333.-4444.Потом я снова вернулся в форму.В это время новый CSRFToken должен был быть создан, потому что ForceNew был установлен в true.
Затем я перехожу на сохраненную статическую HTML-страницу и просто изменяю значение адреса электронной почты на test2@test.com вместо test@test.com со старым токеном, затем нажимаю "«Изменить информацию профиля», я смог обновить ее на сайте !!
Я что-то не так делаю или это так работает?Кажется, что токен бесполезен, если я могу просто скопировать значения токена и манипулировать контентом, а затем опубликовать его.Как я могу смягчить проблему, как это на странице получения?
Заранее спасибо.