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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人信用卡最高额度是多少 无限卡你hol
- 下一篇: 微信零钱通可以随时转出吗?可以随时提现吗