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注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自考计算机软件基础交作业,全国2009年
- 下一篇: 动态规划算法php,php算法学习之动态