什么是“?”在URL中使用的符号在PHP?


10

我是PHP新手。在学习PHP语言的路径,我注意到,一些网站将这种URL的:

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

我的问题:

  1. 什么是“?”符号用于?

  2. 如果我是开发一个PHP网站,我必须使用它在我的网址?例如,在用户(roa3)成功登录后,我将重定向到“www.website.com/profile.php?user=roa3”而不是“www.website.com/profile.php”

  3. 使用它的优点和缺点是什么?

21

好的问题,简单地说,

  1. “?”代表开始查询 字符串,其中包含要传送到服务器的数据为 。在这种情况下 您正将用户= roa3传递到 profile.php页面。您可以使用 profile.php中的$ _GET ['user']获取 数据。查询字符串是从客户端代理发送数据到服务器的方法之一。另一个将数据放在HTTP正文和POST到服务器,你没有直接从浏览器看到HTTP POST数据。

  2. 查询字符串可由用户编辑 并且它对公众可见。如果 www.website.com/profile.php?user=roa3 是打算公开的,那么它是 罚款,否则您可能需要使用 会话获取当前用户的 上下文。

  3. 它是将数据传递到 服务器灵活的方式,但它是可见的, 可编辑的用户,对于一些 敏感数据,附着至少 它的查询字符串之前产生 某种散列,这可以防止 用户编辑它或理解 它的含义。但是这 并不妨碍一个体面的黑客 做你的网站 错误。不同的浏览器支持不同的URL最大长度,冗长的URL由这些查询字符串参数组成。如果您想发送大量数据,请将数据放入HTTP正文并POST到服务器。


0

从服务器的角度来看,只是另一个角色。 PHP提供了简单的URL部分方法,字符,例如对于“/profile.php?user=roa3”,PHP将设置$ _GET ['user'] ='roa3'。

原因?在URL中非常有用的是,浏览器可以使用表单构建动态URL - 在上面的例子中,我希望URL是由带有字段“user”的HTTP表单构建的,用户输入“roa3”。

  0

这是错误的。 “?”不是服务器的“另一个角色”。服务器将“?”上的URL分开(如果有的话)。前面的部分是请求的文件,后面的部分是“查询字符串”,作为QUERY_STRING环境变量呈现给CGI。 22 2月. 092009-02-22 07:14:31

+1

我应该说,一般*的服务器*不应该专门处理它。在PHP(以及大多数其他Web框架)的情况下,提供了一些处理,因为我继续讨论。这个问题没有在任何地方指定CGI。 22 2月. 092009-02-22 07:46:21

+1

服务器可能不是特殊的,但它是HTTP标准的一部分,而不是PHP。 22 2月. 092009-02-22 08:34:06

  0

固执地坚持我的枪在这里:-)只有一个有效的区别?在RFC21616,S13.9中:“除非服务器提供明确的到期时间,否则缓存不能将对[查询URI]的响应视为新鲜事物。”这似乎很不相关。 22 2月. 092009-02-22 09:20:46

+1

好吧,对于一个基本正确的答案(有一个小小的警告),四个downvotes肯定是过度的,标记它的冒犯纯粹是......好吧,冒犯! 22 2月. 092009-02-22 10:59:14


0
  1. “?“用于分隔URL和参数,例如,它就像http://www.url.com/resourcepath?a=b&c=d,在这种情况下,a = b就像request_parameter = request_value

  2. Ya,不建议使用大部分参数,因为总数url的大小是有限的,它就像GET请求,其中所有参数都显示在url上,用户可以修改它。在你的示例中,说出如果用户修改url为“user = techmaddy”。

  3. 优点是它可以用于GET类请求。缺点是安全性低,体积受限。


4

1)如果用户登录到你的网站,你会用Sessions,而不是存储其传递的URL如profile.php?username=roa3

2)使用在?符号的存在的用户名Search Engine Optimization通常被认为是不好的。另外,这些网址看起来有点难看。使用mod_rewrite,您可以执行与profile.php?user=roa3products.php?id=123&category=toys相同的操作:site.com/profile/roa3products/toys/123

使用CodeIgniter框架默认会为您提供友好的网址,并且不需要在您的网址中使用?。以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请求甚至可以被旅途中的服务器缓存。因此,任何人只需用手打字信息冒充您的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变量

    • Session变量存储在服务器上。会话标识被传递给用户,并且每次用户发出另一个请求时,此会话标识都会被传回服务器。然后可以使用此会话标识来获取已存储的会话变量。所以你可以存储一个用户喜欢的颜色,他们的名字和IP地址等等,但是你可以把它存储在服务器上而不是用户的家用PC上。
      会话ID可以被模拟,所以最好检查用户的IP,或者将它们包装在安全连接中。例如https。
    • 会话变量不能被拦截请求的人改变。
  • COOKIE变量:
    类似于会话变量,除了它们存储在用户的PC,而不是服务器上。它们存储在一个域中,当它们进入该域时,它们将请求头中的变量重新提交给服务器。这意味着用户可以更改和破解变量,或者其他人可以。

要访问PHP这些变量可以使用:

  • $x = $_GET['user']为得到可变
  • $x = $_POST['user]
  • $x = $_REQUEST['user'] - GET,POST和Cookie变量
  • $x = $_COOKIE['user']的组合 - Cookie变量
  • $x = $_SESSION['user']访问会话变量

够简单的东西(user可以和你正在使用的变量的名称来代替),但重要的是要知道他们实际上做。

+1

如果人们坐在具有多个IP地址的代理服务器场后面,检查针对IP的会话ID并不是那么好。而且,共享一个代理的人仍然不会被另一个代理人屏蔽。应用程序必须以另一种方式处理此问题 - 如果您处理敏感数据:使用https。 22 2月. 092009-02-22 08:22:07

  0

是的,这是真的。检查IP会话会增加安全性,但会留下一些大的漏洞。在https建立之后建立会话始终是最安全的。 22 2月. 092009-02-22 09:41:42

  0

只是一个旁注:使用';'分隔GET变量也是合法的。虽然我从来没有见过它,因此不会推荐它。 06 5月. 102010-05-06 07:35:19


6

到目前为止,我所见过的大部分答案都是以PHP的形式出现的,但实际上这并不是语言特定的。到目前为止给出的答案都是从PHP的角度出发的,用来访问信息的方法因语言的不同而不同,但数据在URL中的格式(称为查询字符串)仍将保留相同(例如:page.ext?key1 =值& key2 =值& ...)。

我不知道你的技术背景或知识,所以请原谅我...

有一个网页,以提供数据返回给Web服务器的两种不同的方法。这些被称为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安全,但我们不是为了这个。如果你想知道更多的线,那么这是另一个问题。

希望这可以帮助,并随时提出任何问题。

+1

您也可以使用$ _COOKIE访问cookie信息。 22 2月. 092009-02-22 11:22:23


1

?是HTTP标准的一部分,而不是PHP的一部分。以为我应该指出这一点,所以当你移动到另一种语言并再次看到它时,你并不感到困惑,认为有PHP参与。

否则上面有一些优秀的答案。