我对网站的安全性有问题。我一直在使用php和PDO。所以我要避免的是,如果用户在发送时执行的消息框中输入代码。因此,例如,如果用户在我当前的消息框中输入以下<?php echo "123"; ?>,它将向收件人发送一个空白框。我的代码如下;

$insert = $pdo->prepare("INSERT INTO message (sender_id,recipient_id,subject,message,reference_id) VALUES(:userID,:recipientID,:subject,:msg,:ref)");
$insert->bindParam(':userID', $user['user_id'], PDO::PARAM_INT);
$insert->bindParam(':recipientID', $recipientId['user_id'], PDO::PARAM_INT);
$insert->bindParam(':subject', $subject, PDO::PARAM_STR);
$insert->bindParam(':msg', $msg, PDO::PARAM_STR);
$insert->bindParam(':ref', $newRef, PDO::PARAM_INT);
$insert->execute();

我非常希望用户在消息框中输入的任何内容在发送到数据库之前都转换为字符串。因此,在这种情况下,收件人将收到消息<?php echo "123"; ?>,而不是一个空白框。注意,我的印象是,在变量绑定($insert->bindParam)期间,我已经清理了用户输入,这已经足够了,人们无法在消息框中输入代码。但是我被告知他们可以并且已经成功地删除表,例如在我的数据库中作为测试。

最佳答案

似乎您将SQL注入与XSS混为一谈。PDO参数化保护您的系统不受SQL注入的影响,但是内容仍然可以用于XSS。
继续像现在这样将数据保存在数据库中,但是当您必须回显内容时,请使用htmlentities()作为:

foreach ( $row = stmt->fetchRow(PDO::FETCH_ASSOC) ) {
    echo 'Hello ' . htmlentities($row['username']) . '!';
}

函数将正确转义<>&'"字符以防止XSS。

10-05 20:28
查看更多