1
0

auth.utils.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. <?php
  2. define("CONFIG", 1);
  3. define("SQL", 1);
  4. require_once($_SERVER['DOCUMENT_ROOT'] . "/cfg/config.php");
  5. require_once($_SERVER['DOCUMENT_ROOT'] . "/inc/sql.php");
  6. require_once($_SERVER['DOCUMENT_ROOT'] . "/inc/common.php");
  7. ini_set('session.use_trans_sid', true);
  8. ini_set('session.use_only_cookies', false);
  9. function logout()
  10. {
  11. if (!session_id()) {
  12. session_start();
  13. }
  14. if (session_id()) {
  15. // Если есть активная сессия, удаляем куки сессии
  16. setcookie(session_name(), session_id(), time() - 60 * 60 * 24);
  17. if (isset($_COOKIE["Auth"])) {
  18. unset($_COOKIE["Auth"]);
  19. setcookie("Auth", null, -1);
  20. }
  21. session_unset();
  22. session_destroy();
  23. }
  24. header("Location: /login.php");
  25. }
  26. function qlogout()
  27. {
  28. if (!session_id()) {
  29. session_start();
  30. }
  31. if (session_id()) {
  32. // Если есть активная сессия, удаляем куки сессии
  33. setcookie(session_name(), session_id(), time() - 60 * 60 * 24);
  34. if (isset($_COOKIE["Auth"])) {
  35. unset($_COOKIE["Auth"]);
  36. setcookie("Auth", null, -1);
  37. }
  38. session_unset();
  39. session_destroy();
  40. }
  41. exit;
  42. }
  43. //login by password
  44. function login($db)
  45. {
  46. if (!session_id()) {
  47. if (!session_start()) {
  48. logout();
  49. exit();
  50. }
  51. }
  52. #get cookie
  53. if (isset($_COOKIE["Auth"])) {
  54. $data_array = explode(":", $_COOKIE["Auth"]);
  55. # 0 - customer_id
  56. # 1 - session_id
  57. # 2 - md5 (session_key.':'. user ip)
  58. #clear old sessions history
  59. $old_time = time() - 60 * 60 * 24;
  60. run_sql($db, "DELETE FROM sessions WHERE start_time<" . $old_time);
  61. $session = get_record_sql($db, "SELECT * FROM sessions WHERE session_id='" . $data_array[1] . "' AND customer_id=" . $data_array[0]);
  62. if (!empty($session)) {
  63. $auth_ip = get_user_ip();
  64. #check session
  65. $current_hash = md5($session['id'] . ":" . $session['session_key'] . ":" . $auth_ip);
  66. #enable access
  67. if (isset($data_array[2]) and $current_hash === $data_array[2]) {
  68. $auth_record = get_record_sql($db, "SELECT * FROM `Customers` WHERE id='" . $data_array[0] . "'");
  69. $_SESSION['IP'] = $auth_ip;
  70. $_SESSION['user_id'] = $auth_record['id'];
  71. $_SESSION['login'] = $auth_record['Login'];
  72. } else {
  73. unset($_COOKIE["Auth"]);
  74. setcookie("Auth", null, -1);
  75. }
  76. }
  77. }
  78. if (!IsAuthenticated($db)) {
  79. logout();
  80. exit();
  81. }
  82. return true;
  83. }
  84. //login by api_key
  85. function Silentlogin($db)
  86. {
  87. if (!session_id()) {
  88. if (!session_start()) {
  89. logout();
  90. exit();
  91. }
  92. }
  93. if (!IsSilentAuthenticated($db)) {
  94. logout();
  95. exit();
  96. }
  97. return true;
  98. }
  99. function IsAuthenticated($db)
  100. {
  101. if (!empty($_SESSION['user_id'])) {
  102. return true;
  103. }
  104. if (empty($auth_ip)) {
  105. $auth_ip = get_user_ip();
  106. $_SESSION['IP'] = $auth_ip;
  107. }
  108. if (!empty($_POST['login'])) {
  109. $login = trim($_POST['login']);
  110. }
  111. if (!empty($_POST['password'])) {
  112. $pass = trim($_POST['password']);
  113. }
  114. if (empty($login) or empty($pass)) {
  115. LOG_INFO($db, "login [$login] or password [$pass] undefined from $auth_ip: fail!");
  116. logout();
  117. return false;
  118. }
  119. $login = htmlspecialchars(stripslashes($login));
  120. if (empty($login) or empty($pass)) {
  121. LOG_INFO($db, "login [$login] or password [$pass] undefined from $auth_ip: fail!");
  122. logout();
  123. return false;
  124. }
  125. $query = "SELECT * FROM `Customers` WHERE Login='{$login}'";
  126. $auth_record = get_record_sql($db, $query);
  127. if (!empty($auth_record)) {
  128. if (password_verify($pass, $auth_record['password'])) {
  129. if (empty($_SESSION['session_id'])) {
  130. session_regenerate_id();
  131. $_SESSION['session_id'] = session_id();
  132. }
  133. if (empty($_SESSION['user_id'])) {
  134. LOG_INFO($db, "login user [$login] from " . $_SESSION['IP'] . ": success.");
  135. }
  136. $_SESSION['user_id'] = $auth_record['id'];
  137. $_SESSION['login'] = $login;
  138. $session['session_id'] = $_SESSION['session_id'];
  139. $session['session_key'] = bin2hex(random_bytes(20));
  140. $session['customer_id'] = $auth_record['id'];
  141. $session['start_time'] = time();
  142. $ret_id = insert_record($db, 'sessions', $session);
  143. setcookie("Auth", $auth_record['id'] . ":" . $session['session_id'] . ":" . md5($ret_id . ":" . $session['session_key'] . ":" . $_SESSION['IP']), time() + 60 * 60 * 24);
  144. return true;
  145. } else {
  146. LOG_INFO($db, "login user [$login] from " . $_SESSION['IP'] . ": fail!");
  147. logout();
  148. return false;
  149. }
  150. }
  151. LOG_INFO($db, "login user [$login] from " . $_SESSION['IP'] . ": fail!");
  152. logout();
  153. return false;
  154. }
  155. function IsSilentAuthenticated($db)
  156. {
  157. if (!empty($_SESSION['user_id'])) {
  158. return true;
  159. }
  160. if (empty($auth_ip)) {
  161. $auth_ip = get_user_ip();
  162. $_SESSION['IP'] = $auth_ip;
  163. }
  164. if (!empty($_GET['login'])) {
  165. $login = trim($_GET['login']);
  166. }
  167. if (!empty($_POST['login'])) {
  168. $login = trim($_POST['login']);
  169. }
  170. if (!empty($_GET['password'])) {
  171. $pass = trim($_GET['password']);
  172. }
  173. if (!empty($_POST['password'])) {
  174. $pass = trim($_POST['password']);
  175. }
  176. if (!empty($_GET['api_key'])) {
  177. $pass = trim($_GET['api_key']);
  178. }
  179. if (!empty($_POST['api_key'])) {
  180. $pass = trim($_POST['api_key']);
  181. }
  182. if (empty($login) or empty($pass)) {
  183. LOG_INFO($db, "login or password undefined from $auth_ip: fail!");
  184. logout();
  185. return false;
  186. }
  187. $login = htmlspecialchars(stripslashes($login));
  188. if ($login == '' or $pass == '') {
  189. LOG_INFO($db, "login or password undefined from $auth_ip: fail!");
  190. logout();
  191. return false;
  192. }
  193. $query = "SELECT id FROM `Customers` WHERE Login='{$login}' AND `api_key`='{$pass}'";
  194. $auth_record = get_record_sql($db, $query);
  195. if (!empty($auth_record)) {
  196. if (empty($_SESSION['session_id'])) {
  197. session_regenerate_id();
  198. $_SESSION['session_id'] = session_id();
  199. }
  200. if (empty($_SESSION['user_id'])) {
  201. LOG_INFO($db, "Silent login user [$login] from " . $_SESSION['IP'] . ": success.");
  202. }
  203. $_SESSION['user_id'] = $auth_record['id'];
  204. $_SESSION['login'] = $login;
  205. return true;
  206. }
  207. LOG_INFO($db, "Silent login user $login from " . $_SESSION['IP'] . ": fail!");
  208. logout();
  209. return false;
  210. }