我刚开始学习PHP。在学习PHP语言的过程中,我注意到一些网站会使用这种URL:
www.website.com/profile.php?user=roa3&...
我的问题:
"?"符号用于什么目的?
如果我要开发一个PHP网站,必须在我的URL中使用它吗?例如,当用户(roa3)成功登录后,我将重定向到“www.website.com/profile.php?user=roa3”,而不是“www.website.com/profile.php”。
使用它有哪些优缺点?
简而言之,好问题:
"?"代表查询字符串(query string)的起点,包含要传递给服务器的数据。在这种情况下,您正在向profile.php页面传递user=roa3。您可以通过在profile.php中使用$_GET['user']来获取数据。查询字符串是将数据从客户端代理发送到服务器的方法之一。另一个方法是将数据放入HTTP正文并POST到服务器,您无法直接从浏览器查看HTTP POST数据。
查询字符串可以被用户编辑,并且对公众可见。如果www.website.com/profile.php?user=roa3旨在成为公开的,则可以使用会话(session)来获取当前用户的上下文信息。
它是将数据传递给服务器的一种灵活方式,但用户可以看到和编辑该数据。对于某些敏感数据,至少在将其附加到查询字符串之前生成某种哈希值,以防止用户编辑或理解其含义。但是,这不能阻止一个优秀的黑客对你的网站做出错误操作。不同的浏览器支持不同的URL最大长度,长度较长的URL由这些查询字符串参数组成。如果要发送大量数据,请将数据放入HTTP正文并POST到服务器。
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角度来看,现在有三种不同的数组可以用来获取网页发送回服务器的信息。您可以使用以下内容:
不要直接使用$_REQUEST方法。除非您像上面提到的那样有一个$_REQUEST变量的情况,否则不要使用它。在安全性方面,您想尝试使用“拒绝所有,只允许x,y,z”的方法。仅查找您知道自己网站将发送的数据,仅查找您期望的组合,并在使用之前清理所有信息。例如...
这远非PHP安全的全部,但我们不在这里讨论这个。如果您想了解更多相关内容,请另外提问。
希望这有所帮助,如有任何问题,请随时提问。
1) 如果用户登录您的网站,您应使用Sessions存储他们的用户名,而不是通过url传递它,例如profile.php?username=roa3
2) 在网址中使用?
符号通常被认为对于搜索引擎优化不利。此外,网址看起来有点丑陋。使用mod_rewrite,您可以使用以下方式完成与profile.php?user=roa3
或products.php?id=123&category=toys
相同的事情:site.com/profile/roa3
或products/toys/123
。
使用CodeIgniter框架默认提供友好的URL,并消除了在网址中使用?
的需要。请参阅此页面以获取示例。
3) ?
符号也用于php页面的代码中。例如,一个if else语句块如下:
if ($x==1)
$y=2;
else
$y=3;
还可以写成:
$y=($x==1) ? 2 : 3;
www.website.com/profile.php?user=roa3&fav_colour=blue
其他选项:
- POST变量:
- 您可以通过POST变量发送您的变量。这些变量在请求的头中传递,而不是在请求的URL中传递。它们不是立即显而易见的,并且不会被沿途的服务器缓存,但它们仍然可以被读取,除非您已经建立了HTTPS连接。
- 表单中的变量可以通过POST或GET方法发送。您可以在表单的"method"中指定这一点。例如:<form action="index.php" method='post'/>
- SESSION变量:
- 会话变量存储在服务器上。会话ID被传递给用户,每当用户发出另一个请求时,该会话ID就会被传回服务器。然后可以使用此会话ID来获取存储的会话变量。因此,您可以存储用户的最喜欢颜色、姓名和IP地址等信息,但可以将其存储在服务器而不是用户的家用电脑上。
- 会话ID可以被冒充,因此最好检查用户的IP,并/或将它们包装在安全连接中,例如HTTPS。
- 会话变量无法被截取请求的人更改。
- COOKIE变量:
- 与会话变量类似,只是它们存储在用户的PC上,而不是服务器上。它们存储在域名下,当他们访问该域名时,它们会在请求的头中重新提交变量。这意味着用户可以更改和黑客变量,或其他人也可以。$x = $_GET['user']
- 对于POST变量:$x = $_POST['user]
- 对于组合了GET、POST和COOKIE变量的REQUEST变量:$x = $_REQUEST['user']
- 对于COOKIE变量:$x = $_COOKIE['user']
- 对于SESSION变量:$x = $_SESSION['user']
"
(user
可以替换为您使用的变量名称)
这些都是非常简单的内容,但了解它们的实际作用非常重要。
问号(?)是HTTP标准的一部分,而不是PHP的一部分。我认为我应该指出这一点,这样当您转到另一种语言并再次看到它时,您不会因为认为涉及PHP而感到困惑。
否则,上面有一些很好的答案。
从服务器的角度来看,问号?只是另一个字符。PHP提供了简单的方法来获取问号后面的URL部分,例如对于"/profile.php?user=roa3",PHP将设置$_GET ['user'] ='roa3'。
问号在URL中有用的原因是浏览器可以使用表单构建动态URL - 在上面的例子中,我希望该URL是由HTTP表单构建的,其中包含一个名为“user”的字段,人类用户已经输入了“roa3”。
"?"用于分隔URL和参数。例如,它类似于http://www.url.com/resourcepath?a=b&c=d。在这种情况下,a=b就像请求参数=请求值。
是的,不建议使用太多参数,因为总URL大小有限,就像GET请求一样,所有参数都显示在URL上,用户可以修改它。在您的示例中,假设用户将URL修改为"user=techmaddy"。
优点是它可用于GET类型的请求。缺点是安全性低,大小受限制。