zoukankan      html  css  js  c++  java
  • 关于SQL注入和如何防止

     之前在笔试的时候没有很好的答出这个问题,因此我要总结一下问题,以免日后继续在这个地方跌倒,以下是自己的理解,如有错误请指出

      一.什么是SQL注入

      SQL注入就是服务器在根据业务去处理数据库的时候,客户端传来的参数里面含有一些非法的SQL语句或者特殊符号,导致原来该执行的SQL语句变成了另一个SQL语句。

      最经典的案例就是用户登录页面,前端有一个登陆的表单,可以填写账号,密码,用户在填写密码点击登录之后就会把信息传给服务器。

      然后服务器会执行类似于下面的语句

    $userName = $_POST['userName'];
    $password= $_POST['password'];
    $res = mysql_query("SELECT * FROM user where name='{$userName}' && password='{$password}'; ");
    if(mysql_fetch_assoc($res)){
        eho "登录成功";  
    }else{
       echo "账号不存在或者密码错误";
    }

      试想一下,如果有不法分子在账号一栏输入 'or 1=1;-- 那里SQL语句从原来程序员期盼的

    SELECT * FROM `user` WHERE username='username' && `password`='password';

      变成了

    SELECT * FROM `user` WHERE username=''or 1=1;--' && `password`='123';

      这样就列出了全部的用户的信息,而且顺利登陆了客户端在不输入任何的账号和密码信息。其实这个还算好的了,如果输入的是 ';drop table user;-- 这样就直接把你的用户表给删了。

    二.如何防范SQL注入

      其实明白了原理就解决起来就会很简单,最有效的方法就是让传来的数据参数化,何为参数化?就是把传来的数据真真正正的作为参数,而不会成为SQL语句的一部分,比如说刚刚传来的数据里面用户名为'or 1=1;--  SQL语句就真的要去查询是否有一个用户名字名为 'or 1=1;-- 而不会变成另一个SQL语句,要实现的话只需要把SQL语句预先编译,然后再把参数传过去SQL语句,这样就算数据非法也无济于事,因为真的不会把数据真的作为语句来执行。

      那么该如何实现参数化查询呢?

      在MySql参数化查询,首先是预定义一个SQL语句,然后我们再定义参数,最后调用预定义的带上参数的SQL即可

      预定义SQL语句在MySql是用prepare来预定义,其中我们用?代表在预定的SQL语句里面的参数。

    prepare pre_name from "SQL语句";

      执行就是如下:

    excute pre_name [using 参数1,参数2];

      下面是一个正确查询账号密码的MySql例子:

    SET @name="userName";  --定义参数
    SET @password="password";  --定义参数
    PREPARE test FROM "SELECT * FROM user WHERE username=? && password=?";  --用prepare预定义SQL语句,?代表参数
    EXECUTE test USING @name,@password;  --执行SQL语句,并把对应参数传过去

         这时候测试一下如果传来的参数是'or 1=1;-- 执行结果也只是查询用户名为'or 1=1;--的用户

     三.其他防范SQL注入的办法

     至于其他办法嘛,也有很多,下面是从网上资料查阅之后总结起来还算靠谱的一些。当然我个人感觉还是查询参数化最有效。

      1.对传来的数据中的特殊字符进行转义,如十六进制字符,斜杠,双引号,单引号,注释等等。

      2.尽量对不要用最高权限的SQL账户去操作数据库,而是分配不同的权限给不同的用户,在需要操作数据的场合分配对应权限的用户。

      3.使用存储过程,其实和查询参数化一个道理,由于存储过程的SQL语句已经预编译过了,因此不用担心数据作为SQL语句的一部分。

      4.减少SQL执行反馈信息,或者说把反馈信息改成自己的一套提示码,尽量不让对方知道自己的数据库信息。

  • 相关阅读:
    Pentaho
    知识地图
    分享学习笔记本
    2015-7-1 记而随,随而记
    web 导出 csv
    vs2013 密钥
    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
    如何绘制业务流程图?
    总是保存下拉选项的第一个值
    mac 修改密码后 频繁输入钥匙串问题修复方法
  • 原文地址:https://www.cnblogs.com/s-b-b/p/6033391.html
Copyright © 2011-2022 走看看