Вопрос по PHP (фильтрация на слова\символы)
Новая тема Написать ответ
# Пт Апр 06, 2012 3:48 pmYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
Всем привет!
Запустил сайт мемов, но там такая проблема - юные хакеры пробуют на xss и прочие уязвимости, и вместо обычных мемов получается абракадабра, вроде такого:



Сейчас у меня стоит небольшая защита от xss вида:

Код:
$pole1 = mb_strtoupper($_GET['pole1'],'UTF-8');   // получаем значение 1
$pole2 = mb_strtoupper($_GET['pole2'],'UTF-8');   // получаем значение 2

$pole1= htmlspecialchars(strip_tags($pole1));   // защита от xss для 1
$pole1= htmlspecialchars(strip_tags($pole1));   // защита от xss для 2



Спец.символы нейтрализуются, но все-равно показываются на мемах.
Также хотелось бы как-то "на лету" запретить мемы с матами.

Пожалуйста подскажите, как можно ввести дополнительную проверку, которая при обнаружении, например. одного из этих кусков:
    >
    <
    '
    мат 1
    мат 2
    .com
    iframe


- будет показывать предупреждение вместо создания мема?

Заранее большое спасибо! Drinks or Beer
# Пт Апр 06, 2012 4:50 pmtrepsXe Зарег.: 02.05.2011 ; Сообщ.: 1172Ответить с цитатой
через цикл прогони

эй, ты же мне хольцнера советовал

используй switch и case
# Пт Апр 06, 2012 5:27 pmYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
trepsXe, спасибо!
Сделал просто ограничение только кириллицей и цифрами через preg_match('/[А-Яа-я0-9 :thup:

Другой вопрос встал, очень актуальный.
Подскажите, как сделать так, чтобы не записывать в базу дубли уже существующих строк?

Т.е. у меня этот код записывает одну строку в файл-базу:

Код:
$zapis = "http://memino.ru/img/".$filename."|".$overtext."|".$overtext2."|"."\r\n";
$fh = fopen("baza.txt", "a");
fwrite($fh, $zapis);
fclose($fh);



Пробовал добавлять
Код:
$fh = array_map('trim', $fh);
if (array_search($zapis, $fh) !== false)
die('Уже в каталоге!');


- вообще перестает работать.
Если не тяжело, подскажите механизм проверки на дублирование перед записью Smile
Заранее большое спасибо!
# Пт Апр 06, 2012 6:04 pmdeBrain Зарег.: 03.06.2010 ; Сообщ.: 1569Ответить с цитатой
Сорри, тупой вопрос был. У тебя что там файл без структуры штоль?
# Пт Апр 06, 2012 6:08 pmdeBrain Зарег.: 03.06.2010 ; Сообщ.: 1569Ответить с цитатой
Код:
$fh = array_map('trim', $fh);
if (array_search($zapis, $fh) !== false)
die('Уже в каталоге!');


Какая-то запись странная. Можно же короче:

Код:
$fh = array_map('trim', $fh);
if (array_search($zapis, $fh)) die('Уже в каталоге!');


А что туда записывается-то?)
Может можно как-то без файла этого вообще?)
# Пт Апр 06, 2012 6:09 pmYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
deBrain, не, есть структура, вот такая:

Код:
http://memino.ru/img/memino.ru-1333723624.jpg|Я ТВОЙ HTTPD|УХО КУСАЛ|
http://memino.ru/img/memino.ru-1333723703.jpg|Я ТВОЙ WINDOWS|ВИНЛОКЕР СТАВИЛ!|
http://memino.ru/img/memino.ru-1333723965.jpg|ЗАПИЛИ МНЕ ЗУБ|БУДЬ МУЖИКОМ БЛЕАТ|



Нужно как-то проверять на существование уже существующей строки и если она есть - то не дописывать новую.
А то очень сильно грузит впску и постоянно дубли при просмотре отдельного мема.

deBrain, я в php нубяра, если не затруднит, подскажи, с меня много репы :thup:
Заранее большое спасибо!
# Пт Апр 06, 2012 6:12 pmYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
deBrain, не, вот сайт - http://memino.ru.
При создании нового мема - запись о нем записывается img.php в файл-базу, где хранятся все мемы (путь к картинке, первая и вторая строка текста).
# Пт Апр 06, 2012 6:15 pmdeBrain Зарег.: 03.06.2010 ; Сообщ.: 1569Ответить с цитатой
И ещё. $fh - это у тебя файл. А каким макаром ты делаешь $fh = array_map('trim', $fh);?
Вторым аргументом у array_map должен быть массив, а у тебя там в лучшем случае текст файла, т.е. string, а не array.
Может перед array_map следовало бы сделать какой-нибудь $fh = explode("\n", $fh);? Если у тебя там разделение строками.
# Пт Апр 06, 2012 6:19 pmdeBrain Зарег.: 03.06.2010 ; Сообщ.: 1569Ответить с цитатой
Т.е. если добавлять новый мем, то надо проверять в файле наличие строки из
Код:
...|Я ТВОЙ HTTPD|УХО КУСАЛ|
...|Я ТВОЙ WINDOWS|ВИНЛОКЕР СТАВИЛ!|
...|ЗАПИЛИ МНЕ ЗУБ|БУДЬ МУЖИКОМ БЛЕАТ|


