是否安全代码?(需要帮助)


Safe code or not? (Help needed)

这段代码用于我的网站安全吗?没有sql注入或黑客攻击,是或否?我不想被黑等等。

<?php
$db = new mysqli ("localhost", "-", "-", "-");
if($_GET['look'] && $_GET['username'])
{
    $username = $db->real_escape_string($_GET['username']);
    $look = $db->query("SELECT look FROM users WHERE username = '".$username."'")->fetch_assoc();
    echo $look['look'];
}
if($_GET['missie'] && $_GET['username'])
{
    $username = $db->real_escape_string($_GET['username']);
    $motto = $db->query("SELECT motto FROM users WHERE username = '".$username."'")->fetch_assoc();
    echo $motto['motto'];
}
if($_GET['while'] && $_GET['status'])
{
    $status = $db->real_escape_string($_GET['status']);
    $motto = $db->query("SELECT * FROM users WHERE motto = '".$status."'");
    while($lol = $motto->fetch_assoc()) {
        echo $lol['username'] . '/';
    }
}
?>

我该如何改进它?

如果您查看mysql_real_escape_string的函数描述,它表示

mysql_real_escape_string—转义字符串中的特殊字符以供SQL语句使用

所以它会转义你的参数,但我不建议完全依赖它。

在未来的版本中,php将不再支持mysql或mysqli,您将需要使用PDO。我在自己的项目中多次使用的一个很好的资源是http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers。

PDO允许您创建准备好的语句,并将为您转义您的参数,并保护您免受sql注入。下面是一个使用PDO的示例:

$db = new 'PDO('mysql:host=localhost;dbname=test;charset=utf8', 'username', 'password');
$stmt = $db->prepare('
    SELECT *
    FROM `book` AS b
    WHERE b.genre = ?
');
$stmt->execute(array('fantasy')); // Will replace the ? with 'fantasy' and escape it