/modules/xhnewbb/include/gtickets.php

https://gitlab.com/BaseX/BaseX · PHP · 209 lines · 137 code · 39 blank · 33 comment · 36 complexity · acbd833efb602f5dc1c488742730524a MD5 · raw file

  1. <?php
  2. // GIJOE's Ticket Class (based on Marijuana's Oreteki XOOPS)
  3. // nobunobu's suggestions are applied
  4. if( ! class_exists( 'XoopsGTicket' ) ) {
  5. class XoopsGTicket {
  6. var $_errors = array() ;
  7. var $_latest_token = '' ;
  8. // render form as plain html
  9. function getTicketHtml( $salt = '' , $timeout = 1800 , $area = '' )
  10. {
  11. return '<input type="hidden" name="XOOPS_G_TICKET" value="'.$this->issue( $salt , $timeout , $area ).'" />' ;
  12. }
  13. // returns an object of XoopsFormHidden including theh ticket
  14. function getTicketXoopsForm( $salt = '' , $timeout = 1800 , $area = '' )
  15. {
  16. return new XoopsFormHidden( 'XOOPS_G_TICKET' , $this->issue( $salt , $timeout , $area ) ) ;
  17. }
  18. // returns an array for xoops_confirm() ;
  19. function getTicketArray( $salt = '' , $timeout = 1800 , $area = '' )
  20. {
  21. return array( 'XOOPS_G_TICKET' => $this->issue( $salt , $timeout , $area ) ) ;
  22. }
  23. // return GET parameter string.
  24. function getTicketParamString( $salt = '' , $noamp = false , $timeout=1800 , $area = '' )
  25. {
  26. return ( $noamp ? '' : '&amp;' ) . 'XOOPS_G_TICKET=' . $this->issue( $salt, $timeout , $area ) ;
  27. }
  28. // issue a ticket
  29. function issue( $salt = '' , $timeout = 1800 , $area = '' )
  30. {
  31. global $xoopsModule ;
  32. // create a token
  33. list( $usec , $sec ) = explode( " " , microtime() ) ;
  34. $appendix_salt = empty( $_SERVER['PATH'] ) ? XOOPS_DB_NAME : $_SERVER['PATH'] ;
  35. $token = crypt( $salt . $usec . $appendix_salt . $sec ) ;
  36. $this->_latest_token = $token ;
  37. if( empty( $_SESSION['XOOPS_G_STUBS'] ) ) $_SESSION['XOOPS_G_STUBS'] = array() ;
  38. // limit max stubs 10
  39. if( sizeof( $_SESSION['XOOPS_G_STUBS'] ) > 10 ) {
  40. $_SESSION['XOOPS_G_STUBS'] = array_slice( $_SESSION['XOOPS_G_STUBS'] , -10 ) ;
  41. }
  42. // record referer if browser send it
  43. $referer = empty( $_SERVER['HTTP_REFERER'] ) ? '' : $_SERVER['REQUEST_URI'] ;
  44. // area as module's dirname
  45. if( ! $area && is_object( @$xoopsModule ) ) {
  46. $area = $xoopsModule->getVar('dirname') ;
  47. }
  48. // store stub
  49. $_SESSION['XOOPS_G_STUBS'][] = array(
  50. 'expire' => time() + $timeout ,
  51. 'referer' => $referer ,
  52. 'area' => $area ,
  53. 'token' => $token
  54. ) ;
  55. // paid md5ed token as a ticket
  56. return md5( $token . XOOPS_DB_PREFIX ) ;
  57. }
  58. // check a ticket
  59. function check( $post = true , $area = '' )
  60. {
  61. global $xoopsModule ;
  62. $this->_errors = array() ;
  63. // CHECK: stubs are not stored in session
  64. if( empty( $_SESSION['XOOPS_G_STUBS'] ) || ! is_array($_SESSION['XOOPS_G_STUBS'])) {
  65. $this->clear() ;
  66. $this->_errors[] = 'Invalid Session' ;
  67. return false ;
  68. }
  69. // get key&val of the ticket from a user's query
  70. if( $post ) {
  71. $ticket = empty( $_POST['XOOPS_G_TICKET'] ) ? '' : $_POST['XOOPS_G_TICKET'] ;
  72. } else {
  73. $ticket = empty( $_GET['XOOPS_G_TICKET'] ) ? '' : $_GET['XOOPS_G_TICKET'] ;
  74. }
  75. // CHECK: no tickets found
  76. if( empty( $ticket ) ) {
  77. $this->clear() ;
  78. $this->_errors[] = 'Irregular post found' ;
  79. return false ;
  80. }
  81. // gargage collection & find a right stub
  82. $stubs_tmp = $_SESSION['XOOPS_G_STUBS'] ;
  83. $_SESSION['XOOPS_G_STUBS'] = array() ;
  84. foreach( $stubs_tmp as $stub ) {
  85. // default lifetime 30min
  86. if( $stub['expire'] >= time() ) {
  87. if( md5( $stub['token'] . XOOPS_DB_PREFIX ) === $ticket ) {
  88. $found_stub = $stub ;
  89. } else {
  90. // store the other valid stubs into session
  91. $_SESSION['XOOPS_G_STUBS'][] = $stub ;
  92. }
  93. } else {
  94. if( md5( $stub['token'] . XOOPS_DB_PREFIX ) === $ticket ) {
  95. // not CSRF but Time-Out
  96. $timeout_flag = true ;
  97. }
  98. }
  99. }
  100. // CHECK: the right stub found or not
  101. if( empty( $found_stub ) ) {
  102. $this->clear() ;
  103. if( empty( $timeout_flag ) ) $this->_errors[] = 'Invalid Session' ;
  104. else $this->_errors[] = 'Time out' ;
  105. return false ;
  106. }
  107. // set area if necessary
  108. // area as module's dirname
  109. if( ! $area && is_object( @$xoopsModule ) ) {
  110. $area = $xoopsModule->getVar('dirname') ;
  111. }
  112. // check area or referer
  113. if( @$found_stub['area'] == $area ) $area_check = true ;
  114. if( ! empty( $found_stub['referer'] ) && strstr( @$_SERVER['HTTP_REFERER'] , $found_stub['referer'] ) ) $referer_check = true ;
  115. // if( empty( $area_check ) || empty( $referer_check ) ) { // restrict
  116. if( empty( $area_check ) && empty( $referer_check ) ) { // loose
  117. $this->clear() ;
  118. $this->_errors[] = 'Invalid area or referer' ;
  119. return false ;
  120. }
  121. // all green
  122. return true;
  123. }
  124. // clear all stubs
  125. function clear()
  126. {
  127. $_SESSION['XOOPS_G_STUBS'] = array() ;
  128. }
  129. // Ticket Using
  130. function using()
  131. {
  132. if( ! empty( $_SESSION['XOOPS_G_STUBS'] ) ) {
  133. return true;
  134. } else {
  135. return false;
  136. }
  137. }
  138. // return errors
  139. function getErrors( $ashtml = true )
  140. {
  141. if( $ashtml ) {
  142. $ret = '' ;
  143. foreach( $this->_errors as $msg ) {
  144. $ret .= "$msg<br />\n" ;
  145. }
  146. } else {
  147. $ret = $this->_errors ;
  148. }
  149. return $ret ;
  150. }
  151. // end of class
  152. }
  153. // create a instance in global scope
  154. $GLOBALS['xoopsGTicket'] = new XoopsGTicket() ;
  155. }
  156. if( ! function_exists( 'admin_refcheck' ) ) {
  157. //Admin Referer Check By Marijuana(Rev.011)
  158. function admin_refcheck($chkref = "") {
  159. if( empty( $_SERVER['HTTP_REFERER'] ) ) {
  160. return true ;
  161. } else {
  162. $ref = $_SERVER['HTTP_REFERER'];
  163. }
  164. $cr = XOOPS_URL;
  165. if ( $chkref != "" ) { $cr .= $chkref; }
  166. if ( strpos($ref, $cr) !== 0 ) { return false; }
  167. return true;
  168. }
  169. }
  170. ?>