如何防止xss注入
- 永远不要动态拼接sql
- 只要不在浏览器层面执行
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_translationwhereProjectId= 51 andLocConfirmStatus= 1 order byIDdesc,SvnVerdesc limit 10;
select * from
trans_translationwhereProjectId= 51 andLocConfirmStatus= 1 order bySvnVerdesc,IDdesc limit 10;
因此我们可以看到 orderby 是先第一优先然后第二优先。
mysql版本问题
- 通过
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操作。
语句1:select * from student limit 9,4
语句2:slect * from student limit 4 offset 9
此处语句1和语句2生成的结果并没有区别。
in action: