根据用户输入重写应用程序

时间:2014-05-10 05:58:28

标签: php security validation code-injection

感谢您阅读本文。 我担心网络环境中的安全防御,并且我在输入验证方面遇到了很多困难。

此处的上下文是一个Web环境,用户输入用户名和密码,通过POST表单传递给文件verify.php

我有以下代码,我想在进入应用程序之前验证用户输入。但我的问题是:是否有可能从该用户的输入中注入实际上会重写应用程序本身的代码?

skip to "REAL QUESTION HERE" if you don't have much time.

/* I have left some questions along the code in commentary, 
if you feel you can answer these it would be greatly appreciated too. */ 

所有这些安全概念正在融化我的大脑。

<?php

//Only sources provided by the server are allowed?

/*is it relevant to use this because I read that
 you have to use webkits for cross-platform performences 
and that they are not supported in many cases.  */
Content-Security-Policy: 
default-src 'self';
script-src 'self';
style-src 'self';
connect-src 'self';
media-src 'self';
object-src 'self';
frame-src 'self'

//prevent javascript from accessing cookies?
//I will only use $_SESSION variables.

ini_set('session.cookie_httponly', 1 );
ini_set('session.cookie_secure', 1 );
session_start();
session_regenerate_id(); /*is it mandatory if I plan to use a generated
                         random value using strong entropy to make 
                         a login token?*/

include('functions.php');//weak point?

//for further validation use
$usernameSafe = '';
$passwordSafe = '';

//check if the values exists.
if (isset($_POST['username']) && isset($_POST['password'])) {

    //validation of user input before letting it access the app. 
    //weak point?
    if (isValidInput($_POST['username']) && isValidInput($_POST['password'])) { 

        $formUn = $_POST['username'];//weak point?
        $formPw = $_POST['password'];//here too?

    }

}


//@@@@@@@@@@@@@ REAL QUESTION HERE @@@@@@@@@@@@@@
/*BYPASS_IDEA the input could be : 

    validUserName']) || 1 == 1 ) { inject php code here } }/* 

    //1 == 1 is used to bypass the condition.

    /*two bracket to close the two 'if' statements involved
    and end the app' then also escape evrything after it 
    with a block commentary char left unclosed */


//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//from the php file 'functions.php'
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

function isValidInput($string) { 

    $isValid = FALSE;

    if ($string && is_string($string)) {

        /*can it protect against xss attack using characters
        like &lt or any coding tags? */
        if (mb_detect_encoding($string, 'UTF-8', TRUE) != FALSE  &&
        ctype_alnum($string)) {

            //Is this how buffer attacks are prevented?
            if (strlen($string) <= INPUT_LENGHT) 
                $isValid = TRUE;

        }

    }

    return $isValid;

}

?>

最终,如果可能,这可以在isset()事件中实现吗?

1 个答案:

答案 0 :(得分:2)

根据我的经验,防止任何类型的代码注入攻击(sql,php等等)的最重要因素是用户数据的清理。当您收到输入数据时,使用特定规则清理它们(这可以通过php preg_match 函数轻松实现)。 这样,如果被认为有害,您可以拒绝输入。此外,当您收到$ _GET或$ _POST变量时,它不会被视为代码,除非您以这种方式明确使用它。 例如,让我们考虑以下情况:

<?php
  if ( isset( $ _GET['view'] ) ) 
  {
    include( "viewsfolder/" . $ _GET['view'] . ".php" );
  } 
?> 

在这种情况下,您的代码可能会被注入有害代码。让我们说攻击者可以找到一种方法将恶意文件上传到您的服务器到“viewsfolder。然后他可以轻松地调用这个文件,并通过传递$ _GET参数(视图)的名称使其在您的PHP代码中执行文件。

另一个更有害的例子可能是你使用php eval()函数执行字符串作为php代码。例如,您可以接收用户的输入,将其与您以字符串格式存储的其他代码连接,然后通过eval()函数调用它。这可能最终导致代码注入。

如果您使用正则表达式清理输入,以防止不需要的代码(如']','}',\'字符,我认为您不会遇到某种问题。另外请记住,为了防止sql注入,你必须转义输入 - 如果你将数据用于某些SQL DBMS(这也可以通过 mysqli_real_escape_string 轻松完成 - 如果你使用mysqli连接器 - 或PDO的引用功能或使用PDO准备语句。)