Спрятать число в тексте

Dark Wizard

Гуру форума
Регистрация
23 Сен 2007
Сообщения
194
Реакции
80
Собственно, есть идея прятать id пользователя в тексте - чтобы текст, скопированный пользователям незаметно содержал его id (это позволит определить, кто скопировал текст на другой ресурс, например).

Как прятать?
Замена русских букв на английские (а, о, е, с, р, х, у). На 850 символов текста в среднем получается 160 замен - достаточно чтобы прятать 5-6 значные id с дублированием даже в небольших абзацах.

В чём смысл?
Есть пользователь с id "123". Берём текст и массив букв для замены. Заменяем в тексте первую букву из массива один раз (1), потом замену пропускаем, затем делаем две замены (2), одну пропускаем, три замены (3), пропускаем 2 (в примере 3), потом повторяем сначала.

Пример
Текст:
В лесу родилась елочка,
В лесу она росла,
Зимой и летом стройная,
зеленая была.

Замена (добавил пробелы для наглядности) :
В л e с y p о д и л а c ь ё л o ч к а,
В л е с y о н a p о c л a,
З и м o й и л e т о м с т p o й н a я,
З е л ё н а я б ы л a

Жирным обозначены замены, подчёркиванием - буквы которые специально не заменяли. Таким образом мы спрятали два раза число 123 в четырёх строках.

В этой теме я хочу обсудить наилучший алгоритм и решить некоторые проблемы кодирования.

В идеале получить 2 функции - которая прячет число в тексте, и которая получает из обработанного текста число. Наверное можно ограничиться пропуском одной замены для цифры, и двух для разделения. Также думаю лучше сначала заменить все русские буквы на английские, а потом прятать в русских буквах - будет незаметней.

Примерный набросок:
PHP:
$text = 'В лесу родилась ёлочка, В лесу она росла';
$id = '123';

//для работы без ошибок меняем во всём тексте русские буквы на английские
//меняю русские буквы на английские
$text = str_replace('а', 'a', $text);
$text = str_replace('о', 'o', $text);
$text = str_replace('е', 'e', $text);
$text = str_replace('с', 'c', $text);
$text = str_replace('р', 'p', $text);
$text = str_replace('х', 'x', $text);
$text = str_replace('у', 'y', $text);

function rletter($l){ //меняю английские на русские (в финальной версии без скобок)
if ($l == 'a'){return '[а]';}
if ($l == 'o'){return '[о]';}
if ($l == 'e'){return '[е]';}
if ($l == 'c'){return '[с]';}
if ($l == 'p'){return '[р]';}
if ($l == 'x'){return '[х]';}
if ($l == 'y'){return '[у]';}
}

function encode($text, $id){
$arr = array('a', 'o', 'e', 'c', 'p', 'x', 'y'); //массив английских букв для замены
$idlen = strlen($pid); //длина id
$skip = 0; //для пропуска
echo '[start]<br>';
for ($i = 0; $i < strlen($text); $i++){ //перебираем весь текст по буквам
  for ($num = 0; $num < $idlen; $num++){ //перебираем кол-во символов в id
    for ($d = 0; $d < intval($pid[$num]); $d++){ //делаем кол-во замен для каждого символа, соответствующее его значению (т.е. две замены для символа 2, например)
        if (in_array($text[$i], $arr)){ //если буква входит в массив
          if ($skip == 0){
          $rtext .= rletter($text[$i]); //здесь замена русской буквы на английскую
           if ($d == intval($pid[$num])){$skip--;} //пропускаем следующую замену
          }
        }else{$rtext .= $text[$i];} //не меняем другие буквы

        $i++;
    } $skip = 1; //следующий символ
  } $skip = 2; //повторно прячем id
}

echo '<br>[end]';
}

echo '<hr>';
echo encode($text, $pid);
echo '<hr>';
echo 'num: '.$i;
echo '<br>'.strlen($text);
?>

Осталась проблема в определении русских/английских букв: $text[$i] для русской буквы выдаёт кракозябру. Как можно изменить? Возможно можно реализовать как-то всё по-другому?
 
Последнее редактирование:
  • Нравится
Реакции: ZiX
На самом деле актуальная же проблема - например, чтобы понять кто с закрытых форумов выкладывает инфу и снять доступы.

Думаю надо текст str_split переводить в массив сначала, чтобы нормально обрабатывать.
 
мнемоники всё же отличаются от букв, да и не всеми шрифтами поддерживаются. Будет заметно.

Я разбил текст на массив букв, обрабатываю их, вывожу, но у меня почему-то всё равно кракозябры получаются. В чём может быть проблема?

Текст "аааббаа". Заменяю русские буквы а английскими. Когда вывожу массив - вместо бы кракозябры...
 
Я разбил текст на массив букв, обрабатываю их, вывожу, но у меня почему-то всё равно кракозябры получаются. В чём может быть проблема?

Текст "аааббаа". Заменяю русские буквы а английскими. Когда вывожу массив - вместо бы кракозябры...

текст в UTF-8 небось ? [n] - берет N-ный байт из строки
в UTF-8 символ кодируется несколькими байтами, отсюда и крякозябры тк код символа получается неправильный.
для работы с такими строками в ПХП нужно использовать функции начинающиеся с mb_
вот пример как разбить строку на массив символов

PHP:
for ($i = 0; $i < mb_strlen($string); $i++ ) {
    $chars[] = mb_substr($string, $i, 1);
}
 
Кстати как вариант противодествия копипасте с сайтов - при копировании текста на сайте подменять русские буквы на английские.
%)
 
А написать на JS функцию которая будет срабатівать при копировании...... Но чтоб обойти ваш запрет я росто открою исходний код страници и скопирую ваш текст и нече мне не зделаете и не узнаете. А приочень большом желании зелаю скрини и пропущю через FineReader нельзя защитить все
 
А написать на JS функцию которая будет срабатівать при копировании...... Но чтоб обойти ваш запрет я росто открою исходний код страници и скопирую ваш текст и нече мне не зделаете и не узнаете. А приочень большом желании зелаю скрини и пропущю через FineReader нельзя защитить все
Можно клоакинг устроить. Поисковикам выдавать нормальную копию, а пользователям уже с сервера генерить с измененными буквами.

Можно конечно и кеш поисковика посмотреть - но массово он не даст это сделать.
FineReader - это вообще какое то извращение уже))
 
сказано же, задача не просто защитить текст, а пометить его незаметно
и контент видимо не для поисковиков, так что кеш поисковиков отпадает

боюсь представить, каким же будет код декодера для слитого текста)))
 
Собственно, есть идея прятать id пользователя в тексте - чтобы текст, скопированный пользователям незаметно содержал его id (это позволит определить, кто скопировал текст на другой ресурс, например).

Один из вариантов думаю можно спрятать span с id или добавить в текст цифры (id пользователя), но в любом случае полностью защитить что либо никогда не получится, совершенной защиты не бывает.
 
но такие варианты легко обнаружить визуально и удалить текст
 
Назад
Сверху