上一篇文章分享了一個(gè)本地的實(shí)現(xiàn)方案,但是這個(gè)盡管打包成exe的完整包的方式,由于實(shí)現(xiàn)方式是使用python,打包出來(lái)后的文件里包含了使用到的庫(kù)和python運(yùn)行程序,啟動(dòng)時(shí)內(nèi)部會(huì)需要解壓出來(lái),所以啟動(dòng)會(huì)比較慢,大概3~5秒啟動(dòng),對(duì)于追求性能的優(yōu)秀人才就會(huì)覺(jué)得這個(gè)效率太低了,那能不能實(shí)現(xiàn)一個(gè)web方案,這樣web端提供一個(gè)傳入需要轉(zhuǎn)換的文件,然后返回一個(gè)轉(zhuǎn)換好的文件,這樣就不需要每個(gè)人的包都那么大,運(yùn)行還慢,而且還沒(méi)法實(shí)時(shí)更新。
<html>
<head>
<meta charset="UTF-8">
<title>文件上傳</title>
</head>
<body>
<form action="/uploadfile" method="POST" enctype="multipart/form-data">
<input type="file" name="uploadfile" />
<input type="submit" value="提交" />
</form>
</body>
</html>
from flask import Flask
from biz.openapi.com_api_webres import blue_webres_mgr
webapp=Flask(__name__, template_folder='../biz/templates')
webapp.register_blueprint(blueprint=blue_webres_mgr)
if __name__=='__main__':
webapp.run(port=8083)
blue_webres_mgr=Blueprint('webres_mgr', __name__, template_folder='../templates')
webconfig={}
webconfig['UPLOAD_FOLDER']='../upload/'
@blue_webres_mgr.route('/upload')
def upload_file():
return render_template('uploader.html')
@blue_webres_mgr.route('/uploadfile',methods=['GET','POST'])
def uploader_File():
if request.method=='POST':
f=request.files['uploadfile']
basefilepath=os.path.join(webconfig['UPLOAD_FOLDER']) + f.filename
newfilename=''
if os.path.exists(basefilepath):
fileext=os.path.splitext(f.filename)[-1]
filename=os.path.basename(f.filename).split(fileext)[0]
newfilename="{}_{}{}".format(filename, int(time.time()), fileext)
basefilepath="{}{}".format(os.path.join(webconfig['UPLOAD_FOLDER']),newfilename)
f.save(basefilepath)
transcsv=TransCSVDataToSql(basefilepath)
filepath, webdir, sqlfile=transcsv.TransFile()
linkurl='http://127.0.0.1/{}/{}'.format(webdir, sqlfile)
return render_template('downloadsql.html',transfile=f.filename,respath=filepath,linkurl=linkurl, sqlfile=sqlfile)
else:
return render_template('uploader.html')
啟動(dòng)nginx就可以了,當(dāng)然如果需要配置不同的端口,還有地址的,自行通過(guò)配置按鈕進(jìn)行配置
轉(zhuǎn)換后的文件直接存放到web網(wǎng)站的www下的工程目錄下
首先配置好自己的目錄地址
def __init__(self, csvFile:str):
self.CSVFile=csvFile
# 保存的文件名
self.SaveFile='trans_{}.sql'.format(time.time())
# 項(xiàng)目保存的目錄
self.WebDir='softfiles'
# phpstudy指定的www所在目錄+項(xiàng)目的目錄
self.WebbasePath='D:/phpstudy_pro/WWW/softfiles/'
配置的是WWW就是網(wǎng)站下的softfiles目錄下
配置web可以訪問(wèn)的到的地址
linkurl='http://127.0.0.1/{}/{}'.format(webdir, sqlfile)
如果發(fā)布在公網(wǎng)或者內(nèi)網(wǎng)上,則把127.0.0.1的IP更改為部署好的服務(wù)器域名或IP即可
配置下載頁(yè)面的html模板downloadsql.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>轉(zhuǎn)換好的sql</title>
</head>
<body>
<table border="1">
<tr>
<th>文件所在路徑</th>
<th>需要轉(zhuǎn)換的csv文件</th>
<th>轉(zhuǎn)換完成的sql文件</th>
<th>下載地址</th>
</tr>
<tr>
<td>{{respath}}</td>
<td>{{transfile}}</td>
<td>{{sqlfile}}</td>
<td><a href={{linkurl}}>下載地址</a></td>
</tr>
</table>
</body>
</html>
啟動(dòng)服務(wù)端,
啟動(dòng)Nginx,在瀏覽器中輸入
127.0.0.1:8083/upload
出現(xiàn)頁(yè)面
然后點(diǎn)擊瀏覽,打開(kāi)導(dǎo)出的csv文件
選擇好后點(diǎn)擊打開(kāi),最后點(diǎn)擊頁(yè)面中的“提交”按鈕
會(huì)展現(xiàn)一個(gè)下載頁(yè)面地址
點(diǎn)擊下載地址即可進(jìn)行轉(zhuǎn)換后的文件的下載,然后就可以使用這個(gè)sql腳本進(jìn)行刷庫(kù)了
通過(guò)這個(gè)web端的轉(zhuǎn)換,對(duì)于使用用戶來(lái)說(shuō),只需要輸入一個(gè)地址,然后上傳文件即可完成轉(zhuǎn)換工作,比本地版要快速很多,而且只要web端更新了新的解析規(guī)則,自己都不需要去處理,自然就能使用到最新的,啟動(dòng)效率也是大大提升。
好了,今天的分享就到這了,感謝大家的閱讀!
話說(shuō)選擇不對(duì),努力白費(fèi),對(duì)于C#的學(xué)習(xí)也是一樣方向不對(duì)努力白費(fèi)。
新手或者有經(jīng)驗(yàn)的開(kāi)發(fā)者學(xué)習(xí)c#時(shí)往往不知道該學(xué)習(xí)哪個(gè)技術(shù),哪些框架。
盲目的學(xué)習(xí)會(huì)導(dǎo)致不足以學(xué)以致用,下面就來(lái)分享幾個(gè)學(xué)習(xí)路線圖。
一、后端開(kāi)發(fā)路線
這條線路是純后端開(kāi)發(fā),主要做服務(wù)端開(kāi)發(fā),前后端分離是當(dāng)下的主流開(kāi)發(fā)模式。該路線方向需要學(xué)習(xí)以下技能:
1、基礎(chǔ)知識(shí):c#基礎(chǔ)知識(shí)、Asp.Net Core相關(guān)知識(shí)、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學(xué)習(xí)EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、數(shù)據(jù)庫(kù):MySql、SqlServer 深入學(xué)習(xí)其中一種即可,另一種需要熟悉
4、日志組件:NLog或者Serilog
5、定時(shí)框架:Quartz.Net Core或者Handfire
6、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
7、架構(gòu)方面:經(jīng)典三層、熟悉DDD架構(gòu)模式(可選)、熟悉微服務(wù)(可選)
8、CICD:熟悉Linux操作系統(tǒng)、Git代碼管理器、Doker(可選)、K8s(可選)
二、c/s客戶端開(kāi)發(fā)路線
當(dāng)下物聯(lián)網(wǎng)開(kāi)發(fā)正火很多大廠都在招物聯(lián)網(wǎng)技術(shù)開(kāi)發(fā)
1、基礎(chǔ)知識(shí):c#基礎(chǔ)知識(shí)、Asp.Net Core相關(guān)知識(shí)、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學(xué)習(xí)EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、數(shù)據(jù)庫(kù):MySql、SqlServer 深入學(xué)習(xí)其中一種即可,另一種需要熟悉
4、日志組件:NLog或者Serilog
5、定時(shí)框架:Quartz.Net Core或者Handfire
6、客戶端方面:Wpf(深入學(xué)習(xí))、MQtt協(xié)議、Winfrom(可選)
7、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
8、架構(gòu)方面:經(jīng)典三層、熟悉DDD架構(gòu)模式(可選)、熟悉微服務(wù)(可選)
9、CICD:熟悉Linux操作系統(tǒng)、Git代碼管理器、Doker(可選)、K8s(可選)
三、Web全棧開(kāi)發(fā)路線1
該路線是全棧開(kāi)發(fā),需要學(xué)習(xí)前端的一些基礎(chǔ)知識(shí):
1、基礎(chǔ)知識(shí):c#基礎(chǔ)知識(shí)、Asp.Net Core相關(guān)知識(shí)、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學(xué)習(xí)EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、數(shù)據(jù)庫(kù):MySql、SqlServer 深入學(xué)習(xí)其中一種即可,另一種需要熟悉
4、日志組件:NLog或者Serilog
5、定時(shí)框架:Quartz.Net Core或者Handfire
6、前端方面:Asp.Net Mvc、js、html、css、Vue(React、Angula js)
7、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
8、架構(gòu)方面:經(jīng)典三層、熟悉DDD架構(gòu)模式(可選)、熟悉微服務(wù)(可選)
9、CICD:熟悉Linux操作系統(tǒng)、Git代碼管理器、Doker(可選)、K8s(可選)
四、Web全棧開(kāi)發(fā)路線2
c#全棧開(kāi)發(fā)方向,使用c#開(kāi)發(fā)前后端功能,不需要學(xué)習(xí)js和html
1、基礎(chǔ)知識(shí):c#基礎(chǔ)知識(shí)、Asp.Net Core相關(guān)知識(shí)、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學(xué)習(xí)EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、數(shù)據(jù)庫(kù):MySql、SqlServer 深入學(xué)習(xí)其中一種即可,另一種需要熟悉
4、日志組件:NLog或者Serilog
5、定時(shí)框架:Quartz.Net Core或者Handfire
6、前端方面:Blazer(深入學(xué)習(xí))
7、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
8、架構(gòu)方面:經(jīng)典三層、熟悉DDD架構(gòu)模式(可選)、熟悉微服務(wù)(可選)
9、CICD:熟悉Linux操作系統(tǒng)、Git代碼管理器、Doker(可選)、K8s(可選)
五、游戲開(kāi)發(fā)路線
1、基礎(chǔ)知識(shí):c#基礎(chǔ)知識(shí)、Asp.Net Core相關(guān)知識(shí)、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學(xué)習(xí)EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、游戲引擎:Unity3d(深入學(xué)習(xí))
4、日志組件:NLog或者Serilog
5、定時(shí)框架:Quartz.Net Core或者Handfire
6、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
7、架構(gòu)方面:經(jīng)典三層、熟悉DDD架構(gòu)模式(可選)、熟悉微服務(wù)(可選)
8、CICD:熟悉Linux操作系統(tǒng)、Git代碼管理器、Doker(可選)、K8s(可選)
六、移動(dòng)端開(kāi)發(fā)路線
如果你項(xiàng)從事開(kāi)發(fā)移動(dòng)應(yīng)用,使用c#開(kāi)發(fā)原生安卓、IOS、Mac 應(yīng)用你需要掌握以下技術(shù)
1、基礎(chǔ)知識(shí):c#基礎(chǔ)知識(shí)、Asp.Net Core相關(guān)知識(shí)、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學(xué)習(xí)EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、數(shù)據(jù)庫(kù):SqlLite
4、日志組件:NLog或者Serilog
5、定時(shí)框架:Quartz.Net Core或者Handfire
6、客戶端方面:Xamarin(深入學(xué)習(xí))、Maui
7、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
8、架構(gòu)方面:經(jīng)典三層、熟悉DDD架構(gòu)模式(可選)、熟悉微服務(wù)(可選)
9、CICD:熟悉Linux操作系統(tǒng)、Git代碼管理器、Doker(可選)、K8s(可選)
學(xué)習(xí)路線四五條總有你在用的一條,如果你還有其他路線歡迎留言,一起探討新的學(xué)習(xí)方向。
#學(xué)編程#
京東SRC(Security Response Center)收錄大量外部白帽子提交的sql注入漏洞,漏洞發(fā)生的原因多為sql語(yǔ)句拼接和Mybatis使用不當(dāng)導(dǎo)致。
mysql5.0以上版本中存在一個(gè)重要的系統(tǒng)數(shù)據(jù)庫(kù)information_schema,通過(guò)此數(shù)據(jù)庫(kù)可訪問(wèn)mysql中存在的數(shù)據(jù)庫(kù)名、表名、字段名等元數(shù)據(jù)。information_schema中有三個(gè)表成為了sql注入構(gòu)造的關(guān)鍵。
SQL注入常用SQL函數(shù)
// sqli vuln code
Statement statement=con.createStatement();
String sql="select * from users where username='" + username + "'";
logger.info(sql);
ResultSet rs=statement.executeQuery(sql);
// fix code 如果要使用原始jdbc,請(qǐng)采用預(yù)編譯執(zhí)行
String sql="select * from users where username=?";
PreparedStatement st=con.prepareStatement(sql);
使用未預(yù)編譯原始jdbc作為demo,注意此demo中sql語(yǔ)句參數(shù)采用單引號(hào)閉合。
對(duì)于字符類型注入,通常先嘗試單引號(hào),判斷單引號(hào)是否被拼接到SQL語(yǔ)句中。推薦使用瀏覽器擴(kuò)展harkbar作為手工測(cè)試工具。https://chrome.google.com/webstore/detail/hackbar/ginpbkfigcoaokgflihfhhmglmbchinc
正常頁(yè)面應(yīng)該顯示如下:
admin后加單引號(hào)導(dǎo)致無(wú)信息回顯,原因是后端sql執(zhí)行報(bào)錯(cuò),說(shuō)明引號(hào)被拼接至SQL語(yǔ)句中
select * from users where username='admin' #正常sql
select * from users where username='admin'' #admin'被帶入sql執(zhí)行導(dǎo)致報(bào)錯(cuò)無(wú)法顯示信息
mysql中使用order by 進(jìn)行排序,不僅可以是字段名也可以是字段序號(hào)。所以可以用來(lái)判斷表中字段數(shù),order by 超過(guò)字段個(gè)數(shù)的數(shù)字就會(huì)報(bào)錯(cuò)。
判斷字段數(shù)
當(dāng)order by 超過(guò)4時(shí)會(huì)報(bào)錯(cuò),所以此表共四個(gè)字段。
后端所執(zhí)行的sql語(yǔ)句
select * from users where username='admin' order by 1-- '
此處我們將原本username的值admin替換為admin’ order by 1 —+,其中admin后的單引號(hào)用于閉合原本sql語(yǔ)句中的前引號(hào),—+用于注釋sql語(yǔ)句中的后引號(hào)?!蟮?號(hào)主要作用是提供一個(gè)空格,sql語(yǔ)句單行注釋后需有空格,+會(huì)被解碼為空格。
主要用于定位后端sql字段在前端顯示的位置,采用聯(lián)合查詢的方式確定。注意聯(lián)合查詢前后字段需一致,這也就是我們?yōu)槭裁醋龅诙降脑颉?/span>
通過(guò)下圖可知,后端查詢并回顯的字段位置為2,3位。
聯(lián)合查詢后的字段可以隨意,本次采用的是數(shù)字1到4直觀方便。
group_concat()函數(shù)用于將查詢結(jié)果拼接為字符串。
sqlmap兼容python2和python3,可以自動(dòng)化檢測(cè)各類注入和幾乎所有數(shù)據(jù)庫(kù)類型。
-u 可能存在注入的url鏈接
-r讀取http數(shù)據(jù)包
--data 指定post數(shù)據(jù)
--cookie 指定cookie
--headers 指定http頭 如采用token認(rèn)證的情況下
--threads 指定線程數(shù)
--dbms 指定后端的數(shù)據(jù)庫(kù)
--os 指定后端的操作系統(tǒng)類型
--current-user 當(dāng)前用戶
--users 所有用戶
--is-dba 是否是dba
--sql-shell 交互式的sqlshell
-p指定可能存在注入點(diǎn)的參數(shù)
--dbs 窮舉系統(tǒng)存在的數(shù)據(jù)庫(kù)
-D指定數(shù)據(jù)庫(kù)
--tables 窮舉存在的表
-T指定表
--column 窮舉字段
-C指定字段
--dump dump數(shù)據(jù)
直接檢測(cè)
其中—cookie用于指定cookie,—batch 自動(dòng)化執(zhí)行,—dbms指定數(shù)據(jù)庫(kù)類型
檢測(cè)結(jié)果
讀取系統(tǒng)中存在數(shù)據(jù)庫(kù)
—dbs讀取當(dāng)前用戶下的數(shù)據(jù)庫(kù)
讀取指定庫(kù)下的表
-D java_sec_code —tables
dump users表數(shù)據(jù)
-D java_sec_code -T users —dump
//采用#不會(huì)導(dǎo)致sql注入,mybatis會(huì)使用預(yù)編譯執(zhí)行
@Select("select * from users where username=#{username}")
User findByUserName(@Param("username") String username);
//采用$作為入?yún)⒖蓪?dǎo)致sql注入
@Select("select * from users where username='${username}'")
List<User> findByUserNameVuln01(@Param("username") String username);
//錯(cuò)誤寫(xiě)法
<select id="findByUserNameVuln02" parameterType="String" resultMap="User">
select * from users where username like '%${_parameter}%'
</select>
//正確寫(xiě)法
<select id="findByUserNameVuln02" parameterType="String" resultMap="User">
select * from users where username like concat(‘%’,#{_parameter}, ‘%’)
</select>
order by 后若使用#{}會(huì)導(dǎo)致報(bào)錯(cuò),因?yàn)?{}默認(rèn)添加引號(hào)會(huì)導(dǎo)致找不到字段從而報(bào)錯(cuò)。
//錯(cuò)誤寫(xiě)法
<select id="findByUserNameVuln03" parameterType="String" resultMap="User">
select * from users
<if test="order !=null">
order by ${order} asc
</if>
</select>
//正確寫(xiě)法 id指字段id 此表字段共四個(gè) 所以id為1-4
<select id="OrderByUsername" resultMap="User">
select * from users order by id asc limit 1
</select>
slqmap手冊(cè):https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/Users-manual/Introduction.html
sql注入詳解:http://sqlwiki.radare.cn/#/
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。