2009-10-19 57 views
12

我有一个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 

有没有其他的事情可以做,以进一步消毒我的输入?

+4

不检查strpos()的结果 - 如果匹配位于字符串的起始位置,它将返回零,该值将计算为false – 2009-10-19 09:24:29

+0

@Tom,该解决方案允许我也避免这种情况,无论如何,谢谢,我会记住你对未来代码的建议。 – 2009-10-19 09:34:04

+0

参见:http://stackoverflow.com/a/15825812/59087 – 2013-04-05 04:28:50

回答

27
$page = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['page']); 

大概是消毒这种最快捷的方式,这将带走任何东西,并确保它仅包含字母,数字,下划线或破折号。

+1

仍然可以攻击使用十六进制代码:看到http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-防止-SQL注入/ 12202218#12202218,也http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/12710285#12710285 – 2014-12-06 06:12:30

+2

两个链接是关于MySQL和这个问题不在于SQL注入 – NikkyD 2016-12-19 15:49:22

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