如何保护您的网站免受本地文件包含& SQL注入(PHP)?
答案 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注入相同 - 您必须清理输入。
清理文件路径需要您设置一些关于文件可以包含在哪里的基本规则,并且无情地拒绝任何不符合的输入。例如,如果您只是在一个子目录中按名称包含文件,那么您可以应用以下基本算法:
.
,..
或/
(或Windows下的\
)的文件名 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注入加密密码