是什么 ”?”用于php的URL中的符号?

时间:2009-02-22 07:00:34

标签: php url

我是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”

    < / LI>
  3. 使用它的优点和缺点是什么?

7 个答案:

答案 0 :(得分:22)

简短的问题,

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

  2. 查询字符串可由用户编辑 它对公众可见。如果 www.website.com/profile.php?user=roa3 本来是公开的 很好,否则你可能想用 获取当前用户的会话 上下文。

  3. 这是一种灵活的数据传递方式 服务器,但它是可见的 一些人可以编辑给用户 敏感数据,至少产生 在附加之前的某种哈希 它到了查询字符串,这可以防止 用户编辑或理解 它的意义。不过这个 并不妨碍一个体面的黑客 做错了什么 网站。不同的浏览器支持不同的URL最大长度,冗长的URL由这些查询字符串参数组成。如果要发送大量数据,请将数据放在HTTP正文中并POST到服务器。

答案 1 :(得分:6)

到目前为止,我看到的大多数答案都是用PHP来实现的,而实际上这并不是特定于语言的。到目前为止给出的答案来自PHP的观点,您将用于访问信息的方法因语言而异,但数据在URL中的格式(称为查询字符串)将保留相同(例如:page.ext?key1 = value&amp; key2 = value&amp; ...)。

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

网页有两种不同的方法可以将数据提供回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 ['keyname'],仅从POST方法中获取信息
  • $ _ GET ['keyname'],仅从GET方法中获取信息
  • $ _ REQUEST ['keyname'],允许您获取可能已提交的POST,GET和任何COOKIE信息。一种捕获的排序,特别是在您不知道页面可能用于提交数据的方法的情况下。

直接使用$ _REQUEST方法不要马虎。除非你有一个像我上面提到的$ _REQUEST变量的情况,否则不要使用它。在安全性方面,你想尝试使用'拒绝所有,并且只允许x,y,z'方法。只查找您知道自己的网站将要发送的数据,只查找您期望的组合,并在使用之前清除所有信息。例如..

  • 永远不要对通过上述方法传递的任何内容执行eval()。我从来没有见过这样做,但这并不意味着人们没有尝试或做过。
  • 切勿直接在数据库中使用这些信息而不进行清理(如果您不熟悉SQL注入攻击的研究)

到目前为止,这并不是PHP安全的最终结果,但我们并不是为此而存在的。如果你想了解更多信息,那么那就是SO的另一个问题。

希望这有帮助并随意提出任何问题。

答案 2 :(得分:4)

1)如果用户登录您的网站,您可以使用Sessions存储用户名,而不是将其传递到网址中,例如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 :(得分:3)

“?”表示要遵循一些GET变量。您的示例使用名为“user”的变量,并指定一个名为“roa3”的变量。

使用GET变量的优点:

  • 可以将其标记为网址的一部分

缺点

  • 他们是公开的..任何人都可以拦截并查看此信息。这些URL请求甚至可以在旅程中由服务器缓存。所以任何人都可以通过手工输入信息来冒充你的roa3用户......他们也可以将roa3更改为其他用户并冒充他们..

您还可以使用“&amp;”符号分隔许多变量,例如: www.website.com/profile.php?user=roa3&fav_colour=blue

其他选择:

  • POST变量

    • 您可以通过POST变量发送变量。这些变量在请求的标头中传递,而不是请求的URL。它们不是立即显而易见的,并且不会被旅行中的服务器缓存,但它们仍然可以被阅读。除非你建立了HTTPS连接。
    • 表单中的变量可以通过POST或GET方法发送。您可以在表单的“方法”中指定它。 <form action="index.php" method='post'/>
  • SESSION变量

    • 会话变量存储在服务器上。会话ID将传递给用户,并且每次用户发出另一个请求时,此会话ID将传递回服务器。然后,此会话ID可用于获取存储的会话变量。因此,您可以存储用户最喜欢的颜色,名称和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可以替换为您正在使用的变量的名称)

简单的东西,但知道他们实际做了什么很重要。

答案 4 :(得分:1)

?是HTTP标准的一部分,而不是PHP的一部分。以为我应该指出这一点,所以当你转向另一种语言并再次看到它时,你不会因为涉及PHP而感到困惑。

否则上面有一些很好的答案。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

  2. Ya,不建议使用大部分参数,因为总网址大小有限,就像GET请求一样,所有参数都显示在网址上,用户可以对其进行修改。在您的示例中,说明如果用户将网址修改为“user = techmaddy”,该怎么办。

  3. 优点是它可以用于GET类型的请求。缺点是安全性低,尺寸有限。