我有两个站点,站点A和站点B.两个站点都是简单的PHP站点,没有MySQL。它们都在不同的服务器上。
情景:
在站点A上发出用户名/密码请求。站点A应该通过电子邮件将此用户名/密码通过电子邮件发送给管理员的电子邮件,以显示已创建用户的请求。
在网站A上创建用户名/密码的请求将发送到网站B,并且应在网站B上创建用户名/密码。
用户可以在接下来的24小时内在站点B中登录此信息。
在站点B上,已有系统以数组中的用户名/密码存储的方式登录。
我的问题:
除了两件事之外,基本上一切都很清楚。
<form>
变量username / pwd)?答案 0 :(得分:1)
以下是基本参考:http://us2.php.net/manual/en/ref.curl.php。您需要研究PHP的cURL函数 - 这些函数旨在通过网络组合和发送请求。如果您传递敏感信息(用户名和密码),则这些请求确实需要通过https或其他安全协议进行。如果您在网络中存储网站的用户名和密码,那么您将无法动态创建用户。
因此,您需要切换站点B以使用数据库来存储用户信息。有几种不同的API设置可用于通过Internet传输数据。 RESTful API可能是我所知道的最容易实现的API。总的来说,这是一个相当大的项目,如果您的经验有限,尤其如此。有关如何在链接中使用curl的基本示例。你真的不必使用正式的API,但如果其他人会在某些时候与它进行通信,那就太好了。
总结:PHP能够像浏览器一样向其他网站发出请求。它可以使用curl函数(和其他函数)执行此操作 - 与其他请求一样,您可以访问接收脚本中$ _POST和$_GET
变量中的信息。有时,信息是通过GET请求传输的,但是作为URL的一部分以PHP默认无法识别的方式传输。在这种情况下,您需要使用$_SERVER['REQUEST_URI']
变量手动解析信息。
整个设置真的没什么特别的 - 通过GET你将数据作为网址的一部分发送。使用POST,您将其与请求一起发送(URL是请求的一部分,但POST数据不是'嘈杂',因为它不存储在您的网站历史记录中,通常不存储在服务器日志中)。在内部,整个过程通过标头的传输发生。如果您不熟悉,您应该查看它们以及HTTP的底层机制如何工作。这是您每次访问网站时浏览器所经历的过程 - 但您的浏览器会隐藏您的详细信息。
注意:我不是要在这里解释一个实现。我对这个问题的解释是,这是一个非常广泛的问题。因此,我试图概述一下这种事情是如何运作的。 https将在两个服务器之间建立安全的通信通道,但不会验证站点A的身份,因此需要某种安全的身份验证机制。同样,对于能够登录用户的任何站点,您都需要某种安全身份验证。我鼓励您研究Web身份验证和http基础知识。
答案 1 :(得分:0)
您可以自己构建一个:每个站点都有一个用于散列和/或加密的共享密钥。让我们说用户成功登录到站点A.然后他们做了一些让站点B为他们生成用户名/密码的东西,因此站点B需要一种方法来区分真正的请求和欺诈性的请求。
您可以在网站A上生成哈希:
hash = hash_func(shared_secret + timestamp + user_email)
然后我们通过重定向将这些内容传递给网站B:
https://siteb.tld/auth?timestamp=123454321&email=joe@example.com&hash=78g2gb2bg2kguigigbg2
然后,站点B使用shared_secret(来自其自己的数据存储)和提供的信息来重新创建哈希。如果匹配,则视为已通过身份验证。然后,它可以生成随机密码并通过电子邮件发送给用户。
为安全起见,这应该通过SSL完成,正如我的链接所暗示的那样。出于隐私的原因,不应在明文查询字符串中携带电子邮件地址 - 虽然它们不能免于POST操作中的拦截,但较少的设备(浏览器,服务器)会定期记录它们。
您不必传递时间戳 - 如果系统时钟是NTP同步的,那么您可以舍入到最近的十秒,然后计算目标服务器上四舍五入的任一侧的哈希值。这可以提高安全性,因为创建哈希值的方式不太明显。
不要使用MD5,SHA1或其他快速哈希 - 使用更复杂的东西。并确保从单个IP地址(可能每小时每个IP 30个?)中阻止站点B中的大量尝试。这样可以防止蛮力企图通过后门进入B站点。