国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 后端開發(fā) php教程 php數(shù)據(jù)庫安全——SQL注入及預(yù)防措施

php數(shù)據(jù)庫安全——SQL注入及預(yù)防措施

Nov 22, 2016 am 10:45 AM
php php數(shù)據(jù)庫

很多 web 開發(fā)者沒有注意到 SQL 查詢是可以被篡改的,因而把 SQL 查詢當(dāng)作可信任的命令。殊不知道,SQL 查詢可以繞開訪問控制,從而繞過身份驗(yàn)證和權(quán)限檢查。更有甚者,有可能通過 SQL 查詢?nèi)ミ\(yùn)行主機(jī)操作系統(tǒng)級(jí)的命令。

直接 SQL 命令注入就是攻擊者常用的一種創(chuàng)建或修改已有 SQL 語句的技術(shù),從而達(dá)到取得隱藏?cái)?shù)據(jù),或覆蓋關(guān)鍵的值,甚至執(zhí)行數(shù)據(jù)庫主機(jī)操作系統(tǒng)命令的目的。這是通過應(yīng)用程序取得用戶輸入并與靜態(tài)參數(shù)組合成 SQL 查詢來實(shí)現(xiàn)的。下面將會(huì)給出一些真實(shí)的例子。

由于在缺乏對(duì)輸入的數(shù)據(jù)進(jìn)行驗(yàn)證,并且使用了超級(jí)用戶或其它有權(quán)創(chuàng)建新用戶的數(shù)據(jù)庫帳號(hào)來連接,攻擊者可以在數(shù)據(jù)庫中新建一個(gè)超級(jí)用戶。

Example #1 一段實(shí)現(xiàn)數(shù)據(jù)分頁顯示的代碼……也可以被用作創(chuàng)建一個(gè)超級(jí)用戶(PostgreSQL系統(tǒng))。

<?php
    $offset = $argv[0]; // 注意,沒有輸入驗(yàn)證!
    $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
    $result = pg_query($conn, $query);
?>

一般的用戶會(huì)點(diǎn)擊 $offset 已被斌值的“上一頁”、“下一頁”的鏈接。原本代碼只會(huì)認(rèn)為 $offset 是一個(gè)數(shù)值。然而,如果有人嘗試把以下語句先經(jīng)過 urlencode() 處理,然后加入U(xiǎn)RL中的話:

0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
    select &#39;crack&#39;, usesysid, &#39;t&#39;,&#39;t&#39;,&#39;crack&#39;
    from pg_shadow where usename=&#39;postgres&#39;;
--

那么他就可以創(chuàng)建一個(gè)超級(jí)用戶了。注意那個(gè) 0; 只不過是為了提供一個(gè)正確的偏移量以便補(bǔ)充完整原來的查詢,使它不要出錯(cuò)而已。

Note:

-- 是 SQL 的注釋標(biāo)記,一般可以使用來它告訴 SQL 解釋器忽略后面的語句。

對(duì)顯示搜索結(jié)果的頁面下手是一個(gè)能得到密碼的可行辦法。攻擊者所要做的只不過是找出哪些提交上去的變量是用于 SQL 語句并且處理不當(dāng)?shù)?。而這類的變量通常都被用于SELECT 查詢中的條件語句,如 WHERE, ORDER BY, LIMIT 和 OFFSET。如果數(shù)據(jù)庫支持 UNION 構(gòu)造的話,攻擊者還可能會(huì)把一個(gè)完整的 SQL 查詢附加到原來的語句上以便從任意數(shù)據(jù)表中得到密碼。因此,對(duì)密碼字段加密是很重要的。

Example #2 顯示文章……以及一些密碼(任何數(shù)據(jù)庫系統(tǒng))

<?php
    $query = "SELECT id, name, inserted, size FROM products
        WHERE size = &#39;$size&#39;
        ORDER BY $order LIMIT $limit, $offset;";
    $result = odbc_exec($conn, $query);
?>

可以在原來的查詢的基礎(chǔ)上添加另一個(gè) SELECT 查詢來獲得密碼:

&#39;
union select &#39;1&#39;, concat(uname||&#39;-&#39;||passwd) as name, &#39;1971-01-01&#39;, &#39;0&#39; from usertable;
--

假如上述語句(使用 ' 和 --)被加入到 $query 中的任意一個(gè)變量的話,那么就麻煩了。

SQL 中的 UPDATE 也會(huì)受到攻擊。這種查詢也可能像上面的例子那樣被插入或附加上另一個(gè)完整的請(qǐng)求。但是攻擊者更愿意對(duì) SET 子句下手,這樣他們就可以更改數(shù)據(jù)表中的一些數(shù)據(jù)。這種情況下必須要知道數(shù)據(jù)庫的結(jié)構(gòu)才能修改查詢成功進(jìn)行??梢酝ㄟ^表單上的變量名對(duì)字段進(jìn)行猜測,或者進(jìn)行暴力破解。對(duì)于存放用戶名和密碼的字段,命名的方法并不多。

Example #3 從重設(shè)密碼……到獲得更多權(quán)限(任何數(shù)據(jù)庫系統(tǒng))

<?php
    $query = "UPDATE usertable SET pwd=&#39;$pwd&#39; WHERE uid=&#39;$uid&#39;;";
?>

但是惡意的用戶會(huì)把 ' or uid like'%admin%'; -- 作為變量的值提交給 $uid 來改變 admin 的密碼,或者把 $pwd 的值提交為 "hehehe', admin='yes', trusted=100 "(后面有個(gè)空格)去獲得更多的權(quán)限。這樣做的話,查詢語句實(shí)際上就變成了:

<?php
    // $uid == &#39; or uid like&#39;%admin%&#39;; --
    $query = "UPDATE usertable SET pwd=&#39;...&#39; WHERE uid=&#39;&#39; or uid like &#39;%admin%&#39;; --";
    // $pwd == "hehehe&#39;, admin=&#39;yes&#39;, trusted=100 "
    $query = "UPDATE usertable SET pwd=&#39;hehehe&#39;, admin=&#39;yes&#39;, trusted=100 WHERE
        ...;";
?>

下面這個(gè)可怕的例子將會(huì)演示如何在某些數(shù)據(jù)庫上執(zhí)行系統(tǒng)命令。

Example #4 攻擊數(shù)據(jù)庫所在主機(jī)的操作系統(tǒng)(MSSQL Server)

<?php
    $query  = "SELECT * FROM products WHERE id LIKE &#39;%$prod%&#39;";
    $result = mssql_query($query);
?>

如果攻擊提交 a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- 作為變量 $prod的值,那么 $query 將會(huì)變成

<?php
    $query = "SELECT * FROM products WHERE id LIKE &#39;%a%&#39;
        exec master..xp_cmdshell &#39;net user test testpass /ADD&#39;--";
    $result = mssql_query($query);
?>

MSSQL 服務(wù)器會(huì)執(zhí)行這條 SQL 語句,包括它后面那個(gè)用于向系統(tǒng)添加用戶的命令。如果這個(gè)程序是以 sa 運(yùn)行而 MSSQLSERVER 服務(wù)又有足夠的權(quán)限的話,攻擊者就可以獲得一個(gè)系統(tǒng)帳號(hào)來訪問主機(jī)了。

Note:

雖然以上的例子是針對(duì)某一特定的數(shù)據(jù)庫系統(tǒng)的,但是這并不代表不能對(duì)其它數(shù)據(jù)庫系統(tǒng)實(shí)施類似的攻擊。使用不同的方法,各種數(shù)據(jù)庫都有可能遭殃。

預(yù)防措施

也許有人會(huì)自我安慰,說攻擊者要知道數(shù)據(jù)庫結(jié)構(gòu)的信息才能實(shí)施上面的攻擊。沒錯(cuò),確實(shí)如此。但沒人能保證攻擊者一定得不到這些信息,一但他們得到了,數(shù)據(jù)庫有泄露的危險(xiǎn)。如果你在用開放源代碼的軟件包來訪問數(shù)據(jù)庫,比如論壇程序,攻擊者就很容得到到相關(guān)的代碼。如果這些代碼設(shè)計(jì)不良的話,風(fēng)險(xiǎn)就更大了。

這些攻擊總是建立在發(fā)掘安全意識(shí)不強(qiáng)的代碼上的。所以,永遠(yuǎn)不要信任外界輸入的數(shù)據(jù),特別是來自于客戶端的,包括選擇框、表單隱藏域和 cookie。就如上面的第一個(gè)例子那樣,就算是正常的查詢也有可能造成災(zāi)難。

永遠(yuǎn)不要使用超級(jí)用戶或所有者帳號(hào)去連接數(shù)據(jù)庫。要用權(quán)限被嚴(yán)格限制的帳號(hào)。

檢查輸入的數(shù)據(jù)是否具有所期望的數(shù)據(jù)格式。PHP 有很多可以用于檢查輸入的函數(shù),從簡單的變量函數(shù)和字符類型函數(shù)(比如 is_numeric(), ctype_digit())到復(fù)雜的Perl 兼容正則表達(dá)式函數(shù)都可以完成這個(gè)工作。

如果程序等待輸入一個(gè)數(shù)字,可以考慮使用 is_numeric() 來檢查,或者直接使用 settype() 來轉(zhuǎn)換它的類型,也可以用 sprintf() 把它格式化為數(shù)字。

Example #5 一個(gè)實(shí)現(xiàn)分頁更安全的方法

<?php
    settype($offset, &#39;integer&#39;);
    $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
    // 請(qǐng)注意格式字符串中的 %d,如果用 %s 就毫無意義了
    $query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
        $offset);
?>

使用數(shù)據(jù)庫特定的敏感字符轉(zhuǎn)義函數(shù)(比如?mysql_escape_string()?和?sql_escape_string())把用戶提交上來的非數(shù)字?jǐn)?shù)據(jù)進(jìn)行轉(zhuǎn)義。如果數(shù)據(jù)庫沒有專門的敏感字符轉(zhuǎn)義功能的話?addslashes()?和?str_replace()?可以代替完成這個(gè)工作??纯吹谝粋€(gè)例子,此例顯示僅在查詢的靜態(tài)部分加上引號(hào)是不夠的,查詢很容易被攻破。

要不擇手段避免顯示出任何有關(guān)數(shù)據(jù)庫的信心,尤其是數(shù)據(jù)庫結(jié)構(gòu)。

也可以選擇使用數(shù)據(jù)庫的存儲(chǔ)過程和預(yù)定義指針等特性來抽象數(shù)庫訪問,使用戶不能直接訪問數(shù)據(jù)表和視圖。但這個(gè)辦法又有別的影響。

除此之外,在允許的情況下,使用代碼或數(shù)據(jù)庫系統(tǒng)保存查詢?nèi)罩疽彩且粋€(gè)好辦法。顯然,日志并不能防止任何攻擊,但利用它可以跟蹤到哪個(gè)程序曾經(jīng)被嘗試攻擊過。日志本身沒用,要查閱其中包含的信息才行。畢竟,更多的信息總比沒有要好。


本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
PHP調(diào)用AI智能語音助手 PHP語音交互系統(tǒng)搭建 PHP調(diào)用AI智能語音助手 PHP語音交互系統(tǒng)搭建 Jul 25, 2025 pm 08:45 PM

用戶語音輸入通過前端JavaScript的MediaRecorderAPI捕獲并發(fā)送至PHP后端;2.PHP將音頻保存為臨時(shí)文件后調(diào)用STTAPI(如Google或百度語音識(shí)別)轉(zhuǎn)換為文本;3.PHP將文本發(fā)送至AI服務(wù)(如OpenAIGPT)獲取智能回復(fù);4.PHP再調(diào)用TTSAPI(如百度或Google語音合成)將回復(fù)轉(zhuǎn)為語音文件;5.PHP將語音文件流式返回前端播放,完成交互。整個(gè)流程由PHP主導(dǎo)數(shù)據(jù)流轉(zhuǎn)與錯(cuò)誤處理,確保各環(huán)節(jié)無縫銜接。

