如何保护您的网站免受本地文件包含和PHP中的SQL注入?

时间:2009-01-16 19:27:44

标签: php sql-injection

如何保护您的网站免受本地文件包含& SQL注入(PHP)?

7 个答案:

答案 0 :(得分:3)

有许多措施需要采取。在存储到数据库之前,请务必清理所有输入。我建议对将要存储的所有数据使用mysql_real_escape_string()。将字符输入限制为合理的长度,并确保获得该字段期望的数据类型。锁定多次尝试提交特定数据区域。抓取上传文件的内容以查找恶意模式。

Wikibooks有一章关于SQL注入;

列表一直在继续。幸运的是,即使在这方面做了一点努力也可以修补大量的漏洞。

答案 1 :(得分:2)

SQL的准备语句(请参阅PDO::prepare())或正确转义(PDO::quote())。

对于本地路径,您需要仔细清理输入(野蛮但安全:preg_replace('/[^a-z]/','',$str))或避免在路径中使用不受信任的数据(使用ID,预定义字符串等)

答案 2 :(得分:1)

答案 3 :(得分:1)

为了防止SQL注入,我建议使用PDO(http://us3.php.net/pdo)。你需要的扩展等可以阻止采用,但它是好东西。

就我个人而言,我使用自制的数据库访问层,我的所有查询都通过这一层进行实现,包括mysql_real_escape_string()

答案 4 :(得分:1)

“本地文件包含”是指在用户输入构建的路径上调用include()之类的情况,例如在非常简单的基于文件的CMS或类似的情况下?如果是这样,答案基本上与SQL注入相同 - 您必须清理输入。

清理文件路径需要您设置一些关于文件可以包含在哪里的基本规则,并且无情地拒绝任何不符合的输入。例如,如果您只是在一个子目录中按名称包含文件,那么您可以应用以下基本算法:

  1. 拒绝包含.../(或Windows下的\)的文件名
  2. 将文件名限制为基本字母数字字符
  3. 添加包含目录名称并附加相应的扩展名
  4. PHP文档提供了有关filesystem security的更多信息。您还可以设置open_basedir以限制特定目录树中的文件访问,但这是PHP的“安全模式”的一部分,该模式已被弃用(并将在PHP 6.0中删除),因为它不是真的非常安全。

答案 5 :(得分:0)

正如其他人所说,mysql\_real\_escape\_string()是防止SQL注入的最安全的方法。我为所有SQL使用自定义数据库接口类,它通过sanitize()函数传递所有需要的变量。这是从课堂上剥离的清理功能,以防你想看看它。

/**
* Sanitize variable for querying
*
* @param mixed $var         The variable to sanitize
* @param bool $deep         Will inspect the string deeper, converting 'null' to NULL and adding '' around strings
* @param mixed $numstrings  Whether or not to treat numbers as strings (ie add quotes)
* @return $var
*/
function sanitize($var, $deep = true, $numstrings = false) {
    if (is_array($var)) {   //run each array item through this function (by reference)
        foreach ($var as $key=>$val) {
        $var[$key] = sanitize($val, $deep, $numstrings);
        }
    }
    else if (is_null($var) || ( $deep && preg_match('/^null$/i', $var) > 0 ) ) {   //convert null variables to SQL NULL
        $var = "NULL";
    }
    else if (is_bool($var)) {   //convert boolean variables to binary boolean
        $var = ($var) ? 1 : 0;
    }
    else if ($numstrings && is_string($var)) {
        $var = mysql_real_escape_string($var);
        if ($quotes) {
        $var = "'". $var ."'";
        }
    }
    else if (!is_numeric($var)) { //clean strings
        $var = mysql_real_escape_string($var);
        if ($deep) {
        $var = "'". $var ."'";
        }
    }
    return $var;
}

对于“本地文件包含”,我使用两种不同的方法。请记住,最安全的技术是将敏感文件保存在无法从Web访问的位置。

如果它只是一个文件或者我不希望世界看到,我只需在文件名中加上'.ht'。默认情况下,Apache拒绝访问以“.ht”开头的文件。只要确保不要将文件命名为Apache配置文件(.htaccess,.htpasswd等)。

如果您有多个不想访问的文件,请将它们全部保存在站点的子目录中(同样,敏感文件应该在其他位置)。然后在子目录中添加一个拒绝访问目录的.htaccess文件(它们仍然可以通过PHP访问)。

#this is all you need in the file
Order Allow , Deny
Deny from all

答案 6 :(得分:-1)

在提交之前避免SQL注入加密密码