routes.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. const router = require('express').Router();
  2. const bodyParser = require('body-parser')
  3. router.use(bodyParser.urlencoded({
  4. extended: false
  5. }));
  6. router.use(bodyParser.json({ limit: '10mb' }));
  7. // 跨域参数配置
  8. const allowCrossDomain = function (req, res, next) {
  9. res.header('Access-Control-Allow-Origin', '*');
  10. res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
  11. res.header('Access-Control-Allow-Headers', 'Content-Type');
  12. res.header('Access-Control-Allow-Credentials', 'true');
  13. next();
  14. };
  15. router.use(allowCrossDomain)
  16. function goWrong(response,msg){
  17. response.status(500)
  18. response.json({
  19. code:500,
  20. mess:msg
  21. })
  22. return
  23. }
  24. const psqlDB = require("../../psql.service");
  25. /**
  26. * @api {post} /psql/select psql查询接口
  27. * @apiSampleRequest /api/psql/select
  28. * @apiVersion 0.5.0
  29. * @apiName psqlSELECT
  30. * @apiGroup psql
  31. * @apiParam {String} sql='SELECT * FROM "VrPanoLog" limit $1;' 仅限SQL的SELECT和WITH查询
  32. * @apiParam {String} [params='[5]' ] 参数数组
  33. * @apiSuccess {data} data 结果
  34. * @apiSuccessExample Success-Response:
  35. * HTTP/11 200 OK
  36. * {
  37. * "code": 200,
  38. * "mess": "成功",
  39. * "data": [
  40. * ]
  41. * }
  42. * @example
  43. curl -X POST 'http://127.0.0.1:1337/api/psql/select' -H 'Content-Type: application/json' --data '{"sql":"SELECT * FROM \"_User\" limit 5","params":[1]}'
  44. */
  45. router.post('/select', async function (req, response) {
  46. // 0.接收参数,并且校验
  47. let sql = req.body.sql;
  48. let token = req.body.token;
  49. let params = req.body.params;
  50. if(!sql){
  51. goWrong(response,"缺少参数sql")
  52. return;
  53. }
  54. // 2.分析查询参数
  55. try{
  56. if(params){
  57. params = JSON.parse(params)
  58. }
  59. if(params&&params.length<1){
  60. goWrong(response,"params参数必须为数组")
  61. return;
  62. }
  63. let biggerSQL = sql.toUpperCase();
  64. let checkArray = biggerSQL.split(" ")
  65. if( // 过滤修改操作
  66. biggerSQL.startsWith("DROP")
  67. || biggerSQL.startsWith("DELETE")
  68. || biggerSQL.startsWith("UPDATE")
  69. || biggerSQL.startsWith("CREATE")
  70. || biggerSQL.startsWith("ALTER")
  71. || (checkArray).indexOf("DROP")>=0
  72. || (checkArray).indexOf("DELETE")>=0
  73. || (checkArray).indexOf("UPDATE")>=0
  74. || (checkArray).indexOf("CREATE")>=0
  75. || (checkArray).indexOf("ALTER")>=0
  76. || (checkArray).indexOf("PG_")>-1 // 屏蔽系统方法
  77. || (checkArray).indexOf("/ETC")>-1 // 屏蔽目录读取
  78. || (checkArray).indexOf("GETPGUSERNAME")>-1
  79. || (checkArray).indexOf("CURRENT_SCHEMA")>-1
  80. || (checkArray).indexOf("CURRENT_USER")>-1
  81. || (checkArray).indexOf("SYSTEM(")>-1
  82. ){
  83. goWrong(response, "不可执行非法查询语句:"+sql);
  84. return;
  85. }
  86. let badStringList = [
  87. "exec","execute","insert","create","drop","grant","use","group_concat","column_name","concat","pg_read_file","information_schema.columns","table_schema","delete","update","chr","mid","master","truncate","char","declare"
  88. // ,";","--","//","/","#"
  89. ]
  90. if(badStringList.find(item=>checkArray.indexOf(item.toUpperCase())>-1)){
  91. goWrong(response, "包含非法关键字:"+sql);
  92. return;
  93. }
  94. if( // 限定查询操作
  95. biggerSQL.startsWith("WITH")
  96. || biggerSQL.startsWith("SELECT")
  97. || biggerSQL.startsWith("(SELECT")
  98. ){
  99. let data = await NovaQLSELECT(sql,params);
  100. response.json({
  101. code:200,
  102. data:data
  103. });
  104. return;
  105. }else{
  106. goWrong(response, "不可执行非法查询语句:"+sql);
  107. return;
  108. }
  109. }catch(err){
  110. goWrong(response, err.toString());
  111. return;
  112. }
  113. })
  114. async function NovaQLSELECT(sql,params){
  115. return new Promise((resolve,reject)=>{
  116. psqlDB.any(sql,params).then((data) => {
  117. resolve(data)
  118. })
  119. .catch((err) => {
  120. reject(err);
  121. });
  122. })
  123. }
  124. module.exports = router;