Что "?" символ в URL используется для в PHP? - PullRequest
10 голосов
/ 22 февраля 2009

Я новичок в PHP. На пути изучения языка PHP я заметил, что на некоторых веб-сайтах такой URL будет:

www.website.com / profile.php? Пользователь = roa3 & ...

Мои вопросы:

  1. Что такое "?" символ используется для?

  2. Если бы я разрабатывал php-сайт, должен ли я использовать его в своем URL? Например, после успешного входа пользователя (roa3) я буду перенаправлять на «www.website.com/profile.php?user=roa3» вместо «www.website.com/profile.php"

    *1014». *
  3. Каковы преимущества и недостатки его использования?

Ответы [ 7 ]

22 голосов
/ 22 февраля 2009

Хорошие вопросы, кратко,

  1. "?" обозначает начало запроса строка, которая содержит данные для перешел на сервер. в этом случае вы передаете user = roa3 страница profile.php. Вы можете получить данные с помощью $ _GET ['user'] в profile.php. Строка запроса - это один из методов отправки данных на сервер от агента клиента. Другой помещает данные в теле HTTP и POST на сервер, вы не видите данные HTTP POST непосредственно из браузера.

  2. строка запроса может быть отредактирована пользователем и это видно публике. Если www.website.com/profile.php?user=roa3 предназначен для общественности, то это хорошо, в противном случае вы можете использовать сеанс для получения текущего пользователя контекст.

  3. это гибкий способ передачи данных в сервер, но это видно и редактируемый для пользователей, для некоторых конфиденциальные данные, по крайней мере, производить какой-то хэш перед прикреплением это к строке запроса, это предотвращает пользователи редактировать или понимание смысл этого. Однако это не мешает достойному хакеру сделать что-то не так с вашим Веб-сайт. Различные браузеры поддерживают разную максимальную длину URL, длинный URL-адрес состоит из этих параметров строки запроса. Если вы хотите отправить большой объем данных, поместите данные в теле HTTP и POST на сервер.

6 голосов
/ 22 февраля 2009

Большинство ответов, которые я видел до сих пор, касались PHP, хотя в действительности это не зависит от языка. Ответы, которые были даны до сих пор, были с точки зрения PHP, и методы, которые вы использовали бы для доступа к информации, отличаются от языка к языку, но формат, в котором данные находятся в URL (известный как строка запроса), останется. то же самое (например: page.ext? key1 = значение & key2 = значение & ...).

Я не знаю ваших технических знаний или знаний, поэтому, пожалуйста, прости меня ...

Существует два разных способа для веб-страницы предоставить данные обратно на веб-сервер. Они известны как методы POST или GET. Также есть множество других, но ни один из них не должен использоваться в веб-дизайне любого типа при работе с обычным пользователем. Метод POST незаметно отправляется на сервер и предназначен для «загрузки» данных, тогда как метод GET виден пользователю как строка запроса в URL-адресе и предназначен только для буквального «получения» информации.

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

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

http://www.cs.tut.fi/~jkorpela/forms/methods.html http://weblogs.asp.net/mschwarz/archive/2006/12/04/post-vs-get.aspx http://en.wikipedia.org/wiki/Query_string

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

  • $ _ POST ['keyname'], чтобы получить только информацию из метода POST
  • $ _ GET ['keyname'], чтобы получить только информацию из метода GET
  • $ _ REQUEST ['keyname'], чтобы позволить вам получить POST, GET и любую информацию COOKIE, которая могла быть отправлена. В некотором роде, особенно в тех случаях, когда вы не знаете, какой метод может использовать страница для отправки данных.

Не будьте неряшливы, перейдя непосредственно к методу $ _REQUEST. Если у вас нет случая, подобного тому, который я упоминал выше для переменной $ _REQUEST, то не используйте его. Вы хотите попробовать использовать подход «запретить все и разрешать только x, y, z», когда речь идет о безопасности. Ищите только те данные, которые, как вы знаете, будет отправлять ваш собственный сайт, ищите только те комбинации, которые вы ожидаете, и очищайте всю информацию, прежде чем использовать ее. Например ..

  • Никогда не делайте eval () для чего-либо, переданного вышеупомянутыми методами. Я никогда не видел, чтобы это было сделано, но это не значит, что люди не пробовали или не делают.
  • Никогда не используйте информацию напрямую с базами данных, не очистив их (исследуйте атаки с использованием SQL-инъекций, если вы не знакомы с ними)

Это далеко не все, что касается безопасности PHP, но мы здесь не для этого. Если вы хотите узнать больше по ходу дела, тогда это еще один вопрос для SO.

Надеюсь, это поможет, и не стесняйтесь задавать любые вопросы.

4 голосов
/ 22 февраля 2009

