如何在POST到数据库之前将用户消息转换为字符串?所以几乎如何避免使用php pdo mysql进行SQL注入等

时间:2015-05-20 09:36:19

标签: php mysql validation pdo

我遇到网站安全问题。我一直在使用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-&gt; bindParam),这足以让人们无法在消息框中输入代码。但我被告知他们可以成功地删除表格,例如在我的数据库中作为测试。

2 个答案:

答案 0 :(得分:1)

似乎您正在将SQL注入与XSS混为一谈。 PDO参数化可保护您的系统免受SQL注入,但内容仍可用于XSS。

按照您现在的步骤继续保存数据库,但是当您必须回显内容时,请使用htmlentities()

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

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

答案 1 :(得分:0)

是的。一旦使用绑定变量,恶意用户发送的字符串就无法构建您不想要的其他查询。