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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php文件防删改,PHP实现增删改查以及防SQL注入

發布時間:2025/3/12 php 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php文件防删改,PHP实现增删改查以及防SQL注入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近項目調研時,需要在集成板子上做個配置的網頁,板子上裝的是linux系統,配置信息在一個SQLite數據庫中,經過討論大家決定用PHP做這個網頁。由于項目組沒一個會PHP的,所以安排我調研下寫個Demo,經過幾天的研究終于完成了Demo的調研(調研過程主要參考網絡,具體開發就交給月底入職的小弟去做了,哈哈,有個小弟真好),特此記錄(根據我調研的順序展開)。

項目截圖:

1.搭建環境 ? ? ? ? 首先當然是搭建環境了,我選擇的是phpstudy(下載和安裝可

參考,完全傻瓜式),編譯器選擇的是免費的Notepad++(只因為免費而選用,實際效果比記事本好點而已)。至此你可以開發第一個Hello World了。語法可

參考。發布也很簡單,只要把php文件放到網站目錄下就行了(如安裝教程中,目錄就是D:\WWW)。網站的端口號可以打開phpStudy主界面,點擊其他選項菜單,點擊myHomePage,就能看到端口號啦。

2.PHP從SQLite中讀取信息 ? ? ? ? 代碼如下:

if ($db = sqlite_open('GateWay.db')) {

$sql = "select * from ComInfo";

$res = sqlite_unbuffered_query($db, $sql);

echo "

echo "

comIdcomNamebaudparitydataBitstopBit";

echo"

";

while($item = sqlite_fetch_array($res, SQLITE_ASSOC))

{

echo "

";

echo "

".$item["comId"]."";

echo "

".$item["comName"]."";

echo "

".$item["baud"]."";

echo "

".$item["parity"]."";

echo "

".$item["dataBit"]."";

echo "

".$item["stopBit"]."";

}

echo "

";

sqlite_close($db);

}

3通過Ajax獲得信息 ? ? ? ? 作為一個網站,現在很少能看到每次提交刷新整個頁面的網站了。下面是通過Ajax請求獲得數據(這個跟html中類似,這邊用的是jQuery中封裝的Ajax):在頁面上有一個id為fullDataDiv的DIV用來裝獲取的數據,代碼如下:

//js代碼

var data={ opType:"ShowAllComInfo" };

$.post("ComInfoServer.php", data, function (result) {

$("#fullDataDiv").html(result);

});

//ComInfoServer.php頁面的代碼

$opType = $_POST["opType"];

switch($opType)

{

case "ShowAllComInfo":

{

if ($db = sqlite_open('GateWay.db')) {

$sql = "select * from ComInfo";

$res = sqlite_unbuffered_query($db, $sql);

echo "

echo "

comIdcomNamebaudparitydataBitstopBit";

echo"

";

while($item = sqlite_fetch_array($res, SQLITE_ASSOC))

{

echo "

";

echo "

".$item["comId"]."";

echo "

".$item["comName"]."";

echo "

".$item["baud"]."";

echo "

".$item["parity"]."";

echo "

".$item["dataBit"]."";

echo "

".$item["stopBit"]."";

}

echo "

";

sqlite_close($db);

}

}

break;

}

4.新建記錄 ? ? ? ? 接著是新建記錄,本質跟Ajax查詢類似,代碼如下:

//js代碼

var comName = $('#tbComName').val();

var baud = $("select#selBaud option:selected").text();

var parity = $("select#selParity option:selected").text();

var dataBit = $("select#selDataBit option:selected").text();

var stopBit = $("select#selStopBit option:selected").text();

var data={opType:"AddComInfo",comName: comName, baud: baud,parity:parity,dataBit:dataBit,stopBit:stopBit};

$.post("ComInfoServer.php", data, function (result) {

alert("Add Success!");

});

//ComInfoServer.php頁面的代碼

$comName =$_POST["comName"];

$baud = $_POST["baud"];

$parity = $_POST["parity"];

$dataBit = $_POST["dataBit"];

$stopBit = $_POST["stopBit"];

if ($db = sqlite_open($dbName)) {

$sql= "insert into ComInfo values(null,'".$comName."', '".$baud."','".$parity."', '".$dataBit."', '".$stopBit."')";

sqlite_query($db, $sql);

sqlite_close($db);

}

5.刪除記錄 ? ? ? ? 然后就是刪除記錄,比新增還簡單,只需要傳一個ID就行,ID在當前行的第一列(var comInfoid = $(this).parents("tr").find('td:first').text();),代碼跟新增類似,就不貼了。

6.編輯記錄 ? ? ? ? 最后是編輯,為了調研頁面跳轉,我把編輯放在另一個頁面,頁面傳值直接放在url中,EditComInfoServer.php頁面中放了一個隱藏控件保存ComInfoid的值,在頁面加載完畢之后根據id向服務端請求完整的數據。代碼如下:

