我发送一些重要的信息从1个网站的形式到另一个(2个不同的子域在同一服务器)。由于接收端处于不同的子域,我不能使它需要登录(就像我一样,如果它在相同的),这使得我的接收端非常脆弱,因为它可以很容易地从另一个地方调用来绕过我的表单(这是非常糟糕的)。
如何使其更安全?我可以发送某种类型的安全令牌与我的表单不能被截获(因为我假设如果$_POST数组只是包含一个安全令牌,它可以很容易地被截获,使其无用)。如果我在这里错了,请纠正我)或者可能限制接收端只接受来自一个特定位置(如某个url或IP)的数据?
这是一个重要的项目,所以我不介意在安全方面做得太过分。
我不能让它需要登录
是的,你可以。跨域的单点登录是一个有充分记录的问题,您甚至没有处理多个域。跨子域更容易。
我可以将某种安全令牌与我的表单一起发送吗
是的。生成令牌。将其存储在服务器上。把它写在表格里。提交表单
不能被截获
通过SSL提交表单。
(除非你的意思是你想让控制浏览器的人拦截它,在这种情况下,你就不走运了。)如果您通过浏览器发送数据,那么您将其置于浏览器所有者的控制之下。如果你不能相信他们,那么你也不能相信数据。
你能告诉我一个好方法来限制targetForm.php接收信息只从a.domain.com/form.php或它的ip吗?
您正在寻找针对CSRF的防御。您需要跨子域实现会话(您可以这样做,请参阅上面关于cookie的说明),然后使用同步令牌(您将其存储在表单和会话中,然后在form.php
中进行比较)。
我会采取一个简单的方法:
- 表单在子域A上,比如a.domain.com/form.php
- 表单提交数据到相同的子域或脚本(为什么不),a.domain.com/form.php
- form.php使用cURL发送POST请求到b.domain.com/targetForm.php
- b.domain.com/targetForm.php只接受来自b.domain.com IP的请求,或者类似的东西
这样,您仍然可以要求用户登录到a.domain.com以提交表单,当一切正常时,然后将该数据推送到b.domain.com/targetForm.php,您将只接受a.domain.com的请求。