这段代码是否安全,能够防止SQL注入攻击?

3

我希望尽可能地让我的代码免受任何类型的攻击,希望能得到有关我下面使用的简单代码的一些见解。如果代码存在漏洞,如何使其更安全以及为什么会更安全将是很棒的。我已经阅读过使用准备好的语句作为最佳实践以保护代码免受攻击。

<?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;
    ?>
4个回答

7

看起来您已经免受SQL注入的威胁,但是在输出时存在XSS问题。请确保在输出用户输入之前始终对其进行清理/转义。

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

应变成

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

太棒了,感谢提供示例。我尝试了一下,它可以工作,但是我能否使用一个函数/过滤器来防止<p>等标签被添加到数据库中以保持可读性? - Yamaha32088
当然可以,但请确保在将它们绑定到预处理语句之前进行任何替换或净化。 - user349511
考虑使用HTML Purifier来防止XSS攻击。它非常有效,但会影响性能。 - Varun Jain

5

由于使用了预处理语句,它是安全的,可以防止SQL注入。但请注意,在浏览器中回显这些变量可能会导致XSS问题。 最好的方法是始终确保用户输入干净无误,通常使用htmlspecialchars来输出就足够了,更好的方法是在提交到数据库之前清理用户输入。


4

是的,在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值。

只是一个小建议,最好将原始数据存储在数据库中,并在输出时进行清理。 - itachi
以前从未考虑过,为什么呢?是为了更快还是避免数据丢失? - Skatox

1

出于习惯,我也会考虑使用bindParam.. 我的理解是PDO将进行类型检查(虽然对PARAM_STR无关紧要),这可能会使您免受其他攻击向量的影响。

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

$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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接