我正在尋找最安全的方式,不允許將我的Web表單(它使用PHP和MySQL)從非現場發佈到網站。我做了一些搜索,發現大多數人建議在表單中設置一個隱藏字段,並使用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
}
}
我試圖做到這一點沒有captcha – Mark
什麼是讓腳本加載您的網頁兩次?你的php腳本會第一次爲它創建一個安全令牌,然後第二次接受這個會話... – bdares
爲什麼所有的想法都是這樣的?爲什麼不把表單令牌放在會話中並檢查以確保它們匹配? –