ОсновноеRadiotalkПользовательское
Программирование
6   •   Посмотреть все темы

Вопросы из области php

 

20089
Dimitry @Dimitry
$k1=5;
$k2=4;
$r=rand($k1*-1,$k2);
if($r>0) echo "win2"; else echo "win1";

Что-то типо такого, но чтобы работать юолее точно с дробными придумай например % выигрыша, а не оценку, т.е. оуенка 5 это например 99% выигрыш)
Похоже на ставки футбольные чем то)

1555
Алексей @TheDark
Вопрос такой. PHP не может удалить cookies, если они добавлены пользователем.
Например, я, тестируя один из проектов на уязвимость в подмене cookies, пользуюсь расширением для браузера "EditThisCookie", в котором можно самостоятельно создать куку с нужными значениями для сайта
Я даю ей такое же имя, как и скрипт (например, user_id), но функция setcookie('user_id', ''); уже не может удалить ее (например, когда пользователь разлогинивается) и начинаются коллапсы (с куками, установленными скриптом такого нет).

Как быть? Как 100% удалить куку с нужным именем, даже если она создана подобным методом и с отличающимися параметрами (path, domain и т.д.)?

Отредактировано TheDark - 01.12.2016
20089
Dimitry @Dimitry
Как добавил так и удали, к пользователям это никак не относится)
Можно вообще отключить куки в браузере, и как их тогда добавить через PHP ???

1555
Алексей @TheDark
Dimitry, просто в этом серьезная проблема в безопасности. Кто-то может зайти на сайт, создать подобным образом левые куки и скрипт, обнаружив несоответствия, не сможет их удалить. Это плохо. Пытаюсь понять, как это исправить.

20089
Dimitry @Dimitry
В этом не может быть проблема в безопасности, ну просто вообще никак, так как в куках ненужно ничего делать что связано с безопасностью или опасностью))
Попробуй переубеди, а лучше сразу пример, где там у тебя возникает опасность)

1555
Алексей @TheDark
Dimitry, хорошо, приведу пример. Не совсем дело в безопасности, но коллапс заметный. Может подскажешь, как сделать иначе.

При заходе на сайт, специальная функция проверяет авторизован ли пользователь. Если в браузере установлены нужные куки, она их неким образом проверяет и пускает на сайт. Если пользователь вышел (/?action=logout), то запускается функция logout(), которая стирает куки и в конце редиректит на главную. Если все процессы естественные, то все ок.

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

Вот что делать? Процесс ведь самый обычный.

Отредактировано TheDark - 02.12.2016
20089
Dimitry @Dimitry
И перезаписать ты эту куку тоже не можешь?, выстави новую куку logout=1, при авторизации дополнительно ставь на 0.
Также можно в сессии юзера выставлять этот флаг, и пофиг потом на то какие куки у него, стоит там logout=1 значит всё.
Процесс может и обычный, но править куки в ручную это хакерство, так пусть редиректит этого хакера до посинения и потом заблочит фаервол.
Справедливо)

Ещё после разлогина редиректят на страницу с ?logout=1 и проверяя наличие этого GET можно больше не редиректить.
В целом все авторедиректы это то ещё зло...
Как видишь решений много, но я бы ничего их этого не делал просто исходя из того что править куки в ручную не надо)

1555
Алексей @TheDark
Я нашел решение.
У меня cookies устанавливается с дополнительными параметрами path и domain. И удалял я их с этими параметрами. А вот при установке вручную эти параметры не устанавливались. И не попадали под "шаблон" удаления.

Поэтому каждая кука теперь удаляется дважды:
setcookie('name', '', time() - 3600, $path, $domain);
setcookie('name', '');

Теперь если вручную создать куки с параметрами или без они все равно удалятся. И все стало ок.

И спасибо за советы.

Отредактировано TheDark - 02.12.2016
1555
Алексей @TheDark
Задача такая. Мне нужно хранить в БД некие индивидуальные для каждого пользователя данные в зашифрованном виде, которые потом, имея ключ можно расшифровать. Я уже написал класс для работы с mcrypt, все ок (шифр открывается тем же ключем, что и шифруется).

Но вопрос о практике. Что для каждого конкретного пользователя может выступать ключем, а главное - где его хранить? Мне кажется глупо хранить ключ в БД, ведь какой тогда смысл?! С другой стороны, вводить пользователю каждый раз ключ, чтобы получить доступ - еще более глупо.

