这是我关于stackoverflow的第一篇文章,我阻止你我不会说英语但我可以尝试清楚我的问题:)
我有一份PHP注册表,我有两份声明:
第一声明:搜索我的表格"用户"例如,如果没有其他伪/电子邮件。
$request = $db->prepare("SELECT * FROM users WHERE USE_USERNAME = :username AND USE_EMAIL = :email AND USE_PASSWORD = :password");
$request->bindParam(':username', $username, PDO::PARAM_STR);
$request->bindParam(':email', $email, PDO::PARAM_STR);
$request->bindParam(':password', $password, PDO::PARAM_STR);
$request->execute();
var_dump($request);
while ($row = $request->fetchAll(PDO::FETCH_ASSOC)){
if ($username == $row['USE_USERNAME']){ ...
第二声明:如果用户输入了良好的数据,我可以将输入插入我的数据库。
$request = $db->prepare("INSERT INTO users (USE_USERNAME, USE_EMAIL, USE_PASSWORD) VALUES (:username, :email, :password)");
$request->bindParam(':username', $username, PDO::PARAM_STR);
$request->bindParam(':email', $email, PDO::PARAM_STR);
$request->bindParam(':password', $pass_hache, PDO::PARAM_STR);
$request->execute();
我的问题:
当我在输入中插入 ' OR 1 = 1' 时,我可以在数据库中插入相同的电子邮件地址。
我在这个网站上搜索了一个解决方案,并将这些行添加到我的数据库连接中:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
但我的数据插入即使我在我的PHP代码中放入错误消息(在我的while循环中使用Javascript弹出窗口)。
我是初学者,我正在寻找类似的问题,但如果您有答案,请感谢您的帮助:)
度过愉快的一天:)
编辑:当我在PHP中管理错误时,我会解释你:
while ($row = $request->fetchAll(PDO::FETCH_ASSOC)){
if ($username == $row['USE_USERNAME']){
?>
<script type="text/javascript">
alert("Erreur#5 : Pseudonyme Faux !"); //Cas dans lequel les identifiants sont incorrects.
document.location.href="subscribe.php";
</script>
<?php
$error++;
它非常平庸,但我有一个从0开始的变量$ error,我为了停止PHP脚本而增加它。
唯一用户名和电子邮件的错误。在我的准备语句之前,我的错误有效,但现在我想从SQL注入中阻止我的表单。
答案 0 :(得分:0)
这是一个有很多怪癖的问题:
1 - 您应该使用类似的方式验证您的输入
filter_var('bob@example.com', FILTER_VALIDATE_EMAIL)
http://php.net/manual/en/function.filter-var.php
第二 - 你应该在你的数据库中放置一个唯一性约束,关于你的电子邮件
ALTER TABLE user ADD UNIQUE unique_index_email (email);
3 - 如果用户名和密码也相同,您的查询仅返回电子邮件。您应该只查询电子邮件。就像是
$request = $db->prepare("SELECT * FROM users WHERE USE_EMAIL = :email");
因为这将确保如果存在1,则将返回