为什么用户名不能特殊字符

为什么用户名不能特殊字符
#

  1. 为了防止sql注入,比如,像='等等,这些都会干扰查询甚至会报错。
  2. 特殊字符可能不利于我们网站的展示,比如☆,可能其他用户无法打出来,导致操作上的不便。
  3. HTML的标签,因为所有的用户名在网页上都是会显示的,比如起个名字叫xiaoming,这就不平等,你的用户名会显示为红色。

SQL注入攻击(SQL Injection)##

SQL注入:指的是在请求参数中插入一些SQL语句,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,从而欺骗服务器,执行恶意SQL命令。

  简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。
而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。
比如查询:

strSQL = "SELECT * FROM users WHERE name = '" + userName + "' and pw = '"+ passWord +"';"

如果用户的输入如下:

userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";

那么我们的SQL变成了如下所示:

strSQL = "SELECT * FROM users WHERE name = '1' OR '1'='1' and pw = '1' OR '1'='1';"

因为WHERE条件恒为真,这就相当于执行:

strSQL = "SELECT * FROM users;"

因此可以达到无账号密码亦可登录网站。如果恶意用户要是更坏一点,用户填入:

userName = "1";
passWord = " '; DROP TABLE users;";

SQL语句变成了:

strSQL = "SELECT * FROM users WHERE name = '1' and pw = ' '; DROP TABLE users;"

这样一来,虽然没有登录,但是数据表都被删除了。
但是密码可以使用特殊字符,因为密码一般使用加密的方式(通常是md5之类的摘要算法),绝对不应该使用明文方式保存。不但能够提高安全性,而且并不需要限制特殊字符。

SQL注入攻击预防

  1. 严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害。
  2. 检查输入的数据是否具有所期望的数据格式,严格限制变量的类型,例如使用regexp(正则表达式)进行一些匹配处理
  3. 对进入数据库的特殊字符('"\尖括号&*;等)进行转义处理,或编码转换。
    比如:mysql的转义都是通过\来进行的
    那么一些特殊输入,可以使用转义处理,比如
  • \'
    单引号
  • \n
    换行符
  • \r
    回车符
  • \\
    反斜线(\)字符。
  • \%
    %字符。
  • \_
    _字符。

4 .所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,即不要直接拼接SQL语句。可以使用PreparedStatement对象。
5 .避免网站打印出SQL错误信息,比如类型错误、字段不匹配等,把代码里的SQL语句暴露出来,以防止攻击者利用这些错误信息进行SQL注入。

posted @ 2017-06-07 22:57  何必等明天  阅读(7879)  评论(1编辑  收藏  举报