Программно установленный файл cookie браузера (Firefox) - PullRequest
5 голосов
/ 06 мая 2009

Я знаю из этого вопроса , что Firefox 3.0 и выше сохраняет свои куки в базе данных SQLite. Мой вопрос: можете ли вы получить доступ к этой базе данных из других настольных программ таким образом, чтобы вы могли добавить cookie?

Я понимаю, что это имеет значение для безопасности. Однако я не хочу читать их вообще. Я хочу иметь возможность установить один файл cookie, если это возможно. Я даже не хочу перезаписывать печенье. Я просто хочу добавить его, если его там еще нет. Это своего рода личный проект, над которым я работаю ради забавы.

Этот вопрос в основном не зависит от языка. Я бы предпочел решение на C #, но для этого достаточно доказательства концепции на любом языке.

Дополнительная скидка: было бы здорово установить тот же cookie в Internet Explorer, тоже

Ответы [ 5 ]

9 голосов
/ 06 мая 2009

Для FF3 вы можете получить доступ к файлу cookies.sqlite с помощью любой оболочки SQLite - однако, проверьте, работает ли FF - возможно, это блокировка записи файла (не проверено).

База данных содержит это:

TABLE moz_cookies (
    id INTEGER PRIMARY KEY, 
    name TEXT, 
    value TEXT, 
    host TEXT, 
    path TEXT,
    expiry INTEGER, 
    lastAccessed INTEGER, 
    isSecure INTEGER, 
    isHttpOnly INTEGER
)

Не уверен насчет первичного ключа, похоже, что это метка времени Unix, когда был создан cookie; expiry и lastAccessed также являются временными метками Unix, остальное не требует пояснений.

Попробуйте INSERT INTO moz_cookies и посмотрите, станет ли FF немедленно узнавать о новом файле cookie или требуется перезапуск.

2 голосов
/ 25 марта 2012

Использование http://www.ch -werner.de / javasqlite / Overview-summary.html и http://ini4j.sourceforge.net/. Работает с текущим Firefox 11

List<Map<String, String>> getCookies() throws Exception
{
    String appdata = System.getenv("APPDATA");
    File fappdata = new File(appdata);
    Path firefox = fappdata.toPath().resolve("Mozilla").resolve("Firefox");
    File profilesini = firefox.resolve("profiles.ini").toFile();
    Ini ini = new Ini(profilesini);

    //TODO:Detect more profiles than just assume default profile configuration
    Ini.Section section = ini.get("Profile0");
    String profiledir = section.get("Path");

    File cookiesfile = firefox.resolve(profiledir).resolve("cookies.sqlite").toFile();

    String cookiesAdress = cookiesfile.getAbsolutePath();

    Class.forName("SQLite.JDBCDriver");
    Connection conn = DriverManager.getConnection("jdbc:sqlite:/"+cookiesAdress);
    Statement sta = conn.createStatement();

    String query = "select * from moz_cookies";

    ResultSet rs = sta.executeQuery(query);
    List<Map<String, String>> result = new ArrayList<>();

    while(rs.next())
    {
        Map<String, String> store = new HashMap<>();
        store.put("id", String.valueOf(rs.getInt("moz_cookies.id")));
        store.put("baseDomain", rs.getString("moz_cookies.baseDomain"));
        store.put("name", rs.getString("moz_cookies.name"));
        store.put("value", rs.getString("moz_cookies.value"));
        store.put("host", rs.getString("moz_cookies.host"));
        store.put("path", rs.getString("moz_cookies.path"));
        store.put("expiry", String.valueOf(rs.getInt("moz_cookies.expiry")));
        store.put("lastAccessed", String.valueOf(rs.getInt("moz_cookies.lastAccessed")));
        store.put("creationTime", String.valueOf(rs.getInt("moz_cookies.creationTime")));
        store.put("isSecure", String.valueOf(rs.getInt("moz_cookies.isSecure")));
        store.put("isHttpOnly", String.valueOf(rs.getInt("moz_cookies.isHttpOnly")));
        result.add(store);
    }
    rs.close();
    sta.close();
    conn.close();


    return result;

}

Ребята, я использую этот код для своих доморощенных скребков. Не делайте зла с cookie-файлами Firefox, иначе парни из Mozilla зашифруют их, и мы не сможем делать с ними смешных и безобидных вещей

2 голосов
/ 14 июня 2011

Я знаю, что этот вопрос действительно старый, но у меня была та же проблема, и я так и не нашел полный пример кода (хотя ответы на этой странице указали мне правильное направление). НТН!

public static void ClearFirefoxCookies()
{
    int procCount = Process.GetProcessesByName("firefox").Length;
    if (procCount > 0)
        throw new ApplicationException(string.Format("There are {0} instances of Firefox still running", procCount));

    try
    {
        using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + GetFirefoxCookiesFileName()))
        { 
            conn.Open();
            SQLiteCommand command = conn.CreateCommand();
            command.CommandText = "delete from moz_cookies";
            int count = command.ExecuteNonQuery();
        }
    }
    catch (SQLiteException ex)
    {
        if (!(ex.ErrorCode == SQLiteErrorCode.Busy || ex.ErrorCode == SQLiteErrorCode.Locked))
            throw new ApplicationException("The Firefox cookies.sqlite file is locked");
    }
}

private static string GetFirefoxCookiesFileName()
{
    string path = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), @"Mozilla\Firefox\Profiles");
    if (!System.IO.Directory.Exists(path))
        throw new ApplicationException("Firefox profiles folder not found");

    string[] fileNames = System.IO.Directory.GetFiles(path, "cookies.sqlite", System.IO.SearchOption.AllDirectories);
    if (fileNames.Length != 1 || !System.IO.File.Exists(fileNames[0]))
        throw new ApplicationException("Firefox cookies.sqlite file not found");
    return fileNames[0];
}
1 голос
/ 06 мая 2009

http://sqlite.phxsoftware.com/

Это отлично подходит для работы с SQLite в .NET

1 голос
/ 06 мая 2009

Вам нужно будет использовать соединитель SQLite и подключиться к файлу базы данных пользователя cookie. Он находится в папке их профиля по умолчанию и называется cookies.sqlite. Проверьте sqlite-manager для Firefox. Вы можете просмотреть все таблицы, которые Firefox использует с этим.

Редактировать: вот ссылка на провайдера: System.Data.SQLite

...