Php 这可以被SQL注入吗?

Php 这可以被SQL注入吗?,php,mysql,sql-injection,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);

我想知道我的代码是否真的受到了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>';
}
if($\u POST['comment'])){
$comment=strip_标记(nl2br(mysql_real_escape_string($_POST['comment'])));
$conn=newpdo(“mysql:host=$servername;dbname=$dbname”、$username、$password);
//将PDO错误模式设置为异常
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
$sql=“插入帖子(评论、作者)
值('$comment','$uid')”;
//使用exec(),因为不会返回任何结果
$conn->exec($sql);
echo“您的评论已添加到墙上!
”; }
是的,它可能被注入:您似乎没有保护您的
$uid
变量。另外,在转义后堆叠
nl2br
strip_标记
是一个坏主意-您希望将
mysql_real_escape_string
作为最后一个操作,以避免任何过滤器交互效果

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

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

不需要转义。

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

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

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


不需要逃跑。

我建造它们是为了好玩。我只是一个高中生,你真的逃走了吗?!?是的,这是可能的。看到这一点:这是厨房水槽的方法,你的陪审员在不了解任何功能的情况下添加了手册中的所有功能。你应该更好地了解
strip\u tags()
nl2br()
mysql\u real\u escape\u string()
之间的区别,以及它们的实际用途和使用时间。。。。。。然后切换到使用准备好的语句/绑定变量,只有在适当的时候才使用这些函数,我构建它们只是为了好玩。我只是一个高中生,你真的逃走了吗?!?是的,这是可能的。看到这一点:这是厨房水槽的方法,你的陪审员在不了解任何功能的情况下添加了手册中的所有功能。你应该更好地了解
strip\u tags()
nl2br()
mysql\u real\u escape\u string()
之间的区别,以及它们的实际用途和使用时间。。。。。。然后切换到使用准备好的语句/绑定变量,并且只有在适当的准备好的语句具有额外的好处时才使用这些函数,即准备好的语句不允许包含多个SQL语句,这是大多数SQL注入攻击成功所必需的。@DarwinvonCorax:实际上,SQL注入是完全可行的,在许多使用嵌套查询的上下文中,只有一条SQL语句—有时您只需要从数据库中读取敏感数据。Ok。那么更新呢?我该怎么做呢?您可以对任何SQL查询使用
prepare
,包括
SELECT
UPDATE
INSERT
DELETE
,等等。预处理语句还有一个额外的好处,即预处理语句不允许包含多个SQL语句,这是大多数SQL注入攻击成功所必需的。@DarwinvonCorax:实际上,在许多使用嵌套查询的上下文中,只有一条SQL语句,SQL注入是完全可行的,有时您只需要从数据库中读取敏感数据。好的。那么更新呢?我该怎么做呢?您可以在任何SQL查询中使用
prepare
,包括
SELECT
UPDATE
INSERT
DELETE
,等等。