在链接中发送php值是否安全?

时间:2016-04-04 00:17:46

标签: php html security

我有一个动态页面,它应该从数据库中获取数据。所以我想到的方法是在顶部用这个PHP代码创建动态页面

<?php $pid = $_GET["pid"]; ?>

然后在文件中它连接到数据库并根据页面ID($ pid)显示正确的内容。所以在主页上,我想添加链接以显示正确的页面。例如,&#34;广告&#34;的数据。页面保存在pid为100的行的数据库中。所以我添加了链接到&#34;广告&#34;主页上的页面如下:

<a href="http://site/page.php?pid=100">Advertise</a></li>

所以我的问题是,任何人都可以通过更改pid来查看链接上发送的值并进行播放。是否有一种简单的方法可以屏蔽此值,或者将值更安全地发送到page.php

3 个答案:

答案 0 :(得分:2)

您正在寻找的一般概念是Access Control。您有一个资源(在这种情况下,是一个页面及其内容),并且您希望控制可以访问它(用户,组等),并且可能< strong>如何他们也可以访问它(例如,只读,读写,只写在本月的第一个星期一,等等)。

定义问题

您需要确定的第一件事是您需要访问控制权的资源,以及您不需要访问控制权的资源。听起来我觉得其中一些页面应该是公共访问&#34; (因此它们列在某种索引页面上),而其他的应该以某种方式受到限制。

其次,您需要提出一个访问策略 - 这可以针对一个小项目进行非正式描述,但是较大的项目通常会有一些用于定义此策略的结构化系统。 对于每种资源,您的政策应回答以下问题:

  • 您是否拥有某种用户帐户系统,并且您只希望帐户持有人(或某些类型的帐户持有人)访问它?或者,您是否要发送指向电子邮件地址的链接,并希望仅限访问那些拥有该链接的人?
  • 每个用户应具有哪种访问权限?只读?他们是否也能够更改内容(如果您的系统支持)?
  • 对用户是否有任何其他类型的限制&#39;访问?团体会员?他们在获得访问权之前需要付费吗?他们是否只允许在特定时间访问?

实施您的政策

一旦您回答了这些问题,您就可以开始考虑实施了。就目前而言,我认为您将访问控制与标识混合在一起。您的pid 标识一个页面(例如,第100页),但它没有做任何限制访问的事情。如果您的页面使用可预测的编号方案进行标识,则任何人都可以轻松修改请求中的数字(对于GET个请求都是如此,例如当您在地址栏中键入URL时,{{1}请求,例如提交表单时)。

为了安全地控制访问,需要有一个,通常是一个非常难以猜测的字符串,这在授予访问权限之前是必需的。在非常简单的系统中,将此密钥直接插入URL中是完全正确的,只要您仍然可以保护密钥不被未经授权的用户。这正是Google Drive&#34;获取分享链接的方式。功能有用。更复杂的系统将使用服务器端会话或API密钥来控制访问 - 但最终,它仍然是客户端(用户或用户)的秘密,难以猜测的字符串。浏览器)发送到服务器以及他们对资源的请求。

您可以将识别视为您的街道地址,这可以唯一地标识您的房屋,但不是,也不是秘密。访问控制是您家的关键。只有你和你给予钥匙的人才能真正进入你的房子。如果您的锁具质量很高,则很难锁定。

将它们整合在一起

编写代码很容易,设计软件很难。在您确定最适合您的解决方案之前,您需要提前考虑您决定的后果。例如,您是否预计需要更改密钥&#34;将来这些页面?如果是这样,那么当发生这种情况时,您必须向您的授权用户(仍然应该有权访问的用户)提供新密钥。用户帐户系统将页面访问控制与页面标识分离,因此您可以删除一个用户的访问权限,而不会影响其他人。

另一方面,您还需要考虑受众的性质。也许您的用户不想创建帐户?这对您的受众来说非常具体。

我感觉你仍然是网络开发的新手,并且你自己也在学习。学习自己最难的部分是学习学习内容和学习内容。 - Stack Overflow太具体了,教科书太笼统了。所以,我将给你留下一个简短的概念词汇表,这些概念似乎与你当前的问题最相关:

  • Access control。这是您尝试使用此问题解决的一般问题的名称。
  • Secrecy vs obscurity。说到安全性,保密性==好,默默无闻==坏。
  • Web content management system。你可能听说过Wordpress,但还有很多其他的。我不确定您的系统应该做什么,但内容管理系统可能会为您解决这些问题。
  • Reinventing the wheel。在教室里很好,在现实世界中很糟糕。
  • How does HTTP work。简短而重要。我在SO上看到的很多问题源于对网站实际工作方式的基本误解。一个网站不是一个单独的软件,而是两个玩家之间的对话 - 客户端(例如用户和他们的浏览器)和服务器。客户端只能通过请求向服务器说些什么,服务器只能通过响应向客户说些什么。通常,此对话包括客户端要求服务器响应的某些资源(HTML网页,Javascript文件等)。服务器可以说&#34;在这里你去,我为你得到它&#34;,或者回答某种错误(&#34;我找不到它&#34;,&#34;你不被允许看到&#34;,&#34;我现在太忙了#34;,&#34;我现在不能正常工作&#34;等)。
  • PHP The Right Way。当我第一次开始学习Web开发和PHP时,我希望我找到的东西,而不是七年之后; - )

答案 1 :(得分:1)

如果可以的话,$ _POST总是更安全,但是如果你必须在查询字符串中使用某些东西,那么使用散列或GUID比使用显然是自动增量值的东西更安全。这使得猜测ID会更难。在页面之间可以有其他方式超过值($ _SESSIONs,cookies等),但它实际上是关于你想要实现的目标。

答案 2 :(得分:0)

将它发送到php不是问题,应该没问题。

之后php用它做什么......这就是你的安全感。

我要做的第一件事是确保它是一个整数。

$pid=(is_int($_GET['pid']))? $_GET['pid'] : 1; //1 is the default pid, change this to whatever you want.

现在你知道你正在处理一个整数,之后使用$ pid,你应该好好去。