繁体   English   中英

这段代码对 SQL 注入安全吗

[英]Is this code safe from SQL injection

我想让我的代码尽可能安全地免受任何类型的攻击,我希望对我在下面使用的简单代码有所了解。 关于如何使其更安全(如果它易受攻击)以及为什么会很棒的任何指示。 我读过使用准备好的语句是防止攻击的最佳实践。

<?php 

    try {
    $conn = new PDO('mysql:host=localhost;dbname=test', 'user', 'XXXXX');
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare('INSERT INTO people (name, email) VALUES (:name, :email)');

    $stmt->execute(array(':name' => $_POST['name'], ':email' => $_POST['email']));

    #If one or more rows were returned...

    } catch(PDOException $e){
        echo'ERROR: ' . $e->getMessage();
    }
    echo "Added $_POST[name] with email $_POST[email] succsessfully";
    $conn = null;
    ?>

看起来您可以避免 SQL 注入,但现在您的回声中存在 XSS 问题。 确保在回显之前始终清理/转义用户输入。

echo "Added $_POST[name] with email $_POST[email] succsessfully";

应该成为

echo "Added" . htmlspecialchars($_POST['name']) . "with email" . htmlspecialchars($_POST['email']) . "succsessfully";

由于准备好的语句,它是 SQL 注入安全的。 但请记住,在浏览器中回显这些变量可能会导致 XSS 问题。 最好始终确保您的用户输入是干净的,通常 htmlspecialchars 足以输出,更好的是在将用户输入提交到数据库之前清理它。

是的,在 SQL 查询中使用参数降低了 SQL 注入攻击的可能性。 但我会清理从 POST 收到的数据,还要检查是否存在。

$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : NULL;
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : NULL;
$stmt->execute(array(':name' => $name, ':email' => $email));

请记住,如果您传递 null,则这些数据库字段应接受 null 值

我也会考虑出于习惯使用bindParam ..我的理解是 PDO 会进行类型检查(这对 PARAM_STR 并不重要),这可能会使您免于其他一些攻击媒介。

(并添加 XSS 消毒 Skatox、Ryan 和 John 提到的内容。)

$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : NULL;
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : NULL;
stmt = bindParam(':name',$name, PDO::PARAM_STR);
stmt = bindParam(':email',$email, PDO::PARAM_STR);
$stmt->execute();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM