routes.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. */
  43. router.post('/select', async function (req, response) {
  44. // 0.接收参数,并且校验
  45. let sql = req.body.sql;
  46. let token = req.body.token;
  47. let params = req.body.params;
  48. if(!sql){
  49. goWrong(response,"缺少参数sql")
  50. return;
  51. }
  52. // 2.分析查询参数
  53. try{
  54. if(params){
  55. params = JSON.parse(params)
  56. }
  57. if(params&&params.length<1){
  58. goWrong(response,"params参数必须为数组")
  59. return;
  60. }
  61. let biggerSQL = sql.toUpperCase();
  62. let checkArray = biggerSQL.split(" ")
  63. if( // 过滤修改操作
  64. biggerSQL.startsWith("DROP")
  65. || biggerSQL.startsWith("DELETE")
  66. || biggerSQL.startsWith("UPDATE")
  67. || biggerSQL.startsWith("CREATE")
  68. || biggerSQL.startsWith("ALTER")
  69. || (checkArray).indexOf("DROP")>=0
  70. || (checkArray).indexOf("DELETE")>=0
  71. || (checkArray).indexOf("UPDATE")>=0
  72. || (checkArray).indexOf("CREATE")>=0
  73. || (checkArray).indexOf("ALTER")>=0
  74. || (checkArray).indexOf("PG_")>-1 // 屏蔽系统方法
  75. || (checkArray).indexOf("/ETC")>-1 // 屏蔽目录读取
  76. || (checkArray).indexOf("GETPGUSERNAME")>-1
  77. || (checkArray).indexOf("CURRENT_SCHEMA")>-1
  78. || (checkArray).indexOf("CURRENT_USER")>-1
  79. || (checkArray).indexOf("SYSTEM(")>-1
  80. ){
  81. goWrong(response, "不可执行非法查询语句:"+sql);
  82. return;
  83. }
  84. let badStringList = [
  85. "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"
  86. // ,";","--","//","/","#"
  87. ]
  88. if(badStringList.find(item=>checkArray.indexOf(item.toUpperCase())>-1)){
  89. goWrong(response, "包含非法关键字:"+sql);
  90. return;
  91. }
  92. if( // 限定查询操作
  93. biggerSQL.startsWith("WITH")
  94. || biggerSQL.startsWith("SELECT")
  95. || biggerSQL.startsWith("(SELECT")
  96. ){
  97. let data = await NovaQLSELECT(sql,params);
  98. response.json({
  99. code:200,
  100. data:data
  101. });
  102. return;
  103. }else{
  104. goWrong(response, "不可执行非法查询语句:"+sql);
  105. return;
  106. }
  107. }catch(err){
  108. goWrong(response, err.toString());
  109. return;
  110. }
  111. })
  112. async function NovaQLSELECT(sql,params){
  113. return new Promise((resolve,reject)=>{
  114. psqlDB.any(sql,params).then((data) => {
  115. resolve(data)
  116. })
  117. .catch((err) => {
  118. reject(err);
  119. });
  120. })
  121. }
  122. module.exports = router;