Что такое "?" символ в URL, который используется в php?


10

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

www.website.com/profile.php?user=roa3 & ...

Мои вопросы:

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

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

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

21

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

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

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

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


0

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

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

  0

Это неправильно. «?«не является« просто другим символом »для сервера. Сервер разбивает URL-адрес на«? »(если таковой имеется). Часть before - это запрошенный файл, а часть после -« строка запроса », представленная CGI как переменная окружения QUERY_STRING. 22 фев. 092009-02-22 07:14:31

+1

Я, вероятно, должен был сказать, что серверы * в целом *, как ожидается, не будут рассматривать его специально. В случае PHP (и большинства других веб-фреймворков) предоставляется некоторая обработка, поскольку я продолжал обсуждать. Вопрос не указывает CGI где-нибудь. 22 фев. 092009-02-22 07:46:21

+1

Это может быть не особо для сервера, но это часть стандарта HTTP, а не php. 22 фев. 092009-02-22 08:34:06

  0

Упрямо придерживаюсь моих орудий здесь :-) Есть только одно эффективное различие? в RFC21616, S13.9: «кэши не должны обрабатывать ответы на [URI запросов] как свежие, если только сервер не предоставляет явное время истечения срока действия». Это вряд ли имеет значение. 22 фев. 092009-02-22 09:20:46

+1

Итак, четыре downvotes для принципиально правильного answe r (с одним небольшим оговором), безусловно, чрезмерен и означает, что это оскорбительно чисто ... ну, оскорбительно! 22 фев. 092009-02-22 10:59:14


0
  1. «?"Используется, чтобы отделить URL и параметры. Для, например, это как http://www.url.com/resourcepath?a=b&c=d. В этом случае а = Ь, как request_parameter = request_value.

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

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


4

1) Если пользователь входит в ваш сайт, вы будете использовать Sessions хранить там имя пользователя вместо того, чтобы передать его в 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 по умолчанию даст вам дружественные URL-адреса и устранит необходимость в ? s в ваших URL-адресах. См., Например, this page.

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

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

также может быть записан в виде: "?"

$y=($x==1) ? 2 : 3; 

3

означает, что некоторые 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'] для получения переменной
  • $x = $_POST['user]
  • $x = $_REQUEST['user'] - сочетание GET, POST и печенье переменных
  • $x = $_COOKIE['user'] - переменные печенья
  • $x = $_SESSION['user'], чтобы получить доступ к переменные сессии

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

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

+1

Проверка идентификаторов сеансов против IP-адресов не так уж полезна, если люди сидят за фермой-прокси с несколькими IP-адресами. Кроме того, те, кто использует один прокси-сервер, все равно не будут защищены от другого. Приложение должно обрабатывать это по-другому - если вы имеете дело с конфиденциальными данными: используйте https. 22 фев. 092009-02-22 08:22:07

  0

да, это правда. Проверка ip против сеансов обеспечит повышенную безопасность, но это оставит некоторые большие дыры. Установление сеанса после того, как https было установлено, всегда является самым безопасным. 22 фев. 092009-02-22 09:41:42

  0

Просто боковое: законно использовать ';' для разделения GET-варов. Хотя я никогда его не видел и поэтому не рекомендую. 06 май. 102010-05-06 07:35:19


6

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

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

Есть два различных метода для веб-страницы, чтобы предоставить данные обратно на веб-сервер. Они известны как методы 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 [ «имя_раздела»], чтобы захватить только информацию из метода POST
  • $ _GET [ «имя_раздела»], чтобы захватить только информацию от GET метод
  • $ _REQUEST ['keyname'], чтобы вы могли получать POST, GET и любую информацию COOKIE, которая могла быть отправлена. Сортировка, особенно в тех случаях, когда вы не знаете, какой метод может использовать страница для отправки данных.

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

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

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

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

+1

Вы также можете получить доступ к информации о файлах cookie с помощью $ _COOKIE. 22 фев. 092009-02-22 11:22:23


1

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

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