Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这段代码对SQL注入安全吗_Php_Mysql_Pdo - Fatal编程技术网

Php 这段代码对SQL注入安全吗

Php 这段代码对SQL注入安全吗,php,mysql,pdo,Php,Mysql,Pdo,我希望使我的代码尽可能安全,不受任何类型的攻击,我希望能对下面使用的简单代码有一些见解。任何关于如何使它更安全,如果它是脆弱的,为什么会是可怕的指针。我读到,使用事先准备好的声明是防范攻击的最佳做法 <?php try { $conn = new PDO('mysql:host=localhost;dbname=test', 'user', 'XXXXX'); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRM

我希望使我的代码尽可能安全,不受任何类型的攻击,我希望能对下面使用的简单代码有一些见解。任何关于如何使它更安全,如果它是脆弱的,为什么会是可怕的指针。我读到,使用事先准备好的声明是防范攻击的最佳做法

<?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问题。
最好的方法是始终确保用户输入是干净的,通常htmlspecialchars足以用于输出,最好是在将用户输入提交到数据库之前清理用户输入。

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

echo "Added $_POST[name] with email $_POST[email] succsessfully";
应该成为

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

是的,在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,那些数据库字段应该接受空值

< P>我也会考虑使用习惯。我的理解是,PDO将进行类型检查(这对PARAM_STR并不重要),这可能会使您免受其他攻击向量的攻击

(再加上XSS消毒斯卡托,Ryan和John提到的。)


太棒了,谢谢你给我的例子,我试过了,它成功了,但是我可以使用一个函数/过滤器来保持,等等。。。标签被添加到DB以保持它的可读性当然,但确保你做任何替换或消毒,你想做,然后将它们绑定到准备好的声明。考虑使用HTML净化器,以防止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();