2

我在让 HTTP 授权工作时遇到了一些困难。由于某种原因,我一直得到的只是弹出框询问用户名和密码。这是我正在使用的代码。有人可以告诉我哪里出错了吗?

if (  !isset(  $_SERVER['PHP_AUTH_USER']  )  || !isset(  $_SERVER['PHP_AUTH_PW']  ) )
{
    authorizeUser();
    //if no result, there is no user
}
else
{
    $user = htmlentities( trim( $_SERVER['PHP_AUTH_USER'] ) );
    $pass = htmlentities( trim( $_SERVER['PHP_AUTH_PW'] ) );
    $pass = md5( $_SERVER['PHP_AUTH_PW'] );

    //connect to MySQL data here//


    $sql = "SELECT user_name,pwd FROM tableName WHERE user_name='$user' AND pwd='$pass'";
    $result = mysql_query( $sql );
    if( mysql_num_rows( $result ) == 0 )
    {
        authorizeUser();
    }
    else
    {
        header( "Location: somepage" );
    }
}

function authorizeUser(  )
{
    header( 'WWW-Authenticate: Basic realm="Restricted Area"' );
    header( 'HTTP/1.0 401 Unauthorized' );
            echo "text if cancel button used";
}//end authorizedUser
4

2 回答 2

0

我现在将跳过 SQL 注入演讲,但不要htmlentities()在查询之前使用密码或用户。它用于将字符串显示回浏览器或在 url 中传递,而不是用于转义与 SQL 结果进行比较或插入数据库的数据。html_entity_decode ()如果用户名或密码中可能包含特殊的 html 字符,则您需要在使用之前对其进行解码 。

回到注入保护...为了防止注入而不通过 mysqli 或 pdo 移动到准备好的语句,使用mysql_real_escape_string()代替htmlentities();

$user = mysql_real_escape_string( html_entity_decode (trim( $_SERVER['PHP_AUTH_USER'] ) ));
$pass = mysql_real_escape_string( html_entity_decode (trim( $_SERVER['PHP_AUTH_PW'] ) ));
$pass = md5( $pass );
于 2012-10-29T14:24:08.777 回答
0

我认为这可能是一个问题,因为您只是将 $pass 的值设置了两次,

$pass = htmlentities( trim( $_SERVER['PHP_AUTH_PW'] ) );
$pass = md5( $_SERVER['PHP_AUTH_PW'] );

你的意思是这样做吗?

$pass = htmlentities( trim( $_SERVER['PHP_AUTH_PW'] ) );
$pass = md5( $pass );
于 2012-10-29T14:25:54.750 回答