如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
我目前正在建立一个网站,用户需要创建一个个人帐户才能玩同一个网站上的游戏.我目前难以搞清楚的是如何在忘记密码的情况下为用户实现安全密码重置功能.
这是目前的流程:
第1步:用户点击网站上的"忘记密码"链接.
第2步:在发送电子邮件之前,用户将被带到表格并输入两次电子邮件地址.
第3步:电子邮件包含指向另一个表单的链接,用户可以在其中输入两次新密码进行确认.输入第二个表单后,系统会在数据库中的新Recover_Password表中插入一条新记录,该数据库包含"id","token","created_at"和"expires_at"列.
这是链接 - >(mywebsitename).com/form?id = 99999&token =
其中"id"是用户的id,"token"是从do_hash($id . date('Y-m-d'))
步骤4生成的:用户填写表单并进入登录页面.系统从数据库中清除令牌记录,并从用户表中更新用户的当前密码.
此外,我想知道如果用户在第二种形式时尝试刷新浏览器页面该怎么办.我目前只允许访问页面,如果get参数中有id和token值,并且它们都存在于数据库中.
我在整个网站上使用Codeigniter,如果这是一种安全的方式,我需要知道如何以及我应该如何处理令牌和数据库.谢谢!!