「LiteSite/signup/網路安全」修訂間的差異

出自六年制學程
跳至導覽 跳至搜尋
 
(未顯示同一使用者於中間所作的 6 次修訂)
第1行: 第1行:
 
[[分類:LiteSite]]
 
[[分類:LiteSite]]
 
===前提:===
 
===前提:===
網路機器人可以直接用 HTTP POST 打你的 signup.php,完全繞過瀏覽器與 JavaScript。
+
網路機器人:
 +
# 可以直接用 HTTP POST 打你的 signup.php ,完全繞過瀏覽器與 JavaScript。
 +
# 真正「寫入 AL_users」的地方在 signup.php 的 surveySubmit 分支。
 +
# 只要對方能 POST 出一個看起來像正常表單的有效負載,就會進資料表。
 +
# 把 verify 的檢查提升到「只要要寫入 DB 就一定先檢查」的位置,而不是散落在流程中(避免未來改動、或某些分支漏檢查)。
 +
而原來 signup.php 是在造完「"insert into ".$tbl." set …";」SQL 命令後,檢查完「帳號與密碼不得相同」後, $sql 要插入前再檢查「if($_POST['verify']=='我不是機器人'){」。
  
真正「寫入 AL_users」的地方在 signup.php 的 surveySubmit 分支。
+
PS.這樣應該也能攔住機器人注入,為什麼沒攔住?
 
 
只要對方能 POST 出一個看起來像正常表單的有效負載,就會進資料表。
 
 
 
把 verify 的檢查提升到「只要要寫入 DB 就一定先檢查」的位置,而不是散落在流程中(避免未來改動、或某些分支漏檢查)。
 
  
 
===基本修改:===
 
===基本修改:===
第13行: 第14行:
 
<pre>}elseif(isset($_POST['surveySubmit']) && $_POST['surveySubmit']==$surveySubmit){</pre>
 
<pre>}elseif(isset($_POST['surveySubmit']) && $_POST['surveySubmit']==$surveySubmit){</pre>
 
馬上加:
 
馬上加:
<pre> $verify = isset($_POST['verify']) ? trim($_POST['verify']) : '';
+
<pre style='font-size:95%'>$verify = isset($_POST['verify']) ? trim($_POST['verify']) : '';
if ($verify !== '我不是機器人') {
+
if ($verify !== '我不是機器人') {
    $msg = "<p class='signup' align='center' style='color:red'>機器人驗證錯誤:請在「機器人驗證」欄輸入「我不是機器人」。</p>";
+
    $msg="<p class='signup' align='center' style='color:red'>機器人驗證錯誤:請在「機器人驗證」欄輸入「我不是機器人」。</p>";
    echo dispWeb($msg, $html1, $html2);
+
    echo dispWeb($msg, $html1, $html2);
    exit;
+
    exit;
}</pre>
+
}</pre>
 +
然後剔除原來在分支中的「if($_POST['verify']=='我不是機器人'){」及其相關的程式碼。

於 2026年2月20日 (五) 17:28 的最新修訂

前提:

網路機器人:

  1. 可以直接用 HTTP POST 打你的 signup.php ,完全繞過瀏覽器與 JavaScript。
  2. 真正「寫入 AL_users」的地方在 signup.php 的 surveySubmit 分支。
  3. 只要對方能 POST 出一個看起來像正常表單的有效負載,就會進資料表。
  4. 把 verify 的檢查提升到「只要要寫入 DB 就一定先檢查」的位置,而不是散落在流程中(避免未來改動、或某些分支漏檢查)。

而原來 signup.php 是在造完「"insert into ".$tbl." set …";」SQL 命令後,檢查完「帳號與密碼不得相同」後, $sql 要插入前再檢查「if($_POST['verify']=='我不是機器人'){」。

PS.這樣應該也能攔住機器人注入,為什麼沒攔住?

基本修改:

在 signup.php 這段開始處:

}elseif(isset($_POST['surveySubmit']) && $_POST['surveySubmit']==$surveySubmit){

馬上加:

$verify = isset($_POST['verify']) ? trim($_POST['verify']) : '';
if ($verify !== '我不是機器人') {
    $msg="<p class='signup' align='center' style='color:red'>機器人驗證錯誤:請在「機器人驗證」欄輸入「我不是機器人」。</p>";
    echo dispWeb($msg, $html1, $html2);
    exit;
}

然後剔除原來在分支中的「if($_POST['verify']=='我不是機器人'){」及其相關的程式碼。