1) Если пользователь заходит на ваш сайт, вы бы использовали Сеансы для сохранения имени пользователя вместо передачи его в URL, например, profile.php?username=roa3

.

2) Использование символа ? в URL обычно считается плохим для Search Engine Optimization. Кроме того, URL выглядят немного некрасиво. Используя mod_rewrite , вы можете сделать то же самое, что и profile.php?user=roa3 или products.php?id=123&category=toys с: site.com/profile/roa3 или products/toys/123.

Использование CodeIgniter Framework предоставит вам дружественные URL-адреса по умолчанию и устранит необходимость в ? s в ваших URL-адресах. См. эту страницу для примера.

3) Символ ? также используется внутри кода страницы php. Например, блок if else, такой как:

if ($x==1)
   $y=2;
else
   $y=3;

также можно записать как:

$y=($x==1) ? 2 : 3;
3 голосов
/ 22 февраля 2009

"?" означает, что некоторые переменные GET должны следовать. В вашем примере используется переменная с именем «user» и присваивается переменная с именем «roa3».

Преимущества использования переменных GET:

  • они могут быть добавлены в закладки как часть URL

Недостатки

  • они общедоступны. Любой может перехватить и просмотреть эту информацию. Эти URL-запросы даже кэшируются серверами на протяжении всего пути. Таким образом, любой может выдать себя за вашего пользователя roa3, просто набрав эту информацию вручную ... также он может изменить roa3 на другого пользователя и выдать себя за него ..

Вы также можете использовать символ «&» для разделения многих переменных, например: www.website.com/profile.php?user=roa3&fav_colour=blue

Другие опции:

  • POST-переменные

    • Вы можете отправлять свои переменные через переменные POST. Эти переменные передаются в заголовке запроса, а не в URL запроса. они не сразу очевидны и не кэшируются серверами в пути, но их все же можно прочитать. если у вас не установлено соединение HTTPS.
    • переменные в форме могут быть отправлены методами POST или GET. Вы указываете это в «методе» формы. <form action="index.php" method='post'/>
  • переменные SESSION

    • Переменные сеанса хранятся на сервере. Идентификатор сеанса передается пользователю, и этот идентификатор сеанса передается обратно на сервер каждый раз, когда пользователь делает другой запрос. Этот идентификатор сеанса может затем использоваться для получения переменных сеанса, которые были сохранены. Таким образом, вы можете хранить любимый цвет пользователя, его имя, IP-адрес и т. Д., Но вы можете хранить его на сервере, а не на домашнем ПК пользователя.
      Идентификаторы сеансов можно олицетворять, поэтому рекомендуется проверять IP-адреса пользователя и / или оборачивать их в безопасное соединение. например, https.
    • переменные сеанса не могут быть изменены кем-то, кто перехватил запрос.
  • Переменная COOKIE:
    Аналогично переменным сеанса, за исключением того, что они хранятся на ПК пользователя, а не на сервере. Они хранятся в домене, и когда они переходят в этот домен, они повторно отправляют переменные в заголовке запроса на сервер ... это означает, что пользователь может изменить и взломать переменные, или кто-то другой может.

Для доступа к этим переменным в php вы можете использовать:

  • $x = $_GET['user'] для переменной get
  • $x = $_POST['user]
  • $x = $_REQUEST['user'] - комбинация переменных get, post и cookie
  • $x = $_COOKIE['user'] - переменные cookie
  • $x = $_SESSION['user'] для доступа к переменным сеанса

(user может быть заменено именем используемой вами переменной)

Достаточно простые вещи, но важно знать, что они на самом деле делают.

1 голос
/ 22 февраля 2009

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

В противном случае есть отличные ответы выше.

0 голосов
/ 22 февраля 2009
  1. "?" используется для разделения URL и параметров. Например, это похоже на http://www.url.com/resourcepath?a=b&c=d. В этом случае a = b похоже на request_parameter = request_value.

  2. Да, не рекомендуется использовать большую часть параметров, потому что общий размер URL-адреса ограничен, и это похоже на запрос GET, где все параметры отображаются в URL-адресе, и пользователь может изменить его. В вашем примере скажите, что если пользователь изменит URL на «user = techmaddy».

  3. Преимущество в том, что его можно использовать для запросов типа GET. Недостатком является низкая безопасность, ограничение по размеру.

0 голосов
/ 22 февраля 2009

С точки зрения сервера,? это просто другой персонаж. PHP предоставляет простые методы для частей URL после? характер, например для "/profile.php?user=roa3" PHP установит $ _GET ['user'] = 'roa3'.

причина? Полезно в URL-адресах то, что браузеры могут создавать динамические URL-адреса с использованием форм - в приведенном выше случае я ожидаю, что URL-адрес был создан HTTP-формой с полем «пользователь», в которое пользователь-пользователь набрал «roa3».

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