这仍然容易受到SQL攻击吗?你能看到任何问题吗?

时间:2014-01-28 09:59:24

标签: php mysql sql html5 validation

嘿,整晚都在弄乱这个,只是想知道是否有人能注意到我的代码存在任何缺陷?在我使用过时的sql连接字符串之前我被告知所以我已经更新了。反馈会很棒!

 <?php
    if ( empty( $_POST ) ){
    ?>

    <form method="post" action="">
        <div class="form-group">
        <label>Full Name:</label>
        <input class="form-control" type="text" name="sub_name" />
        <br>
        <label>Email:</label>
        <input class="form-control" type="text" name="sub_email" />

            <div class="pull-right">
                <input class="btn btn-success" type="submit" value="Subscribe" />
            </div>

        </div>
    </form>

    <?php
    } else {

    try {


    $db = new PDO( 'mysql:host=localhost;dbname=test', $subsc_username, $subsc_password );

    $form = $_POST;
    $subsc_name = $form[ 'sub_name' ];
    $subsc_email = $form[ 'sub_email' ];

    $sql = "INSERT INTO subscribers ( 
        subsc_name, subsc_email ) 
        VALUES ( 
        $subsc_name, $subsc_email )";

    $query = $db->prepare( $sql );
    $query->execute( array( 'subsc_name'=>$subsc_name, 'subsc_email'=>$subsc_email, ) );

    }
    catch(PDOException $e)
    {
    echo $e->getMessage();
    }
    }

    ?>    

4 个答案:

答案 0 :(得分:1)

您尝试绑定execute()中的值,但直接插入变量。

你的数组末尾有一个无用的,

此外,您应该确定您没有使用模拟语句。

你应该改变这个:

$sql = "INSERT INTO subscribers ( 
        subsc_name, subsc_email ) 
        VALUES ( 
        :subsc_name, :subsc_email )";
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$query = $db->prepare( $sql );
$query->execute( array( ':subsc_name'=>$subsc_name, ':subsc_email'=>$subsc_email ) );

答案 1 :(得分:1)

您在准备好的声明中没有使用占位符。正确的用法是:

<?php
// $_POST might be empty even if the request is a POST
if ('POST' === $_SERVER['REQUEST_METHOD']) {
    try {
        $db = new PDO('mysql:host=localhost;dbname=test', $subsc_username, $subsc_password);
        // default error mode is to return FALSE
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        die($e->getMessage());
    }

    $subsc_name = $_POST['sub_name'];
    $subsc_email = $_POST['sub_email'];

    // never put variables directly in your SQL queries
    $sql = 'INSERT INTO subscribers (subsc_name, subsc_email) VALUES (:subsc_name, :subsc_email)';

    try {
        $query = $db->prepare($sql);
        $query->execute(array(
            ':subsc_name'  => $subsc_name,
            ':subsc_email' => $subsc_email,
        ));
    } catch (PDOException $e) {
        die($e->getMessage());
    }
} else {
    echo <<<EOF
    <form method="post" action="">
        <div class="form-group">
            <label>Full Name:</label>
            <input class="form-control" type="text" name="sub_name" />

            <br>

            <label>Email:</label>
            <input class="form-control" type="text" name="sub_email" />

            <div class="pull-right">
                <input class="btn btn-success" type="submit" value="Subscribe" />
            </div>
        </div>
    </form>
EOF;
}
?>

答案 2 :(得分:0)

是的,确实如此。你没有准备模板,你只需要在带有非转义值的$ sql中进行现成的查询。

答案 3 :(得分:0)

如果你查看这一行:

$sql = "INSERT INTO subscribers ( 
    subsc_name, subsc_email ) 
    VALUES ( 
    $subsc_name, $subsc_email )";

尝试了解自己在做什么。您正在使用双qoutes,这意味着实际上解析了变量。所以这一行已经评估为

$sql = "INSERT INTO subscribers ( 
    subsc_name, subsc_email ) 
    VALUES ( 
    VALUE_OF_$subsc_name, VALUE_OF_subsc_email )";

所以是的,它容易受到SQL注入攻击。 如果你使用单引号,那么该行将保留为第一个版本,但它仍然不是PDO如何工作。查看this site以获取有关如何使用它的示例。