【发布时间】:2013-10-22 12:29:24
【问题描述】:
我正在寻找最安全的方法,以防止我使用 PHP 和 MySQL 的 Web 表单从站点外发布。我做了一些搜索,发现大多数人建议在表单中设置一个隐藏字段和一个带有 md5() 哈希值的会话变量,并在表单提交时检查它。但这似乎不是很安全,因为 md5() 哈希值可以在隐藏值的表单源中看到。
这是我不允许异地提交表单的想法。数据库调用会占用更多资源,但看起来更安全,因为代码哈希永远不会发送到客户端。
请查看它,看看您是否可以在此安全措施中戳出任何漏洞以防止异地表单发布。
// First time form loads
if (!$_POST) {
session_start();
$code_options = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9');
for ($i=1; $i<=20; $i++) {
$code .= array_rand(array_flip($code_options), 1);
}
// Insert new record
$con = connect_to_db(); // connects to db
$sql = "INSERT INTO security_table (form_code) values('$code')";
$result = run_query($sql, $con); // runs the query
$_SESSION['formcode'] = $code;
$_SESSION['formid'] = mysql_insert_id();
}
// If form was posted to
if ($_POST) {
session_start();
$con = connect_to_db();
$form_code = mysql_real_escape_string($_SESSION['formcode']);
$form_id = mysql_real_escape_string($_SESSION['formid']);
$sql = "SELECT form_code FROM security_table WHERE form_code = '$form_code' AND form_id = '$form_id '";
$result = run_query($sql, $con);
if (mysql_num_rows($result) > 0) {
// Process the form
// If form processes successfully
$_SESSION['formcode'] = "";
$_SESSION['formid'] = "";
}else{
// Error
}
}
【问题讨论】:
-
我正在尝试不使用验证码
-
如何防止脚本加载您的页面两次?您的 php 脚本第一次会很乐意为它创建一个安全令牌,并在第二次接受会话...
-
为什么会有那么多奇思妙想?为什么不直接将表单令牌放入会话中并检查以确保它们匹配?