PHP& MySQL:防止攻击 - 这些功能有什么不同?

时间:2018-03-12 23:08:07

标签: php mysql database security sql-injection

我一直在处理一些用于登录数据库的示例代码,并且作者提供了两个函数,用于使输入的数据对DB安全,几乎没有解释为什么在哪里使用。我试图弄清楚它是否是一种冗余,以及我是否应该根本不使用其中一种,因为它看起来很......呃...它的作用更轻。

这是第一个:

save.image(file="mysession.RData")

现在是第二个:

load("mysession.RData")

第一个代码(看起来更有用)看起来只是在将已发布的表单字段收集到数组中时才使用一次:

save()

第二种用法几乎可以在任何时候放入数据库中的表字段或从SESSION数据中提取,例如:

saveRDS()

我主要担心的是这似乎是多余的,但也许是因为我不理解它。你真的有理由要做这两件事吗?

/*
Sanitize() function removes any potential threat from the
data submitted. Prevents email injections or any other hacker attempts.
if $remove_nl is true, newline chracters are removed from the input.
*/
function Sanitize($str,$remove_nl=true)
{
    $str = StripSlashes($str);

    if($remove_nl)
    {
        $injections = array('/(\n+)/i',
            '/(\r+)/i',
            '/(\t+)/i',
            '/(%0A+)/i',
            '/(%0D+)/i',
            '/(%08+)/i',
            '/(%09+)/i'
            );
        $str = preg_replace($injections,'',$str);
    }

    return $str;
}    
function StripSlashes($str)
{
    if(get_magic_quotes_gpc())
    {
        $str = stripslashes($str);
    }
    return $str;
}

所以,

有什么区别?

我应该只使用其中一种吗?

我是否应该在其中一个或两个地方完全使用其他东西?

感谢您对此有所了解!

1 个答案:

答案 0 :(得分:0)

IMO而不是使用特定的数据库驱动程序MySQLi,最好使用数据库抽象层。您可以使用PDO(PHP数据对象)。

<?php
/* Connect to a MySQL database using driver invocation */
$pdo = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $pdo = new PDO($dsn, $user, $password);
    $stmt = $pdo->prepare('SELECT * FROM sessions WHERE email = :email');

    // PDO will take care sanitizing the input so you do not need
    // to manually quote the parameters
    $stmt->execute([':email' => $_POST['email']]);

    $result = $stmt->fetchAll();
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

进一步阅读: http://php.net/manual/en/book.pdo.php