如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。 很多时候我们采用动态拼装sql,而这样的方式很容易通过拼接sql字符串进行注入。 **例如** ~~~ $sql = "select * from user where uid=$uid"; ~~~ 以上SQL如果有字符串处理,是根本不会这么写的,但有些时间没有字符串时你可能也习惯这么写,如果真这么写那么问题就来了 假如访问提交的是http://localhost/index.php?uid=1 or 1=1 SQL会变成: ~~~ select * from user where uid=1 or 1=1 ~~~ 通过上页我们知道,加引号是多么重要的事情,加上引号看看效果会有什 么变化,SQL变为如下形式 SQL会变成: ~~~ select * from user where uid='1 or 1=1' ~~~ 但是如果你加了引号之后,如果用户再访问提交 http://localhost/index.php?uid=1' or 1=1%23 SQL会变成: ~~~ select * from user where uid='1' or 1=1#' ~~~ 依然可以进行注入,在这种情况下,我们需要怎么做呢,我们尝试着把数据交给mysql_real_escape_string()或者addslashes()来转义特殊的输入字符。 SQL会变成: ~~~ select * from user where uid='1\' or 1=1#' ~~~ 注入方式绝大多数依赖 <>'"& 这几个字符中的一个或几个对内容进行注入攻击。mysql_real_escape_string()并不能处理 <>,那这种情况下我们还应该怎么办,咱们可以通过htmlspecialchars函数将这些字符转换成无害的HTML 实体;目前TP的I方法就默认会对接收的数据通过这个函数进行过滤。 注入的场景有很多,在这里不一一列举,大家感兴趣,可以通过搜索引擎查找相关资料。 课外阅读:http://blog.sina.com.cn/s/blog_51af865b01009xsx.html **安全注意事项** 1. 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。 2. 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。 3. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装 4. 使用字符串查询条件,使用预处理机制。 5. 对数据类型为整形的,可以强制转换成整型。 6. 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。