自動化測試、安全基準掃描、瀏覽器強化工具常需程式化切換 IE / Firefox 的 JavaScript 執行權限。IE 透過登錄表 `Zones\3\1400` 控制,Firefox 透過設定檔 `prefs.js` 中 `user_pref("javascript.enabled", true/false)` 控制。本文提供完整讀寫實作、路徑解析、權限注意事項。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1400
1400 = "Active scripting" (JavaScript)。0 = 啟用、1 = 提示、3 = 停用。using Microsoft.Win32;
const string IeZonePath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3";
public static bool GetIeScriptEnabled()
{
using var key = Registry.CurrentUser.OpenSubKey(IeZonePath, false);
return key?.GetValue("1400") is int v && v == 0;
}
public static void SetIeScriptEnabled(bool enabled)
{
using var key = Registry.CurrentUser.OpenSubKey(IeZonePath, true);
key?.SetValue("1400", enabled ? 0 : 3, RegistryValueKind.DWord);
}
%APPDATA%\Mozilla\Firefox\Profiles\.default-release\prefs.js
using System.IO;
using System.Text;
public static string FindFirefoxPrefsPath()
{
string appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string profilesDir = Path.Combine(appData, "Mozilla", "Firefox", "Profiles");
if (!Directory.Exists(profilesDir)) return null;
foreach (var dir in Directory.GetDirectories(profilesDir))
{
if (dir.Contains(".default"))
{
string prefs = Path.Combine(dir, "prefs.js");
if (File.Exists(prefs)) return prefs;
}
}
return null;
}
public static bool GetFirefoxScriptEnabled(string prefsPath)
{
if (!File.Exists(prefsPath)) return true; // 預設啟用
foreach (var line in File.ReadLines(prefsPath, Encoding.UTF8))
{
if (line.Contains("javascript.enabled"))
{
return line.Contains("true"); // user_pref("javascript.enabled", true);
}
}
return true; // 找不到設定 = 預設啟用
}
public static void SetFirefoxScriptEnabled(string prefsPath, bool enabled)
{
if (!File.Exists(prefsPath)) return;
var lines = new List(File.ReadAllLines(prefsPath, Encoding.UTF8));
bool found = false;
for (int i = 0; i < lines.Count; i++)
{
if (lines[i].Contains("javascript.enabled"))
{
lines[i] = $@"user_pref(""javascript.enabled"", {enabled.ToString().ToLower()});";
found = true;
break;
}
}
if (!found)
lines.Add($@"user_pref(""javascript.enabled"", {enabled.ToString().ToLower()});");
File.WriteAllLines(prefsPath, lines, Encoding.UTF8);
}
static void Main()
{
// IE
Console.WriteLine($"IE JS Enabled: {GetIeScriptEnabled()}");
SetIeScriptEnabled(false);
Console.WriteLine($"IE JS Enabled after disable: {GetIeScriptEnabled()}");
// Firefox
string prefs = FindFirefoxPrefsPath();
if (prefs != null)
{
Console.WriteLine($"Firefox prefs: {prefs}");
Console.WriteLine($"FF JS Enabled: {GetFirefoxScriptEnabled(prefs)}");
SetFirefoxScriptEnabled(prefs, false);
Console.WriteLine($"FF JS Enabled after disable: {GetFirefoxScriptEnabled(prefs)}");
}
else Console.WriteLine("Firefox profile not found.");
}
| 項目 | 說明 |
|---|---|
| Firefox 執行中修改 | 無效,Firefox 關閉時會以記憶體狀態覆寫 prefs.js。必須確認進程已結束。 |
| 多 Profile | 掃描 `.default` 可能匹配多個,建議讀取 `profiles.ini` 解析 `Default=...` 或 `StartWithLastProfile=1` 確定活躍 Profile。 |
| ESR / 企業版 | 可透過 `policies.json` (Enterprise Policies) 統一管理,優先級高於 prefs.js。 |
| IE 區域 | Intranet (Zone 1)、Trusted (Zone 2)、Restricted (Zone 4) 各有獨立 1400 值,跨區域需分別設定。 |
| Edge (Chromium) | 不使用此登錄表,需透過 Group Policy (`ExtensionInstallForcelist` 等) 或 `--disable-javascript` 啟動參數。 |
| 權限 | 寫入 `HKCU` 通常無需管理員;修改 `prefs.js` 需該使用者寫入權限。 |
修改 IE/Firefox JavaScript 狀態屬於「系統級配置變更」,影響面廣,**僅建議用於自動化測試環境佈建、安全基準驗證、瀏覽器強化工具**。一般應用程式不應動態修改使用者瀏覽器設定。實作時務必處理:Firefox 進程檢查、Profile 自動偵測、編碼 (UTF-8)、錯誤恢復。