2012-03-09 56 views
2

我正在用PHP写一个网站。 而且我有一个简单的注册表格。隐藏输入(html表单确认) - 服务器端脚本? (php)

<form> 
<label...></label> <input .../> 
</form> 

我想添加一个确认字段:

<input type='hidden' name='hiddeninput' value="jn3kjnv3kjvn35"> 

但如何做到这一点的代码看看服务器端? 每次加载注册表单时,是否需要将每个隐藏值保存到数据库?

我试图确保表单没有被机器人填写。

这就是为什么我需要一个随机的隐藏值,每个表单提交都是唯一的。

假设每次生成注册页面 - 我生成“隐藏”字段的唯一值。

当用户提交表单时 - 如何将提交的值与生成的值进行比较(因为一旦生成 - 它不会存储在站点的任何位置)。

+0

您还需要提供隐藏的字段名称。 – j08691 2012-03-09 20:56:12

+0

“加载注册表单时,是否需要将每个隐藏值保存到数据库?” - 这取决于你想要完成什么。 – 2012-03-09 20:58:52

回答

0

我现在用Ruby on Rails框架,解决它的开箱。

+0

这不是一个答案。即使你开始使用不同的框架,除非你会更新你的问题,将一个已经接受的答案标记为“不”并且接受你自己的答案是不合适的行为。 – 2017-11-07 13:26:39

+0

嗯,我希望当我找到答案时,有人实际上告诉我关于Ruby on Rails。由于像你这样的答案,我花了很多时间阅读关于每个可能框架的书籍,直到我终于找到Rails。更重要的是,你的答案不遵循MVC约定。嗯是的。我认为当人们阅读这个问题时,让他们知道他们可以切换到Rails,而不是按照您的回答来尝试重新发明轮子并手动创建CSRF令牌。 – 2017-11-07 14:12:23

0

您还需要在该字段中添加一个名称。它和其他任何HTML字段一样工作。

1

基本上,您应该使用一个函数来生成一个随机字符串(例如hash) 和sessions以“记住”此字符串。 提交表单后,您将检查INPUT的值并将其与SESSION的值进行交叉。

例如:

form.php的

<?php 
$hash = md5(time()); 
$_SESSION['form_xx'] = $hash; //in case you have more than one form. 
?> 
<form method='post' action='do.php'> 
.. 
.. 
<input type='hidden' name='secret_key' value='<?=$hash?>'> 
</form> 

do.php

if($_POST['secret_key'] == $_SESSION['form_xx']) //Just make sure your making the posted value SAFE 
//He's ok. 
else 
die("arggg...those hackers");