【发布时间】:2018-10-21 22:23:35
【问题描述】:
我有一个在 php/mysql 上运行的应用程序,它最近进入了生产阶段,所以我需要保护整个基础设施,从一些防止 SQL 注入的保护开始。 我正在做的一件事是将用户的所有输入转换为准备好的语句而不是直接查询。 在我开始在登录页面上工作之前,这非常有效。 以下代码为(仅限mysql查询)
- 我今天使用的(不安全的)但功能正常的代码
- 替换它的代码不起作用。
对于这个例子,user_list 将是我数据库上的表和usr,pswHash 检查登录的字段。 id 将是自动递增的行标识符。
1)
$sql_query = "SELECT * FROM user_list WHERE usr = $user AND pswHash = $passHash";
2)
$stmt = $mysqli->prepare("SELECT * FROM user_list WHERE usr=? AND pswHash=?");
$stmt->bind_param('ss', $user, $passHash);
第二个代码片段不起作用,因为无论使用正确还是错误的 usr/pass 组合,查询的输出在任何情况下都将为空。
如果这还不够,我可以发布整个 sn-ps,但我猜这个问题与 SQL 查询有关。 谢谢你的帮助
【问题讨论】:
-
对我来说看起来不错。你检查过mysqli errors吗?
-
旁注:您如何对密码进行哈希处理?你应该使用
password_hash()和password_verify()。 -
你缺少
$stmt->execute();和$stmt->fetch(); -
顺便说一句,这不是在 PHP 中使用密码的正确方法,即使密码是由外部程序管理的(例如:Active Directory)
-
'它最近进入了生产阶段' - 所以现在你想让它安全吗?!
标签: php mysql prepared-statement mariadb sql-injection