我有一个运行在php/mysql上的应用程序,它最近进入了生产阶段,所以我需要保护整个基础设施,从防止sql注入开始。我正在做的一件事是将用户的所有输入转换成预先准备好的语句,而不是直接查询。在我开始登录页面之前,这一切都很顺利。下面的代码是(仅限mysql查询)
我今天使用的(不安全的)但有效的代码
替换它的代码不起作用。
对于本例,user\u list将是数据库上的my表和usr、pswhash字段,用于检查登录名。id将是自动递增的行标识符。
1)
$sql_query = "SELECT * FROM user_list WHERE usr = $user AND pswHash = $passHash";
$stmt = $mysqli->prepare("SELECT * FROM user_list WHERE usr=? AND pswHash=?");
$stmt->bind_param('ss', $user, $passHash);
第二个代码片段是无效的,因为查询的输出在任何情况下都是空的,不管usr/pass组合是正确的还是错误的。
如果这还不够,我可以发布整个代码段,但我猜这个问题与sql查询有关。谢谢你的帮助
1条答案
按热度按时间wvyml7n51#
下面是我的代码:
这是假设您在将密码散列插入数据库之前使用password\u hash()创建密码散列。
总是两个都检查
prepare()
或者execute()
看看它是否返回false。如果有,那就记录下来$mysqli->error
,并继续监视http服务器错误日志。这是开发sql查询时的一般建议。如果您编写了错误的sql语法,或者您没有正确的sql特权,或者发生了其他事情,您需要知道。