2012-12-21 161 views
6

我正在为一所大学财务援助办公室的学校项目工作。该项目正在投入生产,并且除了在这里和那里进行一些小调整之外,大部分工作都已完成。我对冬季休息(现在)的主要担忧是安全,并尽我所能防止任何违规行为。人们告诉我要引导准备好的陈述。除了插入数据外,我对它们的理解程度很高。了解准备好的声明 - PHP

我有两种形式:登录表单和学生登录表单。学生登录表格输入为什么学生来到办公室。然后提交该表格,然后通过表格向咨询员表明学生等待观看的内容。

我的问题是,虽然每个谁走进财政援助办公室的学生都有他或她自己独特的问题(大部分时间),所以现在是什么让我困惑的是:

我是否需要提前思考和预做插入查询或有一种方式,因为有一个学生评论框,因此它将是一个“动态”查询,并且它将是完全独特的,所以我将如何能够创建一个查询?

<?php 
define('DB_Name', 'dbtest'); 
define('DB_User', 'root'); 
define('DB_Password', 'testdbpass'); 
define('DB_Host', 'localhost'); 

$link = mysql_connect(DB_Host, DB_User, DB_Password); 

if (!$link) { 
    die ('Could Not Connect: ' . mysql_error()); 
} 

$db_selected = mysql_select_db(DB_Name, $link); 

if (!db_selected) { 
    die('Can Not Use ' . DB_name . ': ' . mysql_error()); 
} 

$value1 = $_POST ['anum']; 
$value2 = $_POST ['first']; 
$value3 = $_POST ['last']; 
$value4 = $_POST ['why']; 
$value5 = $_POST ['comments']; 

$sql = "INSERT INTO `dbfinaid` (anum, first, last, why, comments) VALUES ('$value1', '$value2', '$value3', '$value4', '$value5')"; 

if (!mysql_query($sql)) { 
    die('Error : ' . mysql_error()); 
} 

mysql_close(); 

而且据我所知,这样做会让我容易发生SQL注入。

任何帮助将非常感激。谢谢。

+0

明显准备的陈述可以是动态的。您只需阅读以下内容:http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers 就是这样 – gd1

+0

pastebin似乎没有加载。你可以在你的问题中放置相关的代码吗? –

+0

@MikeBrant:为我加载。然而,它是一种经典的mysql_query()方法,倾向于SQL注入:) – gd1

回答

5

大厦,这里是做同样的事情的另一种方式。我觉得这是比较容易:

$dbh = new PDO('mysql:host=localhost;dbname=dbtest', $user, $pass); 

try { 
    $query = $dbh->prepare("INSERT INTO `dbfinaid` (anum, first, last, why, comments) 
    VALUES (:anum, :first, :last, :why, :comments)"); 

    $params = array_intersect_key($_POST, array_flip(array('anum', 'first', 'last', 'why', 'comments'))); 
    $query->execute($params); 
} 
catch (PDOException $e) { 
    error_log($e->getMessage()); 
    die("An error occurred, contact the site administrator."); 
} 

我喜欢输出的SQL错误日志,并呈现出不同的错误,不与代码的细节混淆用户。

+0

所以macek和你的代码将允许“评论”框对每个学生都是唯一的,它将防止诸如SQL注入之类的攻击?我在教程中看到了这两个示例,我只是不明白如果执行你们两人所规定的内容,将对我的数据库发起攻击。我正在读这个吗? – RaGe10940

+0

@BillKarwin,我不得不说,我很荣幸能让你在我的一篇文章中展开。你如何确保参数与正确的类型绑定? –

+0

@maček,MySQL不关心绑定参数的PHP类型,因此,您为PDO参数类型指定的内容无关紧要。 mysqldnd驱动程序与标量类型不同,它处理LONGBLOB,但PDO不支持LONGBLOB。 –

6

一旦你PHP's PDO读了你可以从@maček答案重写代码这样

$dbh = new PDO('mysql:host=localhost;dbname=dbtest', $user, $pass); 

try { 
    $query = $dbh->prepare("INSERT INTO `dbfinaid` (anum, first, last, why, comments) VALUES (:anum, :first, :last, :why, :comments)"); 

    $query->bindParam(':anum',  $_POST['anum'],  PDO::PARAM_INT); 
    $query->bindParam(':first', $_POST['first'], PDO::PARAM_STR); 
    $query->bindParam(':last',  $_POST['last'],  PDO::PARAM_STR); 
    $query->bindParam(':why',  $_POST['why'],  PDO::PARAM_STR); 
    $query->bindParam(':comments', $_POST['comments'], PDO::PARAM_STR); 

    $query->execute(); 
} 
catch (PDOException $e) { 
    die("error occured:" . $e->getMessage()); 
}