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