【发布时间】:2020-11-03 03:54:45
【问题描述】:
我的 PHP 站点正在连接到 SQL Server 数据库,然后创建会话并重定向到“仪表板”:
- 如果用户名和密码错误,它会重定向 - 效果很好。
- 如果用户名存在但密码错误,则无法重新加载?
看起来很简单,但我遇到了麻烦,请帮忙。
还有让这段代码更好的建议也很好:)
<?php
session_start();
if ( ! empty( $_POST ) ) {
if ( isset( $_POST['username'] ) && isset( $_POST['password'] ) ) {
$username = $_POST['username'];
$password = $_POST['password'];
$connectionInfo = array( "Database"=>"WebUIUsers", "UID"=>"DBUser", "PWD"=>"Password1234");
$conn = sqlsrv_connect( "sqlserver01", $connectionInfo);
if( $conn ) {
// Connection established
$sql = "SELECT * FROM tbl_webui_users WHERE username='$username'";
$stmt = sqlsrv_query( $conn, $sql );
if(!(sqlsrv_fetch_array( $stmt )) >=1){
header("Location: ./index.php");
}
// if username exists but password is wrong redirect to try again ?
while( $row = sqlsrv_fetch_array( $stmt ) ) {
if( $row[password] === $password ) {
$_SESSION['user_session'] = $username;
header("Location: ./dashboard.php");
sqlsrv_free_stmt( $stmt);
}else{
header("Location: ./index.php");
} //end if( $row[password] == $password )
} //end while( $row = sqlsrv_fetch_array( $stmt ) )
}else{
echo "Connection to database could not be established.";
( print_r( sqlsrv_errors(), true));
} //end if( $conn )
} //end if
} // end if
?>
【问题讨论】:
-
此代码极易受到sql injection 的影响。你应该使用prepared statements with parameter binding。
-
感谢 Wesley,阅读了这篇文章,将进行一些编辑 :)
-
另外,您不应该将密码以明文形式存储在数据库中,而应使用知名库(例如
bcrypt:stackoverflow.com/questions/4795385/…)对其进行哈希处理 -
避免对数据库对象使用 Systems Hungarian Notation(即不要给表添加
tbl_之类的前缀 - 因为webui_users可能是VIEW或 UDF 而不是BASE TABLE)。 -
这种意外行为的实际原因是您调用了两次
sqlsrv_fetch_array(),所以while ($row = sqlsrv_fetch_array($stmt)) { ... }根本没有返回任何行。
标签: php html sql-server sqlsrv