我希望我的代码尽可能安全,不受任何类型的攻击,我希望对我在下面使用的简单代码有所了解。有关如何使其更安全的任何指示,如果它是脆弱的,为什么会很棒。我已经读过,使用准备好的语句是防止攻击的最佳做法。
<?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;
?>
答案 0 :(得分:7)
看起来你可以安全地使用SQL注入,但现在你的回声中存在XSS问题。确保在回显之前始终清理/转义用户输入。
echo "Added $_POST[name] with email $_POST[email] succsessfully";
应该成为
echo "Added" . htmlspecialchars($_POST['name']) . "with email" . htmlspecialchars($_POST['email']) . "succsessfully";
答案 1 :(得分:5)
由于准备好的语句,它是SQL注入安全的。但请记住,在浏览器中回显这些变量可能会导致XSS问题。 最好是始终确保您的用户输入是干净的,通常htmlspecialchars足以输出,更好的是在您将用户输入提交到数据库之前清理它。
答案 2 :(得分: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,那些数据库字段应接受空值
答案 3 :(得分:1)
我也会考虑习惯使用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();