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

鍍金池/ 教程/ 數(shù)據(jù)庫(kù)/ SQLite 注入
SQLite Having 子句
SQLite 運(yùn)算符
SQLite 注入
SQLite Delete 語(yǔ)句
SQLite – Python
SQLite 數(shù)據(jù)類型
SQLite 簡(jiǎn)介
SQLite 創(chuàng)建數(shù)據(jù)庫(kù)
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 語(yǔ)句
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 語(yǔ)句
SQLite 安裝
SQLite Indexed By
SQLite 分離數(shù)據(jù)庫(kù)
SQLite 觸發(fā)器
SQLite 語(yǔ)法
SQLite Joins
SQLite Update 語(yǔ)句
SQLite 附加數(shù)據(jù)庫(kù)
SQLite 事務(wù)

SQLite 注入

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

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

永遠(yuǎn)不要相信用戶提供的數(shù)據(jù),所以只處理通過(guò)驗(yàn)證的數(shù)據(jù),這項(xiàng)規(guī)則是通過(guò)模式匹配來(lái)完成的。在下面的實(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è)問(wèn)題,假設(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ù)庫(kù)的調(diào)用將會(huì)造成災(zāi)難性的問(wèn)題:注入的 DELETE 查詢會(huì)刪除 users 的所有記錄。

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

防止 SQL 注入

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

    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é)果。