【问题标题】:Is it secure to use GET variables in a MySQL query?在 MySQL 查询中使用 GET 变量是否安全?
【发布时间】:2014-02-09 19:54:12
【问题描述】:

我有一个简单的场景:用户连接到“get.php?city=london”,然后服务器在 MySQL 数据库中搜索与该请求匹配的数据并将其输出。

我正在使用以下代码来执行此操作:

<?php
$con = mysql_connect( 'localhost', 'user', 'pass') or die('Could not connect to mysql server.' );
mysql_select_db('mydb', $con) or die('Could not select database.');

if(!isset($city)) return;
$c=$_GET["city"];

$q = "select * FROM cities WHERE city = '{$c}'";
$re = mysql_query($q);
... etc

像这样简单地将 GET 变量插入到查询中是否安全?这会让我容易受到 MySQL 注入的攻击吗?有没有更安全的方法来做到这一点?

问候

更新:

这样会更安全吗?:

if(!isset($city)) return;
$city=$_GET["city"];

$q = "SELECT row1, row2 WHERE city= ?;";
$mysqli = new mysqli('localhost', 'root', 'pass', 'dbname');

$stmt = $mysqli->stmt_init();
if($stmt->prepare($q)){
  $stmt->bind_param("s", mysql_real_escape_string($city));
  $stmt->execute();
  $stmt->bind_result($row1, $row2);
  while ($stmt->fetch()) {
       //do stuff with the data in the $row array
   }
 $stmt->close();
}

【问题讨论】:

标签: php mysql apache security http


【解决方案1】:

这根本不安全,只需更改网址即可伪造GET请求。

【讨论】:

    【解决方案2】:

    信任用户输入是危险的。有人可以更改 city 参数的值,将 SQL 注入到您的查询中,并访问您的数据。 您应该使用准备好的语句。这意味着您需要使用 mysqli 扩展或 PDO 扩展。

    我推荐使用 PDO 扩展,主要是因为它允许你以后切换数据库,而不必重新编写所有代码。

    【讨论】:

      【解决方案3】:

      不,它们不在 mysql_* 函数中。您需要使用 mysql_real_escape_string 使它们敏感。

      最好将 PDO 与 bindParams 一起使用,PDO 库将为您完成。

      php.net/pdo_mysql

      http://in3.php.net/manual/en/pdostatement.bindparam.php

      【讨论】:

      • 嗬嗬!这次我赢了我的朋友!
      • 哈哈,在我的时区凌晨 1:30 已经很晚了,可能需要尽快睡觉 :)
      • 哈哈哈下午2点过来!你应该,我猜你的快速打字能力会随着你保持清醒而失去!
      【解决方案4】:

      如果您使用 mysql_real_escape_string 用户无法将字符串传递给 mysql 注入。为此,对于城市,我认为使用 GET 没有问题。但是,如果您使用个人用户信息,我会使用 $_POST

      【讨论】:

      • 如果字符集被修改,可以在使用mysql_real_escape_string时进行sql注入,但这是一个非常非常非常远的极端情况。
      猜你喜欢
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多