Предложения по облегчению БД: 1. Если есть две точки с одинаковым BSSID/ESSID/Sec/Key, но у одной есть WPS PIN, а у другой нет - удалить из БД точку без пина (ибо она не несёт дополнительной полезной информации). Примеры: Code: 54:A0:50:DC:39:AC 54:A0:50:DC:C1:7C и там ещё много 2. Две точки - BSSID/ESSID совпадают, но у одной из них нет Sec/Key, а у второй есть - первую удалить. Примеры: Code: BC:AE:C5:C4:96:4B Ещё обнаружил на примере 54:A0:50C:35:8C (две записи), что в AllBig нет ведущих нулей в пароле и пин коде, а это означает, что вся загрузка с этим комментарием, возможно, теряет смысл.
Тоже хотел это написать. Ещё добавлю, есть одинаковые точки (например, 08:60:6E:23:10:24), но только у одной нет ведущих нулей у ESSID / KEY / PIN, а у другой есть. Соответственно первую нужно удалить
Ох уж эти чистки... Вечная проблема! Один раз почистишь, с новыми загрузками опять появятся косяки... Я подумываю о создании некой функции, которая при загрузке будет проверять все загружаемые данные на валидность: отсутствие тэгов и спецсимволов, длину ключа и пинкода, соответствие бсида, айпи, маски шаблонам и некоторые другие правила (отсутствие нулей в схожей записи, ключи и пины вроде 3.8e10 ошибки экселя). Отдельные чистки меня утомили. Если кому интересно, могу дать доступ к мускулу для чистки - в личку. У меня сейчас другие дела, примерно месяц я буду в оффлайне
Кстати, предварительно хостинг меня устроил, нужно оплатить. Если есть у кого анонимная симка или qiwi счёт, киньте в личку данные, хочу выставить счёт для оплаты в терминале.
Думаю стоит добавить в отчёты или статистику порты wifi точек ходовые понятно что 80 8080 но при скане встречаются и другие
Функция таки нужна, да... Тут всё зависит от того, какие порты пользователи выбирали для сканирования, и какие из них попали в цель. Но в общем-то да, было бы полезно.
Если длина пинкода меньше 8, это не так страшно - нужно проверять, не больше ли она, и нет ли других символов кроме цифр. А нули при необходимости добавить. Ключи же вроде 3.8e10, по-моему, надо оставлять. По крайней мере понятно, что ключ - 11 цифр (для данного примера), причём первые две это 38. Перебрать оставшиеся 9 вполне реально.
Если так просто перебрать 9 символов, то в элементарно перебрать большинство паролей от роутеров (обычно ставят только цифры, обычно это 8 знаков, реже 9 знаков). Ну а раз так, то вообще какой смысл в этом сайте, раз все так легко перебирается? Нет, я считаю неверные данные нужно фильтровать. Для большинства народу такие точки на карте только отвлекают. На счет пинкода интересно, я не задумывался о пропавшем спереди нуле... Но на счет 9 и больше знаков, разве пин не может быть 9-ти значным?? Где об этом можно прочитать?
https://ru.wikipedia.org/wiki/Wi-Fi_Protected_Setup Ну, не так просто. Но, во-первых, не символов, а цифр, а, во-вторых, часов за 7 я на своей карточке переберу. Впрочем ты, наверно, прав.
Отличный сайт, спасибо автору! Есть вопрос: если BSSID не находится в базе Яндекса и не наносится на карту 3wifi во время залива данных, то появится ли она потом, если Яндекс её добавит? Надеюсь, понятно объяснил. Короче, BSSID один только раз в базе Яндекса ищутся, при добавлении, или потом еще?
Да, я иногда делаю полную перепроверку всех записей, т.е. точка может добавиться на карту, переместиться. Но этот процесс долгий и ресурсоемкий, по-этому делаю это не часто. Еще в планах добавить другие источники местоположения.
Ну с 7-ю и меньше знаками в пинкоде понятно - пропущены нули впереди. А как быть с 9-ти и больше цифрами? Откуда такие взялись? Мне не понятно... Надо будет как-нибудь выловить такие устройства и посмотреть что там внутри на самом деле.
Мне пока с 9-ю знаками пин поподался только в роутерах 'Huawei HG231f'. С ними все просто удаляем первый символ. Code: 109.227.205.174 443 78 Done admin:admin Huawei HG231f AC:E8:7B:D1:5D:D4 sd1-45 WPA2 08011974 037210441 192.168.1.100 255.255.255.0 109.227.205.174 255.255.255.0 109.227.205.254 82.117.162.230 82.117.162.231 binarymaster исправьте пожалуйста. Вот я скачал и поправил Вашу базу. BSSID_PIN_3wifi.tk_001.txt - сама база. разделенная TAB. DeletedRows_XXX.txt - это выхлоп программы при удалении. Записи по две строки, первая что удалили вторая что осталось. http://rghost.ru/private/7q25B8xFP/4a868063e44b2bd3661cf0ee5bb65fe2 ПАСС - как на сайте.
Сделал проверку на длину > 8 и на ноль в начале, он будет обрезаться. Но это только для парсера этой модели.
А почему не используются карты от гугла? Точки моего провайдера гугл находит чаще у себя в бд чем яндекс
Гугл не позволяет получать координаты точек. Он предоставляет данные о геолокации, только если ему указать не менее двух точек, которые есть у него в базе, и при этом расположены рядом. Прикрутил ещё поддержку загрузки отчётов в формате TXT.
Может стоит прикрутить загрузку файлов из wigle.net, и брать координаты из них. Еще можно из ака wigle.net сканировать города. Когда у меня было в статистике 10 000, сайт мне отдавал примерно столько-же. Когда в статистике перевалило за 100 000 , я спокойно парсил районы. Но сейчас они поменяли движок, мой парсер уже не катит, перепишу попробую. Думаю если люди будут заливать файлы своих сканов, этого будет достаточно.
Подскажите как разместить 3wifi на локальном ресурсе (на компьютере) Помогите пожалуйста возникает ошибка: Code: Warning: mysqli_connect() [function.mysqli-connect]: (HY000/2003): Can't connect to MySQL server on '127.0.0.1' (10061) in C:\Users\admin\Desktop\MiniServX\www\con_db.php on line 8 Fatal error: Call to a member function query() on a non-object in C:\Users\admin\Desktop\MiniServX\www\stat.php on line 25 con_db.php: <?php /* Подключаемся к БД */ $db_serv = "127.0.0.1"; $db_name = "3wifi_tk"; $db_user = "user_3wifi_tk"; $db_pass = ""; $db = mysqli_connect($db_serv, $db_user, $db_pass, $db_name); /* проверка подключения */ if ($db->connect_errno) { echo "Не удалось подключиться к MySQL: (" . $db->connect_errno . ") " . $db->connect_error; exit(); } ?> stat.php: <?php $topPort=10; $topauth=100; $topname=30; $topbssid=30; $topessid=30; $topSecurity=30; $topWiFiKey=30; $topWPSPIN=30; $topWANGateway=30; $topDNS=30; ?> <html><head> <title>3WiFi: Статистика</title> <meta http-equiv=Content-Type content="text/html;charset=UTF-8"> <link rel=stylesheet href="css/style.css" type="text/css"> </head><body> <?php require 'con_db.php'; /* Коннектор MySQL */ /* Таблица комментарии */ $yvalue = 0; $ycount = 0; $query="SELECT COUNT(DISTINCT `comment`),COUNT(*) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $ycount=$row[1]; $res->close(); }; echo "<table class=st1>"; printf("<tr><th>count (%s)</th><th>comment (%s)</th></tr>\n", $ycount, $yvalue); $query="SELECT `comment`, COUNT(*) FROM free GROUP BY `comment` ORDER BY COUNT(*) DESC"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { printf("<tr><td>%s</td><td>%s</td></tr>\n", $row[1], $row[0]); }; $res->close(); }; /* Таблица устройства */ $yvalue = 0; $query="SELECT COUNT(DISTINCT `name`) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $res->close(); }; printf("<tr><th>count (%s)</th><th>name (top$topname)</th></tr>\n",$yvalue); $query="SELECT `name`, COUNT(*) FROM free GROUP BY `name` ORDER BY COUNT(*) DESC LIMIT $topname"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { printf("<tr><td>%s</td><td>%s</td></tr>\n", $row[1], $row[0]); }; $res->close(); }; /* Таблица порты */ $yvalue = 0; $query="SELECT COUNT(DISTINCT `Port`) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $res->close(); }; printf("<tr><th>count (%s)</th><th>Port (top$topPort)</th></tr>\n",$yvalue); $query="SELECT `Port`, COUNT(*) FROM free GROUP BY `Port` ORDER BY COUNT(*) DESC LIMIT $topPort"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { printf("<tr><td>%s</td><td>%s</td></tr>\n", $row[1], $row[0]); }; $res->close(); }; /* Таблица авторизация */ $yvalue = 0; $query="SELECT COUNT(DISTINCT `Authorization`) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $res->close(); }; printf("<tr><th>count (%s)</th><th>Authorization (top$topauth)</th></tr>\n",$yvalue); $query="SELECT `Authorization`, COUNT(*) FROM free GROUP BY `Authorization` ORDER BY COUNT(*) DESC LIMIT $topauth"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { $xcount = $row[1]; $xvalue = $row[0]; if (strlen($xvalue) > 64) { printf("<tr><td>%s</td><td style=\"max-width:700px;overflow-x:scroll\">%s</td></tr>\n", $xcount, $xvalue); } else { printf("<tr><td>%s</td><td>%s</td></tr>\n", $xcount, $xvalue); } }; $res->close(); }; /* Таблица BSSID */ $yvalue = 0; $query="SELECT COUNT(DISTINCT `BSSID`) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $res->close(); }; printf("<tr><th>count (%s)</th><th>BSSID (top$topbssid)</th></tr>\n",$yvalue); $query="SELECT `BSSID`, COUNT(*) FROM free GROUP BY `BSSID` ORDER BY COUNT(*) DESC LIMIT $topbssid"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { printf("<tr><td>%s</td><td><tt>%s</tt></td></tr>\n", $row[1], $row[0]); }; $res->close(); }; /* Таблица ESSID */ $yvalue = 0; $query="SELECT COUNT(DISTINCT `ESSID`) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $res->close(); }; printf("<tr><th>count (%s)</th><th>ESSID (top$topessid)</th></tr>\n",$yvalue); $query="SELECT `ESSID`, COUNT(*) FROM free GROUP BY `ESSID` ORDER BY COUNT(*) DESC LIMIT $topessid"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { printf("<tr><td>%s</td><td>%s</td></tr>\n", $row[1], $row[0]); }; $res->close(); }; /* Таблица Security */ $yvalue = 0; $query="SELECT COUNT(DISTINCT `Security`) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $res->close(); }; printf("<tr><th>count (%s)</th><th>Security (top$topSecurity)</th></tr>\n",$yvalue); $query="SELECT `Security`, COUNT(*) FROM free GROUP BY `Security` ORDER BY COUNT(*) DESC LIMIT $topSecurity"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { printf("<tr><td>%s</td><td>%s</td></tr>\n", $row[1], $row[0]); }; $res->close(); }; /* Таблица WiFiKey */ $yvalue = 0; $query="SELECT COUNT(DISTINCT `WiFiKey`) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $res->close(); }; printf("<tr><th>count (%s)</th><th>WiFiKey (top$topWiFiKey)</th></tr>\n",$yvalue); $query="SELECT `WiFiKey`, COUNT(*) FROM free GROUP BY `WiFiKey` ORDER BY COUNT(*) DESC LIMIT $topWiFiKey"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { printf("<tr><td>%s</td><td>%s</td></tr>\n", $row[1], $row[0]); }; $res->close(); }; /* Таблица WPSPIN */ $yvalue = 0; $query="SELECT COUNT(DISTINCT `WPSPIN`) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $res->close(); }; printf("<tr><th>count (%s)</th><th>WPSPIN (top$topWPSPIN)</th></tr>\n",$yvalue); $query="SELECT `WPSPIN`, COUNT(*) FROM free GROUP BY `WPSPIN` ORDER BY COUNT(*) DESC LIMIT $topWPSPIN"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { printf("<tr><td>%s</td><td><tt>%s</tt></td></tr>\n", $row[1], $row[0]); }; $res->close(); }; /* Таблица WANGateway */ $yvalue = 0; $query="SELECT COUNT(DISTINCT `WANGateway`) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $res->close(); }; printf("<tr><th>count (%s)</th><th>WANGateway (top$topWANGateway)</th></tr>\n",$yvalue); $query="SELECT `WANGateway`, COUNT(*) FROM free GROUP BY `WANGateway` ORDER BY COUNT(*) DESC LIMIT $topWANGateway"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { printf("<tr><td>%s</td><td>%s</td></tr>\n", $row[1], $row[0]); }; $res->close(); }; /* Таблица DNS */ $yvalue = 0; $query="SELECT COUNT(DISTINCT `DNS`) FROM `free`"; if ($res = $db->query($query)) { $row = $res->fetch_row(); $yvalue=$row[0]; $res->close(); }; printf("<tr><th>count (%s)</th><th>DNS (top$topDNS)</th></tr>\n",$yvalue); $query="SELECT `DNS`, COUNT(*) FROM free GROUP BY `DNS` ORDER BY COUNT(*) DESC LIMIT $topDNS"; if ($res = $db->query($query)) { while ($row = $res->fetch_row()) { printf("<tr><td>%s</td><td>%s</td></tr>\n", $row[1], $row[0]); }; $res->close(); }; ?></table></body></html> upload.php: <html><head> <title>3WiFi: Добавление точек в базу</title> <meta http-equiv=Content-Type content="text/html;charset=UTF-8"> </head><body> <form enctype="multipart/form-data" action="upload.php" method="POST"> <!-- Поле MAX_FILE_SIZE должно быть указано до поля загрузки файла --> <input type="hidden" name="MAX_FILE_SIZE" value="15000000" /> <!-- Название элемента input определяет имя в массиве $_FILES --> <table> <tr><td>Отчёт Router Scan:</td><td><input name="userfile" type="file" accept=".csv,.txt" /></td><td>(в формате <b>CSV</b> или <b>TXT</b>)</td></tr> <tr><td>Ваш комментарий:</td><td><input name="comment" type="text" <?php if (isset($_POST['comment'])) echo 'value="'.htmlspecialchars($_POST['comment']).'" '; ?>/></td></tr> <tr><td><input type="submit" value="Отправить файл" /></td><td></td></tr> </table> </form> <?php function getExtension($filename) { return substr(strrchr($filename, '.'), 1); } if ($_SERVER['REQUEST_METHOD'] == 'POST' && count($_FILES) > 0) { $uploaddir = 'uploads/'; $filename = basename($_FILES['userfile']['name']); $uploadfile = $uploaddir . $filename; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "Файл <b>".htmlspecialchars($filename)."</b> загружен на сервер.<br>\n"; require 'con_db.php'; /* Коннектор MySQL */ $ext = strtolower(getExtension($filename)); $format = ''; if ($ext == 'csv' || $ext == 'txt') $format = $ext; if ($format == '') { $format = 'csv'; echo "Неизвестное расширение/формат файла, подразумевается CSV.<br>\n"; } if (($handle = fopen($uploadfile, "r")) !== FALSE) { $comment = $_POST['comment']; if ($comment=='') $comment='none'; $sql="INSERT INTO `$db_name`.`free` (`comment`, `IP`, `Port`, `Authorization`, `name`, `RadioOff`, `Hidden`, `BSSID`, `ESSID`, `Security`, `WiFiKey`, `WPSPIN`, `LANIP`, `LANMask`, `WANIP`, `WANMask`, `WANGateway`, `DNS`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `comment`=?, `IP`=?, `Port`=?, `Authorization`=?, `name`=?, `RadioOff`=?, `Hidden`=?, `BSSID`=?, `ESSID`=?, `Security`=?, `WiFiKey`=?, `WPSPIN`=?, `LANIP`=?, `LANMask`=?, `WANIP`=?, `WANMask`=?,`WANGateway`=?, `DNS`=?;"; $stmt = $db->prepare($sql); $row = 0; switch ($format) { case 'csv': while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { $row++; $num = count($data); if ($row == 1) { if (($data[0]!=="IP Address")or($data[1]!=="Port")or($data[4]!=="Authorization")or($data[5]!=="Server name / Realm name / Device type")or($data[6]!=="Radio Off")or($data[7]!=="Hidden")or($data[8]!=="BSSID")or($data[9]!=="ESSID")or($data[10]!=="Security")or($data[11]!=="Key")or($data[12]!=="WPS PIN")or($data[13]!=="LAN IP Address")or($data[14]!=="LAN Subnet Mask")or($data[15]!=="WAN IP Address")or($data[16]!=="WAN Subnet Mask")or($data[17]!=="WAN Gateway")or($data[18]!=="Domain Name Servers")) { echo "Неподдерживаемый формат отчёта CSV, заголовки отсутствуют!<br>\n"; break; } } if ($row !== 1) { $stmt->bind_param("ssssssssssssssssssssssssssssssssssss", // format // INSERT // comment IP Port Auth Name RadioOff Hidden BSSID ESSID Security Key WPS PIN LAN IP LAN Mask WAN IP WAN Mask WAN Gate DNS Serv $comment, $data[0], $data[1], $data[4], $data[5], $data[6], $data[7], $data[8], $data[9], $data[10], $data[11], $data[12], $data[13], $data[14], $data[15], $data[16], $data[17], $data[18], // UPDATE $comment, $data[0], $data[1], $data[4], $data[5], $data[6], $data[7], $data[8], $data[9], $data[10], $data[11], $data[12], $data[13], $data[14], $data[15], $data[16], $data[17], $data[18] ); $stmt->execute(); } } break; case 'txt': while (($str = fgets($handle)) !== FALSE) { $data = explode("\t", $str); $row++; if ($row == 1) { if (count($data) != 23) { echo "Неподдерживаемый формат отчёта TXT, нестандартное количество столбцов!<br>\n"; break; } } $stmt->bind_param("ssssssssssssssssssssssssssssssssssss", // format // INSERT // comment IP Port Auth Name RadioOff Hidden BSSID ESSID Security Key WPS PIN LAN IP LAN Mask WAN IP WAN Mask WAN Gate DNS Serv $comment, $data[0], $data[1], $data[4], $data[5], $data[6], $data[7], $data[8], $data[9], $data[10], $data[11], $data[12], $data[13], $data[14], $data[15], $data[16], $data[17], $data[18], // UPDATE $comment, $data[0], $data[1], $data[4], $data[5], $data[6], $data[7], $data[8], $data[9], $data[10], $data[11], $data[12], $data[13], $data[14], $data[15], $data[16], $data[17], $data[18] ); $stmt->execute(); } break; } fclose($handle); $stmt->close(); if ($row > 1) echo "Файл загружен в базу.<br>\n"; if (file_exists($uploadfile)) { unlink($uploadfile); echo "Временный файл удален.<br>\n"; } else die("Ошибка: Временный Файл не найден!<br>\n"); }; } else { die("Ошибка: Файл не был загружен!<br>\n"); } require 'chkxy.php'; echo "Операция завершена.<br>\n"; } ?></body></html>
Ну и зачем вы скопировали весь этот код в сообщение?) Если вы раньше не имели дела с настройкой Apache/PHP и MySQL, лучше не вскрывать эту тему...