用正则表达式不就可以让用户名不能包含一些字符了吗,为啥还要转义
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用正则表达式不就可以让用户名不能包含一些字符了吗,为啥还要转义相关的知识,希望对你有一定的参考价值。
参考技术A 你只是对用户名进行分析而已,就用户名而已确实是不需要的。转义最重要的是防止xss攻击和sql注入。
我先说xss,xss是指你本身没有一段js,但是在用户输入的时候给你加了css,如果你没转义,那么,这一段就变成js执行了,这就是xss。例子:
假设用户发布一片文章,,文章中夹带了这么一段<script>alert(document.cookie)</script>;那么,在文章展示页,执行了这么一段的话就把cookie打印出来了。假设你cookie当中有用户名,那么用户就获取到了用户名,可能你觉得没什么,用户名不是什么敏感数据,但是,你数据中总有敏感的数据在里面可能被挖掘出来。
好,下一步:假设用户在console执行了这么一段js。document.cookie="username=sss' or 1 +’",这是一个注入的sql,可能包含获取你的数据库信息。
那么你在执行数据库查询的是时候,
就有可能变成下面这个语句
select * from users where username =‘sss’ or 1 +‘‘ 。
你觉得这个执行的结果会是怎么样。这是你想要的结果么。这样有可能就获取到其他人的资料了。
这样就造成了sql注入本回答被提问者采纳
Linux正则表达式
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。正则表达式基本上是一种“表示法”,只要工具支持这种表示法,那么该工具就可以用来作为正则表达式的字符串处理之用。
正则表达式字符
RE字符 | 意义 |
---|---|
. | 匹配任意单个字符 |
[-] | 匹配括号里任意一个字符,也可以用-来表示范围。例如:[abc]或[a-z] |
[^] | 匹配不包括括号里的字符,例如:匹配非数字[^0-9] |
* | 匹配前一个字符任意次,包括0次 |
\? | 匹配前一个字符0到1次 |
\+ | 匹配前面字符至少1次 |
\{n,m\} | 匹配前一个字符至少n次最多m次;\{n\}匹配n次;\{n,\}匹配至少n次,最多不限 |
^string | 匹配的字符串处于行首 |
string$ | 匹配的字符串处于行尾 |
\ | 匹配的字符串位于单词词尾 |
\ | 匹配整个单词 |
\(PATTERN\) | 匹配括号里的组字符串,可以用变量\1,\2,\3...引用匹配到的内容 |
范围字段表示
字符类 | 含义 |
---|---|
[:alnum:] | 代表英文大小写字符及数字,即0-9,A-Z,a-z |
[:alpha:] | 代表任何英文大小字符,即A-Z,a-z |
[:lower:] | 代表小写字符,即a-z |
[:upper:] | 代表大写字符,即A-Z |
[:digit:] | 代表数字,即0-9 |
[:xdigit:] | 代表十六进制的数字类型,因此包括0-9,A-F,a-f的数字与字符 |
[:blank:] | 代表空格键与tab按键 |
[:graph:] | 除了空格与tab按键之外的其它所有按键 |
[:space:] | 任何会产生空白的字符,包括空格键,Tab键,CR等 |
[:cntrl:] | 代表键盘上面的控制按键,既包括CR,LF,Tab,Del等 |
[:print:] | 代表任意可打印字符 |
[:punct:] | 代表标点符号,即" ‘ ? ! ; : # $ |
应用举例
# 在/etc/passwd中查找用户名和所用shell同名的行
[[email protected] ~]# egrep --color=auto "(^[^:]*\>).*\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
- 范例说明:
- (^[^:]*>)表示匹配不包括:字符的单词为行首的行
- \1$表示()中匹配到的内容做为行尾
- .*表示任意字符任意多个
以上是关于用正则表达式不就可以让用户名不能包含一些字符了吗,为啥还要转义的主要内容,如果未能解决你的问题,请参考以下文章
求PHP用户名注册验证正则表达式(6-16位字符,字母开头,只包含字母数字下划线)可支持中文