//ComInfoMain.php的js代碼

$(".edit").click(function(){

var comInfoid = $(this).parents("tr").find('td:first').text();

window.location= "ComInfoServer.php?ComInfoid="+comInfoid;

});

//EditComInfoServer.php

//隱藏控件

//js代碼

$(function () {

var URL = "ComInfoHandler.ashx";

var data={ComInfoid: $("#tbComInfoid").val(),opType:"EditInit" };

$.post(URL, data, function (result) {

var info=eval("(" + result + ")");

comName =info.comName;

baud = info.baud;

parity = info.parity;

dataBit = info.dataBit;

stopBit = info.stopBit;

$("#tbComName").val(comName);

$("#selBaud option[value='"+baud+"']").attr("selected", true);

$("#selParity option[value='"+parity+"']").attr("selected", true);

$("#selDataBit option[value='"+dataBit+"']").attr("selected", true);

$("#selStopBit option[value='"+stopBit+"']").attr("selected", true);

});

});

7.PHP+Sqlite的防注入以及錯誤友好提示 ? ? ? ? 至此初步的增刪改查都實現了,但只是實現,根本沒考慮安全性。主要有三個方面:如果輸入數據庫的完整路徑,數據庫都被下載下來了;或者在comName里精心填入一些字符串就能實現SQL注入;另外出錯了,提示也很不友好,直接把程序信息都泄露出來了。

7.1防止數據庫被下載 ? ? ? ? 對于數據庫被下載(這個問題在Access和SQLite中都有),可以不讓其直接訪問,具體配置是在網站的根目錄新建一個文件名為.htaccess的文件(直接新建不了,可以另存為該文件,另外注意的是這個文件與PHP的版本有關,我用的是Apache+PHP5.3),用記事本打開寫入內容如下:

Deny from all

? ? ? ? 其他的設置在最新的版本中已經都是默認設置了,這樣,數據庫文件就不會被訪問下載了。

7.2防止SQL注入 ? ? ? ? 對于注入攻擊,從兩方面下手,前臺驗證輸入的內容(過濾一些注入的關鍵字),后臺再進行二次驗證。根據我們實際的業務,我在前臺只限制了長度,后臺對傳入的字符串進行加密之后存到數據庫中的,讀取的時候再解密。其中解密的幾個方法

來自這里。這樣做法其實對存儲有浪費的,經過測試,加密后的字符串長度是原來的兩到三倍,圖省事我把comName的字段類型改成了text。在實際操作時還遇到了截取字符串亂碼的問題,原因是substr在遇到漢字時會遇到編碼問題,因此采用mb_substr方法。代碼如下:

//新增或更新時

$postComName=$_POST["comName"];

if(strlen($postComName)>10)

{

$postComName=mb_substr($postComName,0,10,'utf-8');

}

$comName =passport_encrypt($postComName,$key);

//讀取時解密

$comName=passport_decrypt($item["comName"],$key);

7.3URL重寫 ? ? ? ? 在注入攻擊的問題上還可以通過重寫url隱藏網站的技術,當然這不能從本質上防SQL注入,只是提高注入的難度而已。在剛剛的.htaccess加入如下代碼:

RewriteEngine on

RewriteRule main.html ComInfoMain.php

RewriteRule ComInfoHandler.ashx ComInfoServer.php

RewriteRule ^edit([0-9]+)\.html$ EditComInfoServer.php?ComInfoid=$1

? ? ? ? 這樣訪問main.html就自動解析為ComInfoMain.php,其中第三個規則是用正則表達式實現,例如edit23.html就解析成EditComInfoServer.php?ComInfoid=23。這個調查了大半天,只因為網上的大多都是以訛傳訛(或許是版本的原因吧)。當然了,還有一個原因就是配置文件的苛刻要求。在調查期間刪除了一個"看似多余"空格導致Apache啟動不起來了,元兇如下:

? ? ? ? 這個空格刪除了就啟動不了Apache,而且沒有什么有效的提示,真坑爹。

7.4錯誤友好提示 ? ? ? ? 最后就是錯誤友好提示了,打開phpStudy主界面,點擊其他選項菜單,點擊打開配置文件選httpd.conf找到ErrorDocument 404,將其前面的#去除,在后面加上error的頁面,本例中設置是ErrorDocument 404 /error.html,這里表示error.html放在網站根目錄下。

至此全部完成,Demo很簡單,希望能對剛學PHP的讀者有些幫助,歡迎閱讀、討論、轉載,轉載請保留原文鏈接。

總結

以上是生活随笔為你收集整理的php文件防删改,PHP实现增删改查以及防SQL注入的全部內容,希望文章能夠幫你解決所遇到的問題。

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