防止用户枚举:哪种逻辑更好?

时间:2016-10-17 作者:Ethan O\'Sullivan

我正在禁用user enumeration 出于安全目的,防止通过查找用户ID泄露用户名。相反,每当有人试图通过ID查找用户名时,例如访问以下网站:

http://example.com?author=1
它会将他们重定向到主页。在四处搜索之后,我找到了两个具有此功能的插件,但它们都使用略有不同的逻辑来检查是否有人试图枚举:

逻辑#1

if ( preg_match( \'/(wp-comments-post)/\', $_SERVER[\'REQUEST_URI\'] ) === 0 && ! empty( $_REQUEST[\'author\'] ) ) {
    # Redirect to homepage...
}
逻辑#2
if ( ! preg_match( \'/(wp-comments-post)/\', $_SERVER[\'REQUEST_URI\'] ) && ! empty( $_REQUEST[\'author\'] ) && ( int ) $_REQUEST[\'author\'] ) {
    # Redirect to homepage...
}
这两种逻辑都有效,但我想知道哪一种更有效,以及它们的不同之处。

此外,在我发现这个逻辑之前,我已经实现了以下功能,将作者链接重定向到主页,这给了em相同的结果:

# Redirect author page to homepage
add_action( \'template_redirect\', \'author_page\' );

function author_page() {
    # If the author archive page is being accessed, redirect to homepage
    if ( is_author() ) {
        wp_safe_redirect( get_home_url(), 301 );
        exit;
    }
}
此函数是否足以阻止用户枚举?或者我应该仍然应用上面的以下逻辑之一吗?

3 个回复
最合适的回答,由SO网友:CodeMascot 整理而成

Logic #1 正在检查preg_match 功能关于0 和操作员===. 这意味着preg_match 功能必须是(int) 0(string) 0. 然后检查$_REQUEST[\'author\'] 是否为空。

并且在Logic #2 正在检查上述内容,但!()(非)操作员。并且该方法还额外检查$_REQUEST[\'author\']integer 或者不是。

检查$_REQUEST[\'author\'] 数据类型实际生成Logic #2 优于以上Logic #1, 我想。原因,尽管数据类型在PHP (PHP 是一种松散类型的语言),但最好使用它们。它为您的应用程序定义了一个具体的基础,并确保了一些核心安全性以及最佳实践。

希望答案能满足你的要求。

SO网友:Mark Kaplun

离题但可能值得一提的是,有一种不同的解决方案,例如,将用户slug更改为不同于登录名。这可能是一些随机变化,对于页面上实际有内容的实际作者,可以覆盖这些变化。

在任何情况下,我都不太相信重定向到随机位置(为什么是主页?)。如果要“禁用”URl,请提供404页。

。。。和$_REQUEST 太宽了,可能会触发对ajax请求和Cookie的重定向。您应该只关心URL参数,以便更好地坚持使用$_GET

SO网友:klewis

如果出于某种原因,您希望通过一个官方插件来处理您的安全性,该插件能够禁用作者页面、301307和目标页面重定向选项,那么请尝试。。。

Disable Author Pages

我目前正在WP版本4.6.1上测试它,它可以正常工作。