【问题标题】:Prevent SQL Injection by input type text [duplicate]通过输入类型文本防止 SQL 注入 [重复]
【发布时间】:2015-02-08 08:59:57
【问题描述】:

我需要一些帮助,而且速度非常快,因为我的数据库被注入了。我至少需要一个不允许用户使用的脚本 :[Spaces, Sybols like ('*','=','/','.') 和单词列表 ('SELECT','FROM' ,'WHERE')] 在我的注册表单的文本字段中。

我听说了一些关于mysql_real_escape_string() 的事情。这个命令在做什么?并且不要发布指向PHP: mysql_real_escape_string() Manual 的链接,因为我已经阅读了。

【问题讨论】:

  • 如果您想要“非常非常快”的解决方案,请改用 PDO 或 MySqli 命令。由于安全和性能问题,Mysql 目前正在折旧。
  • 是的。我用 mysqli 我写错了 mysql 但告诉我一些 mysqli 命令
  • 这个用户需要帮助非常非常快,而这里的每个人都建议重写应用程序。

标签: php sql database string inject


【解决方案1】:

如果您使用的是 PHP,那么为什么不在您的 PHP 脚本中执行此操作。清理用户在 GET 和 POST 中提供的所有输入,然后将其移至 DB 调用。这是正确的做法。

【讨论】:

    【解决方案2】:

    处理这个问题的方法有对有错。 (通常)错误的方法是尝试设置输入清理方法(如脚本)并希望没有任何东西通过。它通常不起作用。

    我建议您重写 PHP SQL 查询以使用 MySQLi 准备好的语句。这些查询首先从常见的 SQL 语法(“SELECT...WHERE...”)转换为您的引擎可以使用的语句,然后才将字段替换为您的输入,从而防止 SQL 注入。

    例如,(非常)易受攻击的 SQL 语法:

    "SELECT * FROM users_passwords WHERE user='" + user + "' AND pass='" + password + "'"
    

    可以转换成如下的prepared statement:

    "SELECT * FROM users_passwords WHERE user=? AND password=?"
    

    然后,使用命令bind_param(),您可以在准备好语句后安全地将? 占位符替换为您的参数。虽然原始 SQL 查询允许您使用一些基本的注入技术(例如编写 ' OR true OR '),但准备好的语句不允许这样做。

    这是一个工作示例:

    // Create a new MySQLi connection object
    $db = new mysqli('localhost','db_username','db_password','db_name');
    
    // Create a new prepared statement
    $stmt = $db->prepare('SELECT * FROM users_passwords WHERE user=? AND pass=?');
    
    // Bind the parameters, in order, to the statement (s stands for string)
    $stmt->bind_param('ss', username, password);
    
    // Self-explanatory
    $stmt->execute();
    

    【讨论】:

    • 我已经在我的脚本中使用了 mysqli。我的脚本中只有 mysqli 语句。但是,如果你没有给我至少一个命令或一段防止注入的代码,那对我没有帮助,因为我是 php 的初学者,我不知道如何做到这一点。
    • 我附上了一个代码示例,希望对你有帮助(prepared statement本身就是为了防止注入)
    【解决方案3】:

    我强烈避免从任何输入构造 SQL 查询字符串,即使您对其进行了清理。
    出于安全目的和性能的好方法是使用函数来设置参数:

    for example:
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $value);
    

    http://php.net/manual/en/pdo.prepared-statements.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-04
      • 2022-01-18
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多