我正在禁用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;
}
}
此函数是否足以阻止用户枚举?或者我应该仍然应用上面的以下逻辑之一吗?
最合适的回答,由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
是一种松散类型的语言),但最好使用它们。它为您的应用程序定义了一个具体的基础,并确保了一些核心安全性以及最佳实践。
希望答案能满足你的要求。