【问题标题】:Sanitize $_GET parameters to avoid XSS and other attacks清理 $_GET 参数以避免 XSS 和其他攻击
【发布时间】:2010-12-07 22:40:52
【问题描述】:

我在 php 中有一个网站,它确实 include() 将内容嵌入到模板中。要加载的页面在 get 参数中给出,我将“.php”添加到参数的末尾并包含该页面。我需要做一些安全检查以避免 XSS 或其他东西(不是 mysql 注入,因为我们没有数据库)。我想出的是以下内容。

$page = $_GET['page'];

if(!strpos(strtolower($page), 'http') || !strpos($page, '/') ||
    !strpos($page, '\\') || !strpos($page, '..')) {
        //append ".php" to $page and include the page

我还能做些什么来进一步清理我的输入吗?

【问题讨论】:

  • 不要像那样检查 strpos() 的结果 - 如果匹配在字符串的开头,它将返回零,这将评估为 false
  • @Tom,接受的解决方案也让我避免了这种情况,无论如何谢谢,我会记住你对未来代码的建议。

标签: php sanitization


【解决方案1】:
$page = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['page']);

这可能是清理此内容的最快方法,这将获取任何内容并确保它仅包含字母、数字、下划线或破折号。

【讨论】:

【解决方案2】:

不要“清理” - 攻击特定于数据的使用,而不是源。在输出值时转义值。另请参阅我对What’s the best method for sanitizing user input with PHP?的回答

【讨论】:

  • 我读过它,但我认为它不适合我正在开发的网站。
【解决方案3】:

在源代码中定义一个明确的页面列表,然后使用它来检查输入。是的,这是更多的工作,但它非常清楚什么是允许的,什么是不允许的。例如:

$AVAILABLE_PAGES = array('home', 'news',  ...);
$AVAILABLE_PAGES = array_fill_keys($AVAILABLE_PAGES, 1);

$page = $_GET['page'];
if (!$AVAILABLE_PAGES[$page]) {
   header("HTTP/1.0 404 Not Found");
   die('Page not found.');
}

include "pages/$page.php";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 2011-09-15
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多