这可以是SQL注入的吗?

时间:2016-03-02 23:21:40

标签: php mysql sql-injection

我想知道我的代码是否真的受到SQL注入的保护。我的网站之前已被注入,我从未真正理解如何预防它。这是我插入评论的代码:

if ($_POST['comment']) {
    $comment = strip_tags(nl2br(mysql_real_escape_string($_POST['comment'])));
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO posts (comment, authorid)
    VALUES ('$comment', '$uid')";
    // use exec() because no results are returned
    $conn->exec($sql);
    echo '<div style="width: 98%; max-width: 98%; border: 1px solid white; background-color: green; color: white; vertical-align: text-top; text-align: center;">Your comment was added to the wall!</div><br>';
}

1 个答案:

答案 0 :(得分:2)

是的,它可能被注入:您似乎没有保护您的$uid变量。此外,在转义后堆叠nl2brstrip_tags 是一个坏主意 - 您希望将mysql_real_escape_string作为最后操作,以避免任何过滤器互动效应。

更一般地说,您应该使用预处理语句而不是字符串插值来构建SQL查询。它更简单,更高效,更安全,并且需要更少的代码。您可以使用$conn->prepare创建预准备语句,并使用任意参数执行它:

$stmt = $conn->prepare("INSERT INTO posts (comment, authorid) VALUES (?, ?)");
$stmt->execute(array($comment, $uid));

无需转义。