【问题标题】:Safe MYSQL querying using user input [duplicate]使用用户输入进行安全 MYSQL 查询
【发布时间】:2017-08-31 15:34:43
【问题描述】:

我只想检查我的 PHP-MYSQL 查询的安全性(如果有的话),我正在使用通过 $_POST 然后验证的用户数据 - 所有数据的验证过程包括使用 mysqli_real_escape_string()字符串和修剪()。然而,我的一些输入的性质意味着我不限制用户输入的任何字符。我正在做的事情是否安全,如果不是,如何改进。

插入查询示例(其中 $name 和 $description 是已通过验证函数的 $_POST 数据值。)

    $sql = "INSERT INTO company(company_name, company_description) VALUES('".$name."', '".$description."')";
$result = mysqli_query($con, $sql);

选择查询示例(其中 $companyid 是用户输入,real_escaped 和剥离)

    $sql = "SELECT * FROM events WHERE event_company=".$companyid."";
$result = mysqli_query($con, $sql);

提前致谢。

【问题讨论】:

  • 你的查询一点都不安全,需要使用PDO或者mysqliprepared statements
  • 感受一下 SQL 注入的后果 here ,如果您不想处理它,请阅读 this fairly comprehensive question/answers on the topic.
  • mysqli_real_escape_string 根本不会保护您的选择查询。你可以试试$company="1 or event_company=2";。如果 1 和 2 在你的数据库中,你会得到两个。

标签: php mysql php-5.5


【解决方案1】:

您的查询已更新为使用 mysqli 准备好的语句。

$sql    = "INSERT INTO `company` (`company_name`, `company_description`) VALUES(?, ?)";
$stmt   = $con->prepare($sql);
$stmt->bind_param('ss',$name,$description); // ss is for string string
$stmt->execute();
$result = $stmt->get_result();

$sql    = "SELECT * FROM `events` WHERE `event_company` = ?";
$stmt   = $con->prepare($sql);
$stmt->bind_param('i',$companyid); // i indicates integer 
$stmt->execute();
$result = $stmt->get_result();

【讨论】:

    【解决方案2】:

    有一种叫做“SQL INJECTION”的黑客可以欺骗你的控制。阅读那里了解更多信息https://www.veracode.com/security/sql-injection

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多