ASP跨服務(wù)器上傳文件完美解決
如果你有兩個空間,一個大而慢,另外一個小而快,或者其中一個不支持FSO,那么跨服務(wù)器上傳文件這個問題就擺在你面前了,下面就是我在解決00001.cn里面的跨服務(wù)器上傳文件的日記,這個問題看似簡單,里面的細節(jié)問題卻是非常有趣
前提條件,空間都必須支持ASP,上傳文件的服務(wù)器支持FSO,下面的敘述中,sd168.com為存上傳文件的服務(wù)器,00001.cn為網(wǎng)站服務(wù)器,即顯示用戶界面的服務(wù)器...
實現(xiàn)功能,文件上傳,上傳后在網(wǎng)頁的文本區(qū)域自動加上對于圖片的UBB碼,為了清楚,下面列出所有用到的文件
服務(wù)器 文件名 用途
sd168.com blog_upfile.asp 接收上傳文件用
00001.cn blog_add.asp 添加BLOG,上傳文件功能在此出現(xiàn)
00001.cn blog_upload.asp 上傳文件表單,以iframe的形式嵌在blog_add.asp里
00001.cn blog_upresult.asp 顯示上傳結(jié)果,作善后工作
00001.cn blog_upcheck.asp 驗證用戶名與密碼
在發(fā)布BLOG頁面Blog_add.asp增加一個iFrame,調(diào)用blog_upload.asp進行上傳操作
<iframe border="0" frameBorder="0" frameSpacing="0" height="25" marginHeight="0" marginWidth="0" noResize scrolling="no" width="100%" vspale="0" src="blog_upload.asp"></iframe>
如果你玩過ASP,自然不費吹灰之力想到,文件要傳到另外一個服務(wù)器上,只要把blog_upload.asp里的上傳Form的action頁面指向目標服務(wù)器就行了,
<form name="form" method="post" action="http://www.sd168.com/blog_UPFILE.ASP"
//中間略去
//提交時把發(fā)布BLOG的按紐disable先,以免沒傳完就時用戶把BLOG發(fā)表了
<input type="submit" class=button name="Submit" value=" 上 傳 " >
測試一下,文件上傳成功,那自動加UBB代碼呢...
在http://www.sd168.com/blog_UPFILE.ASP 里加一句js腳本
<>parent.frmAnnounce.Content.value+=''</>傳上去再測試,錯誤提示"blog_UPFILE.ASP 權(quán)限不夠",既然sd168.com的文件權(quán)限不夠,00001.cn總可以吧,當blog_upfile.asp操作完成時,再調(diào)用一個本服務(wù)器的ASP文件,于是blog_upresult.asp出現(xiàn)了,他負責(zé)善后
修改blog_upfile.asp,我用C++的習(xí)慣,注釋用//符
servername="www.00001.cn" //標志服務(wù)器名
//檢查來源,是否為自己指定的服務(wù)器,
if not instr(1,Request.ServerVariables("http_Referer"),servername,1)=8 then
response.write "非法來源~!"
response.end
end if
//檢查文件大小,類型,等,這些代碼略去,網(wǎng)上很多關(guān)于FSO組件的介紹
...
//上傳代碼,略去
....
//成功后轉(zhuǎn)向的URL,就是執(zhí)行上傳操作的地址,把信息當作msg傳過去
url="http://"&servername&"/blog_upresult.asp?msg="
if 上傳成功 then//把腳本傳過去,因為JS中的+號不能被傳遞.因此使用server.urlencode函數(shù),此腳本在00001.cn上才有權(quán)限運行
url=url+ "<>parent.frmAnnounce.Content.value"&server.urlencode("+")&"=''</>"
//把文件名也傳送過去,以便存數(shù)據(jù)庫備查
response.redirect url+"上傳成功&filename="&FileName
end if
下面就是blog_upresult.asp上的代碼了,很簡單
//傳成功了,自然要把已經(jīng)diable的提交BLOG按紐恢復(fù)
<>
parent.frmAnnounce.Submit.disabled=false;
</>
//還有就是把傳過來的信息顯示出來
response.write request("msg")
//如果request("filename")<>"" 寫入數(shù)據(jù)庫代碼省略
response.write "[ <a href=# onclick=history.go(-1)>重新上傳</a> ]"
看上去perfect了,但如人家得到了你的源碼的話,輕而易舉把你的上傳服務(wù)器當成網(wǎng)絡(luò)硬盤用....
只要把hosts文件里的中一句 127.0.0.1 www.00001.cn
然后相應(yīng)寫一個提交文件用的blog_upload.asp就行了,
頭疼ing,代碼是不能允許有半點安全漏洞的,驗證的域名能被欺騙,
那就驗證上傳者的用戶名與密碼,diygame.com怎么去ylog.net的數(shù)據(jù)庫上去查詢用戶名與密碼是否正確呢
這就少不了xmlhttp
先在00001.cn上做一個blog_upcheck.asp,內(nèi)容非常簡單,對傳的用戶名與密碼驗證,成功則輸出1,失敗則輸出0
<%
name=request("name")
psw=request("psw")
checkstr(name)//濾掉SQL字符
checkstr(psw))//濾掉SQL字符
if 從數(shù)據(jù)庫檢查用戶名=成功 then
response.write 0
else
response.write 1
end if
%>
blog_upfile.asp接受上傳之前先調(diào)用此文件驗證.下面為代碼,雖然也是使用域名www.ylog.net但此操作在diygame.com的服務(wù)器上執(zhí)行,所以與使用者本地的hosts文件無關(guān)
<%
str=getHTTPPage("http://"&servername&"/blog_upcheck.asp?name="&name&"&psw="&password)
if str<>"1" then
response.write "非法用戶~!"
response.end
end if
//兩個操作函數(shù)。非常有用,可以用到別的地方
Function getHTTPPage(URL)
Set HTTPReq = Server.createobject("Microsoft.XMLHTTP")
HTTPReq.Open "GET", URL, False
HTTPReq.send
If HTTPReq.readyState <> 4 Then Exit Function
getHTTPPage = bytes2BSTR(HTTPReq.responseBody)
Set HTTPReq = Nothing
End Function
Function bytes2BSTR(vIn)
Dim strReturn
Dim I, ThisCharCode, NextCharCode
strReturn = ""
For I = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn, I, 1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn, I + 1, 1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
I = I + 1
End If
Next
bytes2BSTR = strReturn
End Function
%>
關(guān)鍵字:ASP、服務(wù)器、網(wǎng)站
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認iptable規(guī)則詳解