在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)庫/ SQLite 注入
SQLite Having 子句
SQLite 運(yùn)算符
SQLite 注入
SQLite Delete 語句
SQLite – Python
SQLite 數(shù)據(jù)類型
SQLite 簡(jiǎn)介
SQLite 創(chuàng)建數(shù)據(jù)庫
SQLite Vacuum
SQLite Group By
SQLite 日期 & 時(shí)間
SQLite AND/OR 運(yùn)算符
SQLite 刪除表
SQLite Distinct
SQLite Alter 命令
SQLite PRAGMA
SQLite 約束
SQLite 創(chuàng)建表
SQLite Like 子句
SQLite Limit 子句
SQLite Autoincrement
SQLite 子查詢
SQLite – C/C++
SQLite – PHP
SQLite 命令
SQLite Order By
SQLite Select 語句
SQLite Unions 子句
SQLite – Perl
SQLite – Java
SQLite 別名
SQLite 常用函數(shù)
SQLite Explain(解釋)
SQLite NULL 值
SQLite Glob 子句
SQLite 表達(dá)式
SQLite 視圖
SQLite Where 子句
SQLite Truncate Table
SQLite 索引
SQLite Insert 語句
SQLite 安裝
SQLite Indexed By
SQLite 分離數(shù)據(jù)庫
SQLite 觸發(fā)器
SQLite 語法
SQLite Joins
SQLite Update 語句
SQLite 附加數(shù)據(jù)庫
SQLite 事務(wù)

SQLite 注入

如果您的站點(diǎn)允許用戶通過網(wǎng)頁輸入,并將輸入內(nèi)容插入到 SQLite 數(shù)據(jù)庫中,這個(gè)時(shí)候您就面臨著一個(gè)被稱為 SQL 注入的安全問題。本章節(jié)將向您講解如何防止這種情況的發(fā)生,確保腳本和 SQLite 語句的安全。

注入通常在請(qǐng)求用戶輸入時(shí)發(fā)生,比如需要用戶輸入姓名,但用戶卻輸入了一個(gè) SQLite 語句,而這語句就會(huì)在不知不覺中在數(shù)據(jù)庫上運(yùn)行。

永遠(yuǎn)不要相信用戶提供的數(shù)據(jù),所以只處理通過驗(yàn)證的數(shù)據(jù),這項(xiàng)規(guī)則是通過模式匹配來完成的。在下面的實(shí)例中,用戶名 username 被限制為字母數(shù)字字符或者下劃線,長(zhǎng)度必須在 8 到 20 個(gè)字符之間 - 請(qǐng)根據(jù)需要修改這些規(guī)則。

    if (preg_match("/^w{8,20}$/", $_GET['username'], $matches)){
       $db = new SQLiteDatabase('filename');
       $result = @$db->query("SELECT * FROM users WHERE username=$matches[0]");
    }else{
       echo "username not accepted";
    }

為了演示這個(gè)問題,假設(shè)考慮此摘錄:To demonstrate the problem, consider this excerpt:

    $name = "Qadir'; DELETE FROM users;";
    @$db->query("SELECT * FROM users WHERE username='{$name}'");

函數(shù)調(diào)用是為了從用戶表中檢索 name 列與用戶指定的名稱相匹配的記錄。正常情況下,$name 只包含字母數(shù)字字符或者空格,比如字符串 ilia。但在這里,向 $name 追加了一個(gè)全新的查詢,這個(gè)對(duì)數(shù)據(jù)庫的調(diào)用將會(huì)造成災(zāi)難性的問題:注入的 DELETE 查詢會(huì)刪除 users 的所有記錄。

雖然已經(jīng)存在有不允許查詢堆疊或在單個(gè)函數(shù)調(diào)用中執(zhí)行多個(gè)查詢的數(shù)據(jù)庫接口,如果嘗試堆疊查詢,則會(huì)調(diào)用失敗,但 SQLite 和 PostgreSQL 里仍進(jìn)行堆疊查詢,即執(zhí)行在一個(gè)字符串中提供的所有查詢,這會(huì)導(dǎo)致嚴(yán)重的安全問題。

防止 SQL 注入

在腳本語言中,比如 PERL 和 PHP,您可以巧妙地處理所有的轉(zhuǎn)義字符。編程語言 PHP 提供了字符串函數(shù) sqlite_escape_string() 來轉(zhuǎn)義對(duì)于 SQLite 來說比較特殊的輸入字符。

    if (get_magic_quotes_gpc())
    {
      $name = sqlite_escape_string($name);
    }
    $result = @$db->query("SELECT * FROM users WHERE username='{$name}'");

雖然編碼使得插入數(shù)據(jù)變得安全,但是它會(huì)呈現(xiàn)簡(jiǎn)單的文本比較,在查詢中,對(duì)于包含二進(jìn)制數(shù)據(jù)的列,LIKE 子句是不可用的。

請(qǐng)注意,addslashes() 不應(yīng)該被用在 SQLite 查詢中引用字符串,它會(huì)在檢索數(shù)據(jù)時(shí)導(dǎo)致奇怪的結(jié)果。