日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

php万能查询用预,PHP 与 mysql

發布時間:2023/12/10 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php万能查询用预,PHP 与 mysql 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、php 的 sql 注入攻擊

1.1、什么是 sql 注入攻擊

用戶提交一段數據庫查詢代碼,根據返回的結果,獲得某些他想得到的數據。

比如 :查詢某個管理員是否存在,一般程序員會這么寫$sql?=?"select?*?from?user?where?name='luluyii'?and?password='****'";

if?(查詢到)?{

header("admin.php");

}else?{

header("login.php");

}

這樣寫,容易被人通過 sql 注入攻擊進入你的 admin.php 頁面。

1.2、萬能密碼和萬能用戶名

(1)方式一

① 萬能密碼$sql?=?"select?*?from?user?where?name='**'?and?password='***'?or?1='1'";

即萬能密碼是:**' or 1='1

② 萬能用戶名$sql?=?"select?*?from?user?where?name='**'?union?select?*?form?user/*?and?password='***';

/*表示不執行后面的語句,即萬能用戶名是:**' union select * from user/*

(二)方式二$sql?=?去掉?'$name'?和?'$password'的單引號;

這種寫法,沒有' ',mysql數據庫會把你的輸入當數字對待

① 使用萬能密碼:數字 union select * form user

② 使用萬能用戶名:數字 union select * form user/*

1.3、防止用戶登錄注入

(1)在php.ini 中開啟 magic_quotes_gpc = On,但是這個特性在 php 5.3.0 中已經廢棄,并且在 php 5.4.0 中已經移除。

若配置了,方式一中的萬能用戶名和萬能密碼將失效,但是方式二仍然有效。

原因是:當改為 on 之后,Apache 服務器會對 ' 加入 \ 轉義,如name = 'luluyii',當數據庫執行時,變成 name = \'luluyii\'

(2)密碼對比法

① 基本思想:改變驗證數據庫用戶邏輯。

首先通過用戶輸入的用戶名去查詢數據庫,如果查詢到這個用戶對應的密碼,和用戶提交的密碼對比,相同則說明該用戶合法,否則不合法。$sql?=?"select?password?form?user?where?name='luluyii'";

if(從數據庫查詢到的密碼?==?用戶輸入的密碼){

header("admin.php");

}else{

header("login.php");

}

分析:這樣寫,用戶無法通過 password = 注入攻擊,因為 if( == ) 是在php中驗證的。

② 使用 pdo 的預編譯來解決 sql 注入

首先在 php,ini 中啟用 pdo:extension = php_pdo_mysql.dll$mypdo?=?new?PDO("mysql:localhost;port=3306;dbname=luluyii","root","root");

$pdoStatment?=?$mypdo->prepare($sql);?//預編譯

$pdoStatment->execute(array($name,$password));?//接收

$pdoStatment->fetch();?//取出結果

1.4、php 搜索引擎中 sql 注入問題

(1)一般使用 _ _ 和 % 攻擊,獲取所有數據

(2)防止查詢 sql 攻擊$keyWord?=?addslashes($keyWord);?//使用反斜杠引用字符串

$keyWord?=?str_replace("%","\%",$keyWord);?//將?%?替換為?\%

$keyWord?=?str_replace("_","\_",$keyWord);?//將?_?替換為?\_

1.5、總結

防止 SQL 注射漏洞一般用什么函數?addslashes()?函數返回在預定義字符之前添加反斜杠的字符串。

$str?=?addslashes('Shanghai?is?the?"biggest"?city?in?China.');

echo($str);

//輸出?Shanghai?is?the?\"biggest\"?city?in?China.

sql 注入的方式還有其它很多形式,我們要寫出健壯安全的代碼,就要不斷提高編寫安全代碼的意識,讓我們的代碼更符合

商業要求。

二、php 數據庫編程 mysqli、pdo

2.1、mysqli

2.1.1、mysql 和 mysqli 說明

(1)msyqli 是 mysql 擴展庫的增強版

(2)mysql 和 mysqli的比較

① mysqli 的穩定性、安全性、效率都有所提升

② mysqli 支持面向對象編程,同時考慮到 php 老程序員,提供面向過程的編程風格

2.1.2、案例$conn?=?mysqli_connect("localhost",'root','root');

if?(!$conn){

die("數據庫連接失敗".mysqli_error());

}

mysqli_select_db($conn,"luluyii");

mysqli_query($conn,"set?names?utf8");

$sql?=?"select?*?from?lulu_user";

$res?=?mysqli_query($conn,$sql);

while($row?=?mysqli_fetch_row($res)){

foreach?($row?as?$key=>$val){

echo?"$val--";

}

echo?"
";

}

mysqli_free_result($res);

mysqli_close($conn);

2.1.3、細節說明

(1)關閉連接和釋放資源

mysqli_close($conn);?//關閉連接,是把?①?斷開;

mysqli_free_result($res);?//釋放資源,是把?②?斷開。

(2)從 $res 獲取行數據的四個方法①?mysqli_fetch_row?返回一個索引數組

②?mysqli_fetch_assoc?返回一個關聯數組

③?mysqli_fetch_array?返回索引和關聯數組

④?mysqli_fetch_object?把一行數據當做對象返回

(3)函數mysqli_insert_id($conn)??取得上一步?Insert?操縱產生的?ID

$field_info?=?mysqli_fetch_field($res)?返回包含字段信息的對象,如$field_info->name

mysqli_affected_rows($conn)?取得前一次mysql操作所影響的記錄行數

(4)三種釋放 $res 結果集的方法

① $res->free(); ② $res->close(); ③ $res->free_result();

2.1.4、批量執行sql 語句

ddl 數據定義語句:CREATE TABLE

dml 數據操作語句:update、insert、delete

dql 數據查詢語句:select

dcl 數據事務語句:rollback、commit

(1)批量執行 dml 語句$sqls?=?"sql1;sql2;...";

$mysqli->multi_query($sqls);

(2)批量執行 dql 語句$mysqli->store_result();?//從?mysqli?連接取出一個結果集

$mysqli->fetch_row();

$mysqli->more_results();?//用于判斷是否有新的結果集

$mysqli->next_result();?//用于指向下一個結果集,但它不會判斷下一個結果集是否存在,故需使用?$mysqli->more_results()

2.2、事務控制

2.2.1、概念

事務用于保證數據的一致性,它由一組相關的 dml 語句組成,該組的 dml 語句要么全部成功,要么全部失敗。

如:網上轉賬就是典型的要用事務來處理,用以保證數據的一致性。

2.2.2、事務的 ACID 性質

① Atomicity 原子性:操作不可分割,要么都發生,要么都不發生

② Consistency 一致性:是一個數據庫從一個一致性狀態到另一個一致性狀態

③ Isolation 隔離性:一旦開始事務,別的操作無法使用你正在使用的數據庫

④ Durability 持久性:一旦提交,數據庫的狀態不再發生變化

2.2.3、在 mysqli 控制臺可以使用事務來操作

① start transaction 開啟一個事務

② savepoint a 保存點

③ 操作

④ 可回滾,可提交:若無問題 —— commit 提交,若有問題 —— rollback to a 回滾到 a

2.3、mysqli 擴展庫的預編譯處理技術

$sql?=?"insert?into?user?(name,password,email,age)?values(?,?,?,?)";

這里的 ? 是個占位符,告訴數據庫無需編譯,只是數據的變化。

優點:效率高,執行速度快;安全性高,防止 sql 注入。

2.4、PDO —— PHP Data Object

2.4.1、基本介紹

① 該擴展在 PHP 5 中加入

② PHP 6 中默認使用 PDO 連接數據庫

2.4.2、什么是 PDO

PDO 相當于是一個數據庫抽象層,不同數據庫使用相同的方法名,解決數據庫連接不統一的問題。

總結

以上是生活随笔為你收集整理的php万能查询用预,PHP 与 mysql的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。