Как делают обычно? Мб какой-то .dat файл или что-то в этом роде? В сети очень немного информации о практической стороне вопроса. Дим, может ты сталкивался с таким?

Отредактировано TheDark - 18.12.2016
20089
Dimitry @Dimitry
Главное понять зачем это надо, и потом от этого плясать.

1555
Алексей @TheDark
Dimitry, хороший ответ, очень высокотехнологичное решение) Я знаю, что мне это нужно, куда плясать?

20089
Dimitry @Dimitry
Ну я лично только пароли шифровал и базы данных на мпчате, без каких либо файлов, механизм разшифровки пхп фунцией.
А так как не понятно что ты делаешь, сложно что-то подсказывать, задача поверхностная.

1555
Алексей @TheDark
Вопрос по mod rewrite. Создал правило типа
RewriteRule ^alias$ /file.php [L]
теперь один и тот же документ доступен по двум адресам: /alias и /file.php

Можно как-то сделать 404 при обращении к /file.php ну или хотя бы редирект на /alias?

327
Геннадий @mychatik
TheDark пишет:

Создал правило типа
RewriteRule ^alias$ /file.php [L]
теперь один и тот же документ доступен по двум адресам: /alias и /file.php

Ну это типа переименования файла. Применяется для "укорачивания" длинных названий файлов в ссылках.
Но в плане СЕО - делать так нежелательно. Поисковикам не нравится дублированный контент.
Из-за "дублей" из поиска могут выпасть нужные страницы.

TheDark пишет:

Можно как-то сделать 404 при обращении к /file.php ну или хотя бы редирект на /alias?

404 также делать нежелательно для поисковиков.
А редирект - без вопросов:

В .htaccess достаточно строки вида:
Redirect /old_directory/old_file.html **********
если нужно редиректить все содержимое подкаталога:
Redirect /old_directory **********
редирект для всего сайта:
RewriteEngine On
RewriteRule (.*) **********

Отредактировано mychatik - 04.01.2017
1555
Алексей @TheDark
mychatik, какой-то бред несете. Старайтесь не участвовать в темах, в которых не смыслите.

327
Геннадий @mychatik
TheDark пишет:

mychatik, какой-то бред несете. Старайтесь не участвовать в темах, в которых не смыслите.

Я дал конкретный ответ на конкретно поставленный вопрос.
Если он Вас чем-то конкретно не устраивает, скажите.

Да, я не претендую на звание "Знатока" и сам многого не знаю - учу программирование самостоятельно.
Но в силу того, что знаю, пытаюсь помочь тем, кто этого хочет и сам учусь у тех, кто знает больше.

И мне вот интересно, в чём именно заключается "бред"?

В том, что дубли страниц засоряют сайт и поисковики выбрасывают их из поиска?
Что, к примеру, бот обойдёт 400 страниц - а в выдачу попадёт всего 300 из-за дублированного контента.
И, если бы не дубли, бот прошёл бы по всем 400 уникальным и все их дал бы в выдачу.
Так это не бред, а одно из правил СЕО.

Может бред в том, что ошибка 404, как минимум, может безвозвратно вывести посетителя с сайта?
А, если страница сообщает об ошибке и при этом выдает код 200 OK (что происходит из-за неправильной настройки сервера), то она будет проиндексирована и попадёт в поиск, вместо нужных страниц.
А, если таких ошибок на сайте накопится много (будут перемещены, удалены или переименованы файлы и т.д.), то опять таки повлияет на количество "мусора" - дублей страниц на сайте.

Конечно, если на сайте всего 10 страниц и одна из них - дубль, то тогда это всё вышесказанное - действительно бред.
Это бред и для тех, кому плевать на рейтинги поисковиков для своего сайта.
Но тему могут прочитать другие, которые решат таким образом переименовать все 1000 страниц своего сайта.

Или "бред" в правилах редиректа, через .htaccess?

Если не годится редирект - тогда только так:
<Files file.php>
order allow,deny
deny from all
</Files>

И получите свою желаемую ошибку 404 (вернее - 403) 😀
Но, конечно, так делать нельзя. Иначе файл будет недоступен.
Ведь файл ********** никуда не делся из директории. А правилом Вы прописали обращение к нему ещё и по адресу **********.
Поэтому, заблокировать /file.php нельзя, так как он продолжает использоваться.
Возможен только вариант редиректа на /alias, при обращении к /file.php.

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

