【基础知识思考整理 】MySQLSQL注入(SQL Injection )和防注入

基础知识思考整理
http://blog.csdn.net/aganlengzi/article/details/51932826

原理:
  • SQL Injection就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言(SQL)当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入 的数据没有进行严格的过滤,导致非法数据库查询语句的执行。
举例:
  • 如下面的用户登陆验证程序:
    $sql = “SELECT * FROM user WHERE username=’$username’ AND password=’$password’”;
    $result = mysql_db_query($dbname, $sql);
    如果我们提交如下url:
    http://127.0.0.1/injection/user.php?username=angel’ or ‘1=1’
    那么就可以成功登陆系统,但是很显然这并不是我们预期的,同样我们也可以利用sql的注释语句实现sql注入,如下面的例子:
    http://127.0.0.1/injection/user.php?username=angel‘/*
    http://127.0.0.1/injection/user.php?username=angel‘%23
    这样就把后面的语句给注释掉了!第一句是利用逻辑运算,第二、三句是根据mysql的特性,mysql支持/*和#两种注释格式,所以提交的时候是把后面的代码注释掉,值得注意的是由于编码问题,在IE地址栏里提交#会变成空的,所以我们在地址栏提交的时候,应该提交%23,才会变成#,就成功注释了, 这个比逻辑运算简单得多了。
防注入方法:
  • prepareStatement + Bind-variable而尽量不要使用拼接的sql。
    Java和Jsp:prepareStatement + Bind-variable
    PHP +:mysqli中支持prepared statements

  • 使用应用程序提供的转换函数
    MySQL C API:mysql_real_escape_string() API调用。
    MySQL++:escape和quote 修饰符。
    Perl DBI:使用placeholders或者quote()方法。
    Ruby DBI:使用placeholders或者quote()方法。
    Java JDBC:使用PreparedStatement和 placeholders。
    PHP:使用mysql_real_escape_string()函数(适用于PHP 4.3.0,之前的版本请使用mysql_escape_string(), PHP 4.0.3之前的版本请使用addslashes())。从PHP 5开始,可以使用扩展的mysqli,这是对MYSQL新特性的一个扩展支持,其中的一个优点就是支持prepared statements。

  • 自己定义函数进行校验
    如果现有的转换函数仍然不能满足要求,则需要自己编写函数进行输入校验。输入验证是一个很复杂的问题。输入验证的途径可以分为以下几种:
    整理数据使之变得有效;
    拒绝已知的非法输入;
    只接受已知的合法的输入。

参考
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值