如何用PHP搭建社交分享功能 PHP分享接口集成實(shí)戰(zhàn) 如何用PHP搭建社交分享功能 PHP分享接口集成實(shí)戰(zhàn) Jul 25, 2025 pm 08:51 PM

在PHP中搭建社交分享功能的核心方法是通過動(dòng)態(tài)生成符合各平臺(tái)要求的分享鏈接。1.首先獲取當(dāng)前頁面或指定的URL及文章信息;2.使用urlencode對(duì)參數(shù)進(jìn)行編碼;3.根據(jù)各平臺(tái)協(xié)議拼接生成分享鏈接;4.在前端展示鏈接供用戶點(diǎn)擊分享;5.動(dòng)態(tài)生成頁面OG標(biāo)簽優(yōu)化分享內(nèi)容展示;6.務(wù)必對(duì)用戶輸入進(jìn)行轉(zhuǎn)義以防止XSS攻擊。該方法無需復(fù)雜認(rèn)證,維護(hù)成本低,適用于大多數(shù)內(nèi)容分享需求。

如何用PHP結(jié)合AI實(shí)現(xiàn)文本糾錯(cuò) PHP語法檢測與優(yōu)化 如何用PHP結(jié)合AI實(shí)現(xiàn)文本糾錯(cuò) PHP語法檢測與優(yōu)化 Jul 25, 2025 pm 08:57 PM

要實(shí)現(xiàn)PHP結(jié)合AI進(jìn)行文本糾錯(cuò)與語法優(yōu)化,需按以下步驟操作:1.選擇適合的AI模型或API,如百度、騰訊API或開源NLP庫;2.通過PHP的curl或Guzzle調(diào)用API并處理返回結(jié)果;3.在應(yīng)用中展示糾錯(cuò)信息并允許用戶選擇是否采納;4.使用php-l和PHP_CodeSniffer進(jìn)行語法檢測與代碼優(yōu)化;5.持續(xù)收集反饋并更新模型或規(guī)則以提升效果。選擇AIAPI時(shí)應(yīng)重點(diǎn)評(píng)估準(zhǔn)確率、響應(yīng)速度、價(jià)格及對(duì)PHP的支持。代碼優(yōu)化應(yīng)遵循PSR規(guī)范、合理使用緩存、避免循環(huán)查詢、定期審查代碼,并借助X

PHP打造博客評(píng)論系統(tǒng)變現(xiàn) PHP評(píng)論審核與防刷策略 PHP打造博客評(píng)論系統(tǒng)變現(xiàn) PHP評(píng)論審核與防刷策略 Jul 25, 2025 pm 08:27 PM

1.評(píng)論系統(tǒng)商業(yè)價(jià)值最大化需結(jié)合原生廣告精準(zhǔn)投放、用戶付費(fèi)增值服務(wù)(如上傳圖片、評(píng)論置頂)、基于評(píng)論質(zhì)量的影響力激勵(lì)機(jī)制及合規(guī)匿名數(shù)據(jù)洞察變現(xiàn);2.審核策略應(yīng)采用前置審核 動(dòng)態(tài)關(guān)鍵詞過濾 用戶舉報(bào)機(jī)制組合,輔以評(píng)論質(zhì)量評(píng)分實(shí)現(xiàn)內(nèi)容分級(jí)曝光;3.防刷需構(gòu)建多層防御:reCAPTCHAv3無感驗(yàn)證、Honeypot蜜罐字段識(shí)別機(jī)器人、IP與時(shí)間戳頻率限制阻止灌水、內(nèi)容模式識(shí)別標(biāo)記可疑評(píng)論,持續(xù)迭代應(yīng)對(duì)攻擊。

