【问题标题】:Security in my PHP script [closed]我的 PHP 脚本中的安全性 [关闭]
【发布时间】:2014-04-22 18:45:07
【问题描述】:

我在刚购买的网站上找到了这个源代码。只是想知道这个脚本是否安全?谁能给我解释一下?

<?php

if($_GET['map_loc']) {
    $code = $_GET['map_loc'];
    $result= mysql_query("SELECT ttc.continent_id, ttc.continent_id, c.name FROM territories_to_continents ttc
        INNER JOIN continents c
        ON ttc.continent_id = c.continent_id
        WHERE ttc.code = '$code'
        LIMIT 1;
        ");
    $row = mysql_fetch_array($result);
    $mapLoc = $row['name'];
}

?>

【问题讨论】:

  • 这是不安全的:bobby-tables.com 加上它只是糟糕的代码。您只需假设您的查询永远不会失败并盲目地从结果中执行/获取数据。任何阶段的任何失败都会破坏后面的阶段。
  • 很高兴您提出这个问题,因为代码完全不安全!不要使用旧的 MySQL 扩展。使用 MySQLi 或 PDO,无论选择哪种扩展,都使用 Prepared Statements!
  • 使用 PDO 或 Mysqli。如果你太懒,使用pdo wrapper
  • 股票答案在这里:stackoverflow.com/questions/60174/… - 实际提问的荣誉!

标签: php mysql security get


【解决方案1】:

它绝对不安全....mysql_* 是旧的,不应该使用。您应该改用 PDO 或 mysqli,在下面的示例中,我展示了如何使用 mysqli 来完成。

<?php

if(isset($_GET['map_loc'])) {
    $code = $_GET['map_loc'];

    $query = "SELECT ttc.continent_id, ttc.continent_id, c.name FROM territories_to_continents ttc
                INNER JOIN continents c
                ON ttc.continent_id = c.continent_id
                WHERE ttc.code = ?
                LIMIT 1";

    if($stmt = $mysqli->prepare($query)){
        $stmt->bind_param('s', $code);
        $stmt->execute();
        $stmt->bind_result($ttc.continent_id1, $ttc.continent_id2, $mapLoc);
        $stmt->fetch();
        $stmt->free_result();
        $stmt->close();
    }
}
?>

您绝对应该查看这个著名的问题以寻求帮助:How can I prevent SQL injection in PHP?

【讨论】:

  • 这是安全的,但是 API 很乱。看看所有这些电话。
  • 你可以使用isset来避免未知键的通知。
  • @Scott 我的意思是你可以删除 $stmt-&gt;free_result();$stmt-&gt;close(); 但我认为如果你包括对内存管理和良好实践目的的关闭调用,代码看起来更完整
  • 嘿。我更喜欢编写自己的类作为 PDO 的健全 API。那我就说 $result = $db->query($sql, $param_array);
  • @Scott 是的,我同意!但是mysqli对于php新手来说比较容易理解。
猜你喜欢
  • 2016-07-07
  • 1970-01-01
  • 2011-11-19
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
相关资源
最近更新 更多