PHP脚本中的安全性

PHP脚本中的安全性,php,mysql,security,get,Php,Mysql,Security,Get,我在刚购买的网站上找到了这段源代码。只是想知道这个脚本是否安全?谁能给我解释一下吗 <?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

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

<?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'];
}

?>

它绝对不安全
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();
    }
}
?>


您一定要查看这个著名的问题以寻求帮助:

它不安全:而且它只是一个糟糕的代码。您只需假设您的查询永远不会失败,并盲目地从结果中执行/获取数据。任何阶段的任何失败都将导致后期阶段的垃圾。我很高兴你问这个问题,因为代码是完全不安全的!不要使用旧的MySQL扩展。使用MySQLi或PDO,无论选择哪个扩展,都要使用准备好的语句!使用或Mysqli。如果你太懒了,用下面的答案来回答:-谢谢你的提问!这是安全的,但API很混乱。查看所有这些调用。您可以使用
isset
来避免出现未知键的通知。@Scott我的意思是您可以删除
$stmt->free_result()
$stmt->close()
但是我认为如果您包括内存管理关闭和良好实践目的的调用,代码看起来更完整。我更喜欢编写自己的类作为PDO的健全API。然后我只说$result=$db->query($sql,$param_数组)@斯科特:是的,我同意!但是mysqli对于新的php程序员来说更容易理解。