?

Если так, то не структурированный файл это худшее (без обид), что можно было придумать для реализации этого функционала)
# Пт Апр 06, 2012 6:21 pmYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
deBrain, я не знаю Smile

Вот так сейчас попробовал:
Код:
$zapis = "http://memino.ru/img/".$filename."|".$overtext."|".$overtext2."|"."\r\n";
$fh = fopen("baza.txt", "a");
$fh = explode("\n", $fh);
$fh = array_map('trim', $fh);
if (array_search($zapis, $fh)) {die('Уже в каталоге!'); } else {
fwrite($fh, $zapis); }
fclose($fh);



Создание мема - работает, а вот в файл - не пишет. Но картинка генерится, показывается страница. А в базу - не пишется, проверил.
Вот этот момент бы решить - чтобы в базу писался и не писал, если дубль :thup:
# Пт Апр 06, 2012 6:23 pmYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
deBrain писал(а):
Т.е. если добавлять новый мем, то надо проверять в файле наличие строки из
Код:
...|Я ТВОЙ HTTPD|УХО КУСАЛ|
...|Я ТВОЙ WINDOWS|ВИНЛОКЕР СТАВИЛ!|
...|ЗАПИЛИ МНЕ ЗУБ|БУДЬ МУЖИКОМ БЛЕАТ|


?

Если так, то не структурированный файл это худшее (без обид), что можно было придумать для реализации этого функционала)


Не, именно целиком строку! Вместе с первым полем.

Там дело в чем - при генерации может выбираться один из сотен фонов. Даже если фразы одинаковые - фоны практически всегда разные.

То есть, по всей строке смотреть дубль нужно.

Вот таким образом - два разных файла, разные фоны, а фразы - одинаковые:



# Пт Апр 06, 2012 6:32 pmdeBrain Зарег.: 03.06.2010 ; Сообщ.: 1569Ответить с цитатой
Поготь, тебе надо не $fh = explode("\n", $fh); , а $fh = explode("\r\n", $fh);
Я что-то не заметил, что у тебя виндовский формат файла.

Объясню на пальцах почему реализация функционала таким методом как ты делаешь - плохая идея.
Ты читаешь файл, он весит, допустим 10 метров. Ладно, хрен с ним. Ты раздупляешь его на массив, что увеличивает размер занимаемой памяти как минимум вдвое (из-за особенностей хранения массивов в PHP), итого имеем 20+ метров. Тебе надо каждую строку раздуплить ещё по символу "|", чтобы можно было сравнивать 2 последние части с тем что мы хотим записать.
Итого имеем:

Код:
$fh = fopen("baza.txt", "a");
$fh = explode("\r\n", $fh);
$strs = array();
foreach ($fh as $v){
$strs[] = explode('|', $v);
}

foreach ($strs as $v){
if ($filename == $v[0] && $overtext == $v[1] && $overtext2 == $v[2]) die('already exists');
}



Как-то так, но у тебя этот скрипт будет жрать оперативы и ресурсов проца много...

Хотя если "То есть, по всей строке смотреть дубль нужно. ", то:

Код:
$fh = fopen("baza.txt", "a");
$fh = explode("\r\n", $fh);

foreach ($fh as $v){
if ($filename . '|' . $overtext . '|' . $overtext2 == $v) die('already exists');
}

# Пт Апр 06, 2012 7:00 pmYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
deBrain, не получается, вот так сделал:
Код:
$zapis = "http://memino.ru/img/".$filename."|".$overtext."|".$overtext2."|"."\r\n";
$fh = fopen("baza.txt", "a");
$fh = explode("\r\n", $fh);

foreach ($fh as $v){
if ($filename . '|' . $overtext . '|' . $overtext2 !== $v) { fwrite($fh, $zapis); } else {die('already exists');]
fclose($fh);


Он не пишет в базу новую запись (уникальную).

Никак не получается, пойду курить работу с массивами.
# Сб Апр 07, 2012 3:09 amYabuti Зарег.: 28.11.2008 ; Сообщ.: 16263Ответить с цитатой
Блин, вот я туплю:
Цитата:
http://memino.ru/img/memino.ru-1333756874.jpg|ЗАПИЛИ|МНЕ БЫСТРА БЛЕА|
http://memino.ru/img/memino.ru-1333756876.jpg|ЗАПИЛИ|МНЕ БЫСТРА БЛЕА|
http://memino.ru/img/memino.ru-1333756878.jpg|ЗАПИЛИ|МНЕ БЫСТРА БЛЕА|


При каждом обновлении - создается картинка с новым именем (стаб+текущее время). Конечно они все разные будут r5
Новая тема Написать ответ    ГЛАВНАЯ ~ ТЕХНИЧЕСКИЕ ВОПРОСЫ
 
Любое использование материалов, размещенных на ArmadaBoard.com, без разрешения владельцев ArmadaBoard.com запрещено.