PHP實(shí)現(xiàn)商品庫存管理變現(xiàn) PHP庫存同步與報(bào)警機(jī)制 PHP實(shí)現(xiàn)商品庫存管理變現(xiàn) PHP庫存同步與報(bào)警機(jī)制 Jul 25, 2025 pm 08:30 PM

PHP通過數(shù)據(jù)庫事務(wù)與FORUPDATE行鎖確保庫存扣減原子性,防止高并發(fā)超賣;2.多平臺(tái)庫存一致性需依賴中心化管理與事件驅(qū)動(dòng)同步,結(jié)合API/Webhook通知及消息隊(duì)列保障數(shù)據(jù)可靠傳遞;3.報(bào)警機(jī)制應(yīng)分場景設(shè)置低庫存、零/負(fù)庫存、滯銷、補(bǔ)貨周期和異常波動(dòng)策略,并按緊急程度選擇釘釘、短信或郵件通知責(zé)任人,且報(bào)警信息需完整明確,以實(shí)現(xiàn)業(yè)務(wù)適配與快速響應(yīng)。

如何用PHP結(jié)合AI做圖像生成 PHP自動(dòng)生成藝術(shù)作品 如何用PHP結(jié)合AI做圖像生成 PHP自動(dòng)生成藝術(shù)作品 Jul 25, 2025 pm 07:21 PM

PHP不直接進(jìn)行AI圖像處理,而是通過API集成,因?yàn)樗瞄LWeb開發(fā)而非計(jì)算密集型任務(wù),API集成能實(shí)現(xiàn)專業(yè)分工、降低成本、提升效率;2.整合關(guān)鍵技術(shù)包括使用Guzzle或cURL發(fā)送HTTP請(qǐng)求、JSON數(shù)據(jù)編解碼、API密鑰安全認(rèn)證、異步隊(duì)列處理耗時(shí)任務(wù)、健壯錯(cuò)誤處理與重試機(jī)制、圖像存儲(chǔ)與展示;3.常見挑戰(zhàn)有API成本失控、生成結(jié)果不可控、用戶體驗(yàn)差、安全風(fēng)險(xiǎn)和數(shù)據(jù)管理難,應(yīng)對(duì)策略分別為設(shè)置用戶配額與緩存、提供prompt指導(dǎo)與多圖選擇、異步通知與進(jìn)度提示、密鑰環(huán)境變量存儲(chǔ)與內(nèi)容審核、云存

超越燈堆:PHP在現(xiàn)代企業(yè)體系結(jié)構(gòu)中的作用 超越燈堆:PHP在現(xiàn)代企業(yè)體系結(jié)構(gòu)中的作用 Jul 27, 2025 am 04:31 AM

PHPisstillrelevantinmodernenterpriseenvironments.1.ModernPHP(7.xand8.x)offersperformancegains,stricttyping,JITcompilation,andmodernsyntax,makingitsuitableforlarge-scaleapplications.2.PHPintegrateseffectivelyinhybridarchitectures,servingasanAPIgateway

PHP集成AI語音識(shí)別與轉(zhuǎn)寫 PHP會(huì)議記錄自動(dòng)生成方案 PHP集成AI語音識(shí)別與轉(zhuǎn)寫 PHP會(huì)議記錄自動(dòng)生成方案 Jul 25, 2025 pm 07:06 PM

選擇合適AI語音識(shí)別服務(wù)并集成PHPSDK;2.用PHP調(diào)用ffmpeg將錄音轉(zhuǎn)為API要求格式(如wav);3.上傳文件至云存儲(chǔ)并調(diào)用API異步識(shí)別;4.解析JSON結(jié)果并用NLP技術(shù)整理文本;5.生成Word或Markdown文檔完成會(huì)議記錄自動(dòng)化,全過程需確保數(shù)據(jù)加密、訪問控制與合規(guī)性以保障隱私安全。

See all articles