避免 PHP 中代码注入的最佳方法

2022-08-30 17:26:58

我的网站最近遭到了一个无辜代码的攻击:

<?php
  if ( isset( $ _GET['page'] ) ) {
    include( $ _GET['page'] . ".php" );
  } else {
    include("home.php");
  }
?>

那里没有SQL调用,所以我不害怕SQL注入。但是,显然,SQL并不是唯一的注入。

这个网站有一个解释和一些避免代码注入的例子:http://www.theserverpages.com/articles/webmasters/php/security/Code_Injection_Vulnerabilities_Explained.html

如何保护此代码免受代码注入的影响?


答案 1

使用白名单并确保该页面在白名单中:

  $whitelist = array('home', 'page');

  if (in_array($_GET['page'], $whitelist)) {
        include($_GET['page'].'.php');
  } else {
        include('home.php');
  }

答案 2

清理输入的另一种方法是确保只允许的字符(没有“/”,“.”,“:”,...)都在里面。但是,不要对字符使用黑名单,而要对允许的字符使用白名单:

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

...然后是file_exists。

这样,您可以确保只执行要执行的脚本(例如,这将排除“blabla.inc.php”,因为不允许使用“.”)。

注意:这是一种“黑客攻击”,因为这样用户就可以执行“h.o.m.e”,它会给出“主页”页面,因为它所做的只是删除所有禁止的字符。这并不是为了阻止那些想要在你的页面上可爱的东西的“聪明人”,但它会阻止人们做非常糟糕的事情。

BTW:您可以在.htaccess文件中做的另一件事是防止明显的攻击企图:

RewriteEngine on
RewriteCond %{QUERY_STRING} http[:%] [NC]
RewriteRule .* /–http– [F,NC]
RewriteRule http: /–http– [F,NC]

这样,所有使用“http:”url(和查询字符串)访问的页面都会导致“禁止访问”错误消息,甚至无法到达php脚本。这样可以减少服务器负载。

但请记住,查询字符串中不允许使用“http”。在某些情况下,您的网站可能需要它(也许在填写表格时)。

BTW:如果你能读懂德语:我也有一篇关于这个话题的博客文章


推荐