2014-07-26 50 views
0

只是有一个想法,假设有一个表单有一个变量存储一些数据(基于哪个 - 表单将被相应处理)。HTML - 从外部PHP文件后注入

说用户得到他们的电子邮件转诊/注册链接遵循注册,假设URL以加密的GET变量,如:http://www.example.com?a42as231Adab

比如有后者从该ID获取变量的一种形式:

$usersID = decrypt($_GET['user']); 
<form method='POST' action='viewdata.php?userID=$usersID'> 

因为用户可以点击查看源代码,他们将很容易地看到行动领先的位置以及解析的用户ID。

等什么会阻止某人: 创建自己的服务器上的一个空白的新PHP文件,复制原始形式到他们的PHP文件,并将其更改为:

<form method='POST' action='viewdata.php?userID=1'> 

我的意思是假定在这种情况下用户ID是连续的,所以1,2,3可能最终成为管理员。

让我们说viewdata.php,如果它通知用户ID是admin,它将允许用户管理一些东西。

换句话说:有没有什么办法可以阻止表单从任何东西发布到特定的域?

我知道这可能被认为是非常差的安全措施,如果用户可以根据他们的ID给予访问,但仍然,我对此很好奇,这只是我得到的一个随机想法。

+2

我不完全确定你的问题是关于什么的,但我认为你正在谈论CSRF漏洞? – PeeHaa

+0

所以你说的是,当一个用户使用加密的用户ID访问该页面时,他实际上是以该用户的身份登录的(可以说用户23)? (编辑:)因此,他可能只发布到viewdata.php?userID = 23 –

+0

简言之:如果表单操作依赖于特定变量,什么阻止用户通过从外部域发送表单来更改该变量,从而可以编写自己的脚本php表单并对其进行修改 – arleitiss

回答

0

如果你不想让任何人搞乱敏感信息,只是不要给他们。您的index.php以加密形式处理此信息的方式相同,viewdata.php也可以这样做。

您也可以将它存储在$_SESSION中,并使viewdata.php从那里获取。那就是为什么$_SESSION是那种东西。

要防止跨网站发布,请使用postkey。例如:

echo "<form method='POST' action='viewdata.php?userID=$usersID'>"; 
echo "<input type='hidden' name='postkey' value='" . session_id() . "'>'; 

现在viewdata.php,检查是否$_POST['postkey'] == session_id()或知道这是否真的用户提交的处方,如果他诱导一些外部源做到这一点。

+0

几乎所有隐藏用户信息但仍能够跨页访问的唯一方法是使用会话? – arleitiss

+0

不可以。您可以使用加密技术。 – Havenard

+0

我喜欢使用校验和+ AES块cypher + base64的组合来生成具有敏感数据的字符串,我可以安全地将其交给用户以供其他页面处理。他不能读它,因为它的密码,他不能乱它,甚至产生随机行为,因为加密后面的校验和确保解密结果是安全依靠的。 – Havenard