代码之家  ›  专栏  ›  技术社区  ›  Federico klez Culloca

清除$获取参数以避免XSS和其他攻击

  •  12
  • Federico klez Culloca  · 技术社区  · 15 年前

    我有一个PHP网站,其中包含()将内容嵌入到模板中。要加载的页面在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
    

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

    3 回复  |  直到 15 年前
        1
  •  29
  •   Mez    15 年前
    $page = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['page']);
    

    这可能是最快的清理方法,这将采取任何措施,并确保它只包含字母、数字、下划线或破折号。

        2
  •  7
  •   Community CDub    8 年前

    不要“净化”-攻击是特定于数据的使用,而不是源。在输出值时转义这些值。另见我的答案 What’s the best method for sanitizing user input with PHP?

        3
  •  4
  •   LukáÅ¡ Lalinský    15 年前

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

    $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";