Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
上一篇文章分享了一個本地的實現方案,但是這個盡管打包成exe的完整包的方式,由于實現方式是使用python,打包出來后的文件里包含了使用到的庫和python運行程序,啟動時內部會需要解壓出來,所以啟動會比較慢,大概3~5秒啟動,對于追求性能的優秀人才就會覺得這個效率太低了,那能不能實現一個web方案,這樣web端提供一個傳入需要轉換的文件,然后返回一個轉換好的文件,這樣就不需要每個人的包都那么大,運行還慢,而且還沒法實時更新。
<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')
啟動nginx就可以了,當然如果需要配置不同的端口,還有地址的,自行通過配置按鈕進行配置
轉換后的文件直接存放到web網站的www下的工程目錄下
首先配置好自己的目錄地址
def __init__(self, csvFile:str):
self.CSVFile=csvFile
# 保存的文件名
self.SaveFile='trans_{}.sql'.format(time.time())
# 項目保存的目錄
self.WebDir='softfiles'
# phpstudy指定的www所在目錄+項目的目錄
self.WebbasePath='D:/phpstudy_pro/WWW/softfiles/'
配置的是WWW就是網站下的softfiles目錄下
配置web可以訪問的到的地址
linkurl='http://127.0.0.1/{}/{}'.format(webdir, sqlfile)
如果發布在公網或者內網上,則把127.0.0.1的IP更改為部署好的服務器域名或IP即可
配置下載頁面的html模板downloadsql.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>轉換好的sql</title>
</head>
<body>
<table border="1">
<tr>
<th>文件所在路徑</th>
<th>需要轉換的csv文件</th>
<th>轉換完成的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>
啟動服務端,
啟動Nginx,在瀏覽器中輸入
127.0.0.1:8083/upload
出現頁面
然后點擊瀏覽,打開導出的csv文件
選擇好后點擊打開,最后點擊頁面中的“提交”按鈕
會展現一個下載頁面地址
點擊下載地址即可進行轉換后的文件的下載,然后就可以使用這個sql腳本進行刷庫了
通過這個web端的轉換,對于使用用戶來說,只需要輸入一個地址,然后上傳文件即可完成轉換工作,比本地版要快速很多,而且只要web端更新了新的解析規則,自己都不需要去處理,自然就能使用到最新的,啟動效率也是大大提升。
好了,今天的分享就到這了,感謝大家的閱讀!
話說選擇不對,努力白費,對于C#的學習也是一樣方向不對努力白費。
新手或者有經驗的開發者學習c#時往往不知道該學習哪個技術,哪些框架。
盲目的學習會導致不足以學以致用,下面就來分享幾個學習路線圖。
一、后端開發路線
這條線路是純后端開發,主要做服務端開發,前后端分離是當下的主流開發模式。該路線方向需要學習以下技能:
1、基礎知識:c#基礎知識、Asp.Net Core相關知識、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學習EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、數據庫:MySql、SqlServer 深入學習其中一種即可,另一種需要熟悉
4、日志組件:NLog或者Serilog
5、定時框架:Quartz.Net Core或者Handfire
6、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
7、架構方面:經典三層、熟悉DDD架構模式(可選)、熟悉微服務(可選)
8、CICD:熟悉Linux操作系統、Git代碼管理器、Doker(可選)、K8s(可選)
二、c/s客戶端開發路線
當下物聯網開發正火很多大廠都在招物聯網技術開發
1、基礎知識:c#基礎知識、Asp.Net Core相關知識、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學習EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、數據庫:MySql、SqlServer 深入學習其中一種即可,另一種需要熟悉
4、日志組件:NLog或者Serilog
5、定時框架:Quartz.Net Core或者Handfire
6、客戶端方面:Wpf(深入學習)、MQtt協議、Winfrom(可選)
7、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
8、架構方面:經典三層、熟悉DDD架構模式(可選)、熟悉微服務(可選)
9、CICD:熟悉Linux操作系統、Git代碼管理器、Doker(可選)、K8s(可選)
三、Web全棧開發路線1
該路線是全棧開發,需要學習前端的一些基礎知識:
1、基礎知識:c#基礎知識、Asp.Net Core相關知識、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學習EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、數據庫:MySql、SqlServer 深入學習其中一種即可,另一種需要熟悉
4、日志組件:NLog或者Serilog
5、定時框架:Quartz.Net Core或者Handfire
6、前端方面:Asp.Net Mvc、js、html、css、Vue(React、Angula js)
7、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
8、架構方面:經典三層、熟悉DDD架構模式(可選)、熟悉微服務(可選)
9、CICD:熟悉Linux操作系統、Git代碼管理器、Doker(可選)、K8s(可選)
四、Web全棧開發路線2
c#全棧開發方向,使用c#開發前后端功能,不需要學習js和html
1、基礎知識:c#基礎知識、Asp.Net Core相關知識、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學習EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、數據庫:MySql、SqlServer 深入學習其中一種即可,另一種需要熟悉
4、日志組件:NLog或者Serilog
5、定時框架:Quartz.Net Core或者Handfire
6、前端方面:Blazer(深入學習)
7、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
8、架構方面:經典三層、熟悉DDD架構模式(可選)、熟悉微服務(可選)
9、CICD:熟悉Linux操作系統、Git代碼管理器、Doker(可選)、K8s(可選)
五、游戲開發路線
1、基礎知識:c#基礎知識、Asp.Net Core相關知識、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學習EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、游戲引擎:Unity3d(深入學習)
4、日志組件:NLog或者Serilog
5、定時框架:Quartz.Net Core或者Handfire
6、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
7、架構方面:經典三層、熟悉DDD架構模式(可選)、熟悉微服務(可選)
8、CICD:熟悉Linux操作系統、Git代碼管理器、Doker(可選)、K8s(可選)
六、移動端開發路線
如果你項從事開發移動應用,使用c#開發原生安卓、IOS、Mac 應用你需要掌握以下技術
1、基礎知識:c#基礎知識、Asp.Net Core相關知識、Asp.Net Core Web Api、Asp.Net Core Aap.Net Mvc(可選) 、Grpc
2、ORM:主要學習EF Core、Dapper(其他流行ORM也行但盡量走主流路線)
3、數據庫:SqlLite
4、日志組件:NLog或者Serilog
5、定時框架:Quartz.Net Core或者Handfire
6、客戶端方面:Xamarin(深入學習)、Maui
7、分布式組件:Redis、RabbitMQ、Mongdb(可選)、Kafka(可選)
8、架構方面:經典三層、熟悉DDD架構模式(可選)、熟悉微服務(可選)
9、CICD:熟悉Linux操作系統、Git代碼管理器、Doker(可選)、K8s(可選)
學習路線四五條總有你在用的一條,如果你還有其他路線歡迎留言,一起探討新的學習方向。
#學編程#
京東SRC(Security Response Center)收錄大量外部白帽子提交的sql注入漏洞,漏洞發生的原因多為sql語句拼接和Mybatis使用不當導致。
mysql5.0以上版本中存在一個重要的系統數據庫information_schema,通過此數據庫可訪問mysql中存在的數據庫名、表名、字段名等元數據。information_schema中有三個表成為了sql注入構造的關鍵。
SQL注入常用SQL函數
// 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,請采用預編譯執行
String sql="select * from users where username=?";
PreparedStatement st=con.prepareStatement(sql);
使用未預編譯原始jdbc作為demo,注意此demo中sql語句參數采用單引號閉合。
對于字符類型注入,通常先嘗試單引號,判斷單引號是否被拼接到SQL語句中。推薦使用瀏覽器擴展harkbar作為手工測試工具。https://chrome.google.com/webstore/detail/hackbar/ginpbkfigcoaokgflihfhhmglmbchinc
正常頁面應該顯示如下:
admin后加單引號導致無信息回顯,原因是后端sql執行報錯,說明引號被拼接至SQL語句中
select * from users where username='admin' #正常sql
select * from users where username='admin'' #admin'被帶入sql執行導致報錯無法顯示信息
mysql中使用order by 進行排序,不僅可以是字段名也可以是字段序號。所以可以用來判斷表中字段數,order by 超過字段個數的數字就會報錯。
判斷字段數
當order by 超過4時會報錯,所以此表共四個字段。
后端所執行的sql語句
select * from users where username='admin' order by 1-- '
此處我們將原本username的值admin替換為admin’ order by 1 —+,其中admin后的單引號用于閉合原本sql語句中的前引號,—+用于注釋sql語句中的后引號。—后的+號主要作用是提供一個空格,sql語句單行注釋后需有空格,+會被解碼為空格。
主要用于定位后端sql字段在前端顯示的位置,采用聯合查詢的方式確定。注意聯合查詢前后字段需一致,這也就是我們為什么做第二步的原因。
通過下圖可知,后端查詢并回顯的字段位置為2,3位。
聯合查詢后的字段可以隨意,本次采用的是數字1到4直觀方便。
group_concat()函數用于將查詢結果拼接為字符串。
sqlmap兼容python2和python3,可以自動化檢測各類注入和幾乎所有數據庫類型。
-u 可能存在注入的url鏈接
-r讀取http數據包
--data 指定post數據
--cookie 指定cookie
--headers 指定http頭 如采用token認證的情況下
--threads 指定線程數
--dbms 指定后端的數據庫
--os 指定后端的操作系統類型
--current-user 當前用戶
--users 所有用戶
--is-dba 是否是dba
--sql-shell 交互式的sqlshell
-p指定可能存在注入點的參數
--dbs 窮舉系統存在的數據庫
-D指定數據庫
--tables 窮舉存在的表
-T指定表
--column 窮舉字段
-C指定字段
--dump dump數據
直接檢測
其中—cookie用于指定cookie,—batch 自動化執行,—dbms指定數據庫類型
檢測結果
讀取系統中存在數據庫
—dbs讀取當前用戶下的數據庫
讀取指定庫下的表
-D java_sec_code —tables
dump users表數據
-D java_sec_code -T users —dump
//采用#不會導致sql注入,mybatis會使用預編譯執行
@Select("select * from users where username=#{username}")
User findByUserName(@Param("username") String username);
//采用$作為入參可導致sql注入
@Select("select * from users where username='${username}'")
List<User> findByUserNameVuln01(@Param("username") String username);
//錯誤寫法
<select id="findByUserNameVuln02" parameterType="String" resultMap="User">
select * from users where username like '%${_parameter}%'
</select>
//正確寫法
<select id="findByUserNameVuln02" parameterType="String" resultMap="User">
select * from users where username like concat(‘%’,#{_parameter}, ‘%’)
</select>
order by 后若使用#{}會導致報錯,因為#{}默認添加引號會導致找不到字段從而報錯。
//錯誤寫法
<select id="findByUserNameVuln03" parameterType="String" resultMap="User">
select * from users
<if test="order !=null">
order by ${order} asc
</if>
</select>
//正確寫法 id指字段id 此表字段共四個 所以id為1-4
<select id="OrderByUsername" resultMap="User">
select * from users order by id asc limit 1
</select>
slqmap手冊:https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/Users-manual/Introduction.html
sql注入詳解:http://sqlwiki.radare.cn/#/
*請認真填寫需求信息,我們會在24小時內與您取得聯系。