• SQL注入攻击讲解及PHP防止SQL注入攻击的几种方法


    毕业开始从事winform到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发……必须的各种借口。这几天把sql注入的相关知识整理了下,希望大家多多提意见。

    对于sql注入的攻防,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避免后知后觉的犯下大错,专门查看大量前辈们的心得,这方面的资料颇多,将其精简出自己觉得重要的,就成了该文。

    什么是SQL注入攻击

    SQL注入是一个网络安全漏洞,攻击者可以利用该漏洞来干扰应用程序对其数据库的查询。通常,它使攻击者可以查看他们通常无法检索的数据。这可能包括其他用户的数据,或者应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序内容或行为的永久更改。

    下面我们以登录模块来说明SQL注入攻击,登录模块其实就是执行SQL查询,看是否能匹配到查询结果。以下是从普通用户和尝试使用SQL注入的不良用户收集的示例字符串。

    1. // 正常用户登录的SQL查询语句
    2. $name = "timmy";
    3. $query = "SELECT * FROM customers WHERE username = '$name'";
    4. echo "Normal: " . $query . "
      "
      ;
    5. // user input that uses SQL Injection
    6. $name_bad = "' OR 1'";
    7. // our MySQL query builder, however, not a very safe one
    8. $query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
    9. // display what the new query will look like, with injection
    10. echo "Injection: " . $query_bad;

    上面的php代码将输出如下:

    1. 正常SQL: SELECT * FROM customers WHERE username = 'timmy'
    2. 注入式SQL: SELECT * FROM customers WHERE username = '' OR 1''

    正常SQL查询没有问题,因为我们的MySQL语句将从用户名等于timmy的客户中选择所有内容。 

    但是,注入攻击SQL实际上的查询行为与我们预期的有所不同。通过使用单引号(')结束了我们的MySQL查询的字符串部分

    • username=''

    然后使用OR子句1(始终为true)添加到我们的WHERE语句中。

    • username='' or 1

    此OR子句1始终为 true  ,因此该语句将查询customers表中的所有数据!

    如何防止SQL注入

    有三种方法可以防止SQL注入攻击。第一种方法使用mysql_real_escape_string()函数,第二种方法使用mysqli的prepare语句,第三种方法使用PDO(对于任何受支持的数据库驱动程序)。

    mysql_real_escape_string()

    1. //Connect
    2. $unsafe_variable = $_POST["user-input"];
    3. $safe_variable = mysql_real_escape_string($unsafe_variable);
    4. mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");
    5. //Disconnect

    mysqli的prepare语句

    1. $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
    2. $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
    3. $stmt->execute();
    4. $result = $stmt->get_result();
    5. while ($row = $result->fetch_assoc()) {
    6. // Do something with $row
    7. }

    PDO

    1. $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
    2. $stmt->execute([ 'name' => $name ]);
    3. foreach ($stmt as $row) {
    4. // Do something with $row
    5. }

    以上是本文的全部类容,感谢阅读,希望能帮到大家。更多教程请访问码农之家  

  • 相关阅读:
    Gopher的Rust第一课:Rust的那些事儿
    盘点re:Invent历年重磅创新:今年亚马逊云科技又将有哪些重磅发布?
    78评价《乡村振兴战略下传统村落文化旅游旅游设计》许少辉博士新书
    idea中使用Maven出现https://repo.maven.apache.org/maven2问题
    php-java-net-python-爱心公益网站()计算机毕业设计程序
    【block作为函数的参数 Objective-C语言】
    streamlit+ndraw进行可视化训练深度学习模型
    网络营销利器:海外IP代理如何助力你的网络营销?如何选择?
    Spring Cloud GateWay整合熔断器实现限流
    C++ 整形转换类
  • 原文地址:https://blog.csdn.net/wuxiaopengnihao1/article/details/126521808