奥斯汀-MySQL

207 阅读2分钟

如何防止xss注入

  1. 永远不要动态拼接sql
  2. 只要不在浏览器层面执行

let uri="www.jxbh.cn/illegal value.htm#start" encodeURI //"www.jxbh.cn/illegal%20v…" encodeURIComponent//"http%3A%2F%2Fwww.jxbh.cn%2Fillegal%20value.htm%23start"

可以看到这里 经过decodeURIComponent,会对应的编码替换所有非字母数字字符,但是decodeURI则会替换空格


orderby

select * from trans_translation where ProjectId = 51 and LocConfirmStatus = 1 order by ID desc,SvnVer desc limit 10;

select * from trans_translation where ProjectId = 51 and LocConfirmStatus = 1 order by SvnVer desc, ID desc limit 10;

因此我们可以看到 orderby 是先第一优先然后第二优先。


mysql版本问题

  1. 通过
select version()


offset的原理

我们知道,当limit offset rows中的offset很大时,会出现效率问题:

mysql> select * from test where val=4 limit 300000,5;
+---------+-----+--------+
| id      | val | source |
+---------+-----+--------+
| 3327622 |   4 |      4 |
| 3327632 |   4 |      4 |
| 3327642 |   4 |      4 |
| 3327652 |   4 |      4 |
| 3327662 |   4 |      4 |
+---------+-----+--------+
5 rows in set (15.98 sec)

然而换成相同的替代方式我们可以看到:

mysql> select * from test a inner join (select id from test where val=4 limit 300000,5) b on a.id=b.id;
+---------+-----+--------+---------+
| id      | val | source | id      |
+---------+-----+--------+---------+
| 3327622 |   4 |      4 | 3327622 |
| 3327632 |   4 |      4 | 3327632 |
| 3327642 |   4 |      4 | 3327642 |
| 3327652 |   4 |      4 | 3327652 |
| 3327662 |   4 |      4 | 3327662 |
+---------+-----+--------+---------+
5 rows in set (0.38 sec)

  public getPaginationCondition(query: knex.QueryBuilder, pagination: Pagination) {
    var page = pagination.page
    var pageSize = pagination.pageSize
    var offset = pageSize * (page - 1)
    query = query.offset(offset).limit(pageSize);
    return query;
  }

页面偏移量: 这里是用该到了offset,进行分页操作,输入每个页面大小和偏移量当数据库检索到的信息过大的时候假设n万条,如果你的offset是80000的时候,就会花费很多的时间。


  public getOffsetCondition(query: knex.QueryBuilder, offset: Offset): knex.QueryBuilder {
    query.limit(offset.count)

    if (offset.lastId) {
      query.andWhere('ID', '<', offset.lastId)
        .orderBy('ID', 'DESC')
    } else {
      query.orderBy('ID', 'DESC')
    }
    return query
  }

maxId方法:通过sql语音中增加一个where条件,从而直接拿到前n条,没有offset操作。

语句1select * from student limit 9,4
语句2:slect * from student limit 4 offset 9

此处语句1和语句2生成的结果并没有区别。

in action: