我一直在做的mysql_connect
的简单连接,mysql_pconnect
:更换mysql_ *与PDO和准备语句的功能
$db = mysql_pconnect('*host*', '*user*', '*pass*');
if (!$db) {
echo("<strong>Error:</strong> Could not connect to the database!");
exit;
}
mysql_select_db('*database*');
在使用这个,我一直用简单的方法来逃避作出之前的任何数据查询,不管是INSERT
,SELECT
,UPDATE
或DELETE
使用mysql_real_escape_string
$name = $_POST['name'];
$name = mysql_real_escape_string($name);
$sql = mysql_query("SELECT * FROM `users` WHERE (`name` = '$name')") or die(mysql_error());
现在我明白了,这是安全的,在一定程度上!
它逃脱危险字符;然而,它仍然容易受到其他可能包含安全字符的攻击,但可能会对显示数据或在某些情况下恶意修改或删除数据有害。
因此,我搜索了一下,发现了PDO,MySQLi和准备好的语句。是的,我可能会迟到,但我已经阅读了许多教程(tizag,W3C,博客,谷歌搜索),并没有一个提到过这些。这似乎很奇怪,为什么只是逃避用户输入实际上是不安全的,并不是最好的说法。是的,我知道你可以使用正则表达式来解决这个问题,但是我相信这还不够?
据我的理解,当用户输入变量时,使用PDO /准备语句是一种更安全的方式来存储和检索数据库中的数据。唯一的问题是,切换(特别是在被困在我以前的编码方式/习惯之后)有点困难。
现在我明白,使用PDO连接到我的数据库,我会用
$hostname = '*host*';
$username = '*user*';
$password = '*pass*';
$database = '*database*'
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
if ($dbh) {
echo 'Connected to database';
} else {
echo 'Could not connect to database';
}
现在,函数名是不同的,因此不再将我mysql_query
,mysql_fetch_array
,mysql_num_rows
等工作。所以我不得不阅读/记住一大堆新的,但这是我感到困惑的地方。
如果我想从注册/注册表单中插入数据,我该如何去做这件事,但主要是我会如何安全地进行操作?我认为这是准备好的声明进来的地方,但通过使用它们,这消除了使用诸如mysql_real_escape_string
之类的东西的需要吗?我知道mysql_real_escape_string
要求你通过mysql_connect
/mysql_pconnect
连接到数据库,所以现在我们不使用这个函数会不会产生错误?
我也见过不同的方法来处理PDO方法,例如,我已经看到:variable
和?
作为我认为被称为占位符的对象(抱歉,如果这是错误的)。
但我认为这是大致的应该做什么从数据库中提取用户
$user_id = $_GET['id']; // For example from a URL query string
$stmt = $dbh->prepare("SELECT * FROM `users` WHERE `id` = :user_id");
$stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT);
的想法,但然后我卡上有两件事情,如果变量是不是数字并且是一串文本,如果我没有弄错,你必须在PDO:PARAM_STR
之后给出长度。但是,如果您不确定用户输入的数据给出的价值,您如何给定一定的长度,每次都会有所不同?无论哪种方式,据我所知,然后显示您的数据
$stmt->execute();
$result = $stmt->fetchAll();
// Either
foreach($result as $row) {
echo $row['user_id'].'<br />';
echo $row['user_name'].'<br />';
echo $row['user_email'];
}
// Or
foreach($result as $row) {
$user_id = $row['user_id'];
$user_name = $row['user_name'];
$user_email = $row['user_email'];
}
echo("".$user_id."<br />".$user_name."<br />".$user_email."");
现在,这一切都安全吗?
如果我是正确的,将插入数据是,例如相同的:
$username = $_POST['username'];
$email = $_POST['email'];
$stmt = $dbh->prepare("INSERT INTO `users` (username, email)
VALUES (:username, :email)");
$stmt->bindParam(':username, $username, PDO::PARAM_STR, ?_LENGTH_?);
$stmt->bindParam(':email, $email, PDO::PARAM_STR, ?_LENGTH_?);
$stmt->execute();
请问
的工作,并且是安全的吗?如果这是正确的,我会为?_LENGTH_?
输入什么值?我完全错了吗?
UPDATE
我已经到目前为止一直非常有帮助的答复,不知道怎么感谢你们够了!每个人都有一个+1来打开我的眼睛有点不同。选择最好的答案很困难,但我认为Col Shrapnel值得拥有,因为所有内容都被覆盖了,甚至进入其他具有我不知道的自定义库的数组!
但由于大家:)
也许“用户名”和“电子邮件”字段的长度?例如。如果用户名是varchar(32),那么长度参数应该是32. – deejayy