在人们将要访问的页面上运行此查询是否安全?

时间:2010-12-17 04:13:53

标签: php security mysqli prepared-statement

很抱歉,这可能是一个非常愚蠢的问题,但是在人们将要查看的页面上运行此代码是否安全,或者我应该将其包装到函数中并调用它?

$stmt = $db->prep_stmt("select * from .... where userid = ? and username = ?"); 

/* Binding 2 parameters. */
$stmt->bind_param("is", $userid, $username);

/* Binding 2 result. */
$stmt->bind_result($isbn, $title, $author, $coef, $bookid);

/* Executing the statement */
$stmt->execute( ) or die ("Could not execute statement");

/*
 * Making PHP buffer the whole result,
 * not recommended if there is a blob or
 * text field as PHP eats loads of memory
 */
$stmt->store_result();
while ($stmt->fetch()) {
 /*
  * Here you can use the variables $isbn, $title, $author, $coef, $bookid,
  * which contatin the data for 1 row.
  */
  print "<tr>".
  "<td>".$isbn."</td>".
  "<td>".$title."</td>".
  "<td>".$author."</td>".
  "</tr><tr><td>";

}

2 个答案:

答案 0 :(得分:5)

从安全角度来看,它们将是相同的。这是一个软件设计问题。但是,您可能需要考虑更好的错误处理(至少对于生产而言)。具体来说,没有必要泄漏错误原因(“无法执行语句”)。通常,您需要一个通用错误页面(“抱歉,服务器有问题!请尝试访问主页。”)。

答案 1 :(得分:1)

如果我错了,请纠正我,但你似乎担心人们可以查看你的PHP代码,但你把它放在一个不同的文件中并且做了

$dataAccessor = new MyDataAccessorObject();
$dataAccessor->checkUser($userId, $userName);

他们不会看到任何有意义的,对吗?

该代码是否是函数并不重要。即使在人们“查看”的PHP上,他们也无法看到代码,只需要呈现的HTML。在php标签之间,唯一影响用户可以看到的是什么,如果他们要点击“查看源”,这些东西会被回显或打印出来或者其他什么。

尝试在这里查看PHP,我敢说你! http://lirr42.mta.info/schedules.php(这只是一个随机的例子,与其他任何事物相比都没有特别之处)

您需要担心的是安全性是输入和SQL注入。看来您的参数化处理了这个问题。我想象一下表单中的用户名或用户ID,你需要确保一些混蛋不输入像blah' OR 1=1这样的用户名并作弊。您准备好的语句和参数绑定应该处理它。如果您不确定可以使用mysql_real_escape

进行消毒