И вот не поленился - погуглил, что пишут учебники о том, что Вы сделали у себя (может кому будет интересно):

Создание красивых URL.

Несомненно, что из этих двух ссылок первая выглядит намного привлекательнее.

**********

**********

С помощью файла .htaccess и apache модуля, который называется mod_rewrite, вы сможете переделать свои ссылки на более красивые и короткие.

Вот некоторые примеры с кодом:
RewriteEngine on

RewriteRule ^about/$ /pages/about.html [L]

RewriteRule ^features/$ /features.php [L]

RewriteRule ^buy/$ /buy.html [L]

RewriteRule ^contact/$ /pages/contact.htm [L]

Отредактировано mychatik - 06.01.2017
1555
Алексей @TheDark
mychatik, оххх, ты вместо того, чтобы незаметно слиться с темы, настрочил полотно из всего, что знал (а скорее накопипастил со справочников).
И своей тучей текста ни разу не ответил на вопрос (конкретно ни разу).

Ну это типа переименования файла.

Блеск. Для справки: mod_rewrite лишь меняет (интерпретирует) url и никак не затрагивает имя файла.

Применяется для "укорачивания" длинных названий файлов в ссылках.

mod_rewrite ВНЕЗАПНО чаще всего удлиняет url, а не укорачивает его, но делает его понятным. Пример: /post.php?id=1 и /post/lorem_ipsum_sit_dolor_amet

Но в плане СЕО - делать так нежелательно.

Еще одна жемчужина. Как раз таки в плане сео это очень даже желательно. Адрес /about намного привлекательнее для поисковиков, чем /page.php?id=2

А вот насчет дублей я и спрашивал. Но ответ на мой конкретный (понравилось мне это твое выделение) случай ты не дал.
Вот нахрен мне пример редиректа для всего сайта? Или для содержимого подкаталога? Или со старого файла на новый?

Если бы ты не поленился и проверил (ну на крайняк почитал бы), то знал бы, что:
если установлено правило
RewriteRule ^alias$ /file.php [L]
то код
Redirect /file.php /alias
приведет к бесконечному редиректу.

Просто для справки. Ты ж так много знаешь про сео. Тогда нужно знать, что при редиректе со старого файла на новый нужно использовать 301 редирект:
Redirect 301 /old.html /new.html
Поэтому бред. Дальше.

<Files file.php>
order allow,deny
deny from all
</Files>

Каким боком этот код к описываемой проблеме? Просто так блеснуть всем, что знал? Это вообще из другой области задач.

Но, конечно, так делать нельзя. Иначе файл будет недоступен.

Спасибо, кэп.

Возможен только вариант редиректа на /alias, при обращении к /file.php

И снова спасибо. Я это знал, еще в первом посте по теме. Нутк где какой-нибудь рабочий вариант? Или ты только по полотнам невнятного текста спец?

Создание красивых URL

Даже пример есть. 5 баллов вообще. Зачем ты привел эту кучу кода, если я с него и начал?

Словом, иди лесом и не засоряй своими ответами тему.

Отредактировано TheDark - 07.01.2017
1555
Алексей @TheDark
Вопрос по ajax/json.
Сервер отвечает (показывая валидный json) таким образом:
header("Content-Type: application/json; charset=UTF-8");
echo $response;

но функция jQuery.parseJSON(data) возвращает ошибку. если сделать alert(data), то увижу - [object Object]
Однако, если убрать заголовок (header("Content-Type: application/json; charset=UTF-8")), то все становится ок.

Как это исправить? Я думал, что лучше всего с помощью заголовка однозначно указать тип данных. Даже в самом скрипте указал dataType: 'json', но все равно ошибка.

Отредактировано TheDark - 26.10.2017
8497
1555
Алексей @TheDark
Trilby, я либо не понял, либо там нет ответа на вопрос. У человека там невалидный json был, добавил кавычки и все стало ок.
У него запрос не проходил вообще (вызывался error), у меня проходит (success), но не читабельный ответ.
json у меня правильный (потому что json_encode), но при соответствующем заголовке (без него все ок) он не парсится функцией jQuery.parseJSON().
Мб это баг в jquery или я что-то не так делаю?

Консоль:
Uncaught SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
... и т.д.

upd. с заголовком стало работать только если в запросе поставить dataType: 'text'
хз чего я заморочился с этим, просто не нравится, когда чего-то не понимаю

Отредактировано TheDark - 26.10.2017