PHP从mysql_real_escape_字符串更改为PDO准备的语句
我目前使用PHP从mysql_real_escape_字符串更改为PDO准备的语句,php,mysql,Php,Mysql,我目前使用mysql\u real\u escape\u string在查询数据库时对变量进行转义,以防止SQL注入。比如说, $keyword = mysql_real_escape_string($keyword); $guideline = mysql_real_escape_string($guideline); mysql_query("INSERT INTO table1 VALUES('$keyword','$guideline')");
mysql\u real\u escape\u string
在查询数据库时对变量进行转义,以防止SQL注入。比如说,
$keyword = mysql_real_escape_string($keyword);
$guideline = mysql_real_escape_string($guideline);
mysql_query("INSERT INTO table1 VALUES('$keyword','$guideline')");
$get = mysql_query("SELECT * FROM table2 WHERE keyword='$keyword'");
while($row = mysql_fetch_assoc($get)) {
//code
}
在阅读了有关SQL注入预防的内容后,我已经了解到这还不足以停止SQL注入(现在有这么多代码需要检查和更正),我应该使用PDO准备的语句?我可以举一个例子,说明如何使用上面相同的$variables执行PDO准备的语句吗?其实非常简单:
$db = new PDO($dsn, $user, $password);
$stmt = $db->prepare('INSERT INTO table1 VALUES(?,?)');
$stmt->execute(array($keyword, $guideline));
$stmt->close();
$stmt2 = $db->prepare('SELECT * FROM table2 WHERE keyword= ?');
$stmt->execute(array($keyword));
while(false !== ($row = $stmt->fetch())) {
// do stuff
}
请注意,您还可以使用命名占位符,这有助于使代码更具可读性,但更为详细:
$stmt2 = $db->prepare('SELECT * FROM table2 WHERE keyword= :keyword');
$stmt2->execute(array(':keyword' => $keyword));
其实很简单:
$db = new PDO($dsn, $user, $password);
$stmt = $db->prepare('INSERT INTO table1 VALUES(?,?)');
$stmt->execute(array($keyword, $guideline));
$stmt->close();
$stmt2 = $db->prepare('SELECT * FROM table2 WHERE keyword= ?');
$stmt->execute(array($keyword));
while(false !== ($row = $stmt->fetch())) {
// do stuff
}
请注意,您还可以使用命名占位符,这有助于使代码更具可读性,但更为详细:
$stmt2 = $db->prepare('SELECT * FROM table2 WHERE keyword= :keyword');
$stmt2->execute(array(':keyword' => $keyword));
首先,必须创建一个PDO对象:
$dbh = new PDO("mysql:dbname=$dbname", $username, $password);
然后有不同的方法将参数与查询关联:
execute()
的参数:
?
:
$qry = $dbh->prepare("SELECT * FROM table2 WHERE keyword = :kw");
$qry->bindValue(":kw", $keyword);
首先,必须创建一个PDO对象:
$dbh = new PDO("mysql:dbname=$dbname", $username, $password);
然后有不同的方法将参数与查询关联:
execute()
的参数:
?
:
$qry = $dbh->prepare("SELECT * FROM table2 WHERE keyword = :kw");
$qry->bindValue(":kw", $keyword);
这个更有意义
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>
这一条更有意义
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>
以下是我所做的,我并不自称是忍者,但已经做了一段时间了
//connection
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
//get Post data
$name = filter_input(INPUT_POST, $name, FILTER_SANITIZE_STRING);
//SQL
$SQL = $conn->prepare('SELECT * FROM users WHERE user_name=:name;');
$SQL->execute(array(':name' => $name));
//While Loop
while($names = $SQL->fetch(PDO::FETCH_OBJ){
echo $names->user_email
}
这就是我所做的,不是自称是忍者,而是已经做了一段时间了
//connection
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
//get Post data
$name = filter_input(INPUT_POST, $name, FILTER_SANITIZE_STRING);
//SQL
$SQL = $conn->prepare('SELECT * FROM users WHERE user_name=:name;');
$SQL->execute(array(':name' => $name));
//While Loop
while($names = $SQL->fetch(PDO::FETCH_OBJ){
echo $names->user_email
}
@杰伦:不,不是。它易受字符集相关注入的影响。然而,攻击者要做到这一点有些困难,但声称自己不受攻击仍然是错误的。谢谢,这么多相互矛盾的观点。我不使用任何变量来更改表名,我只使用它们来更改值,mysql_real_escape_string在那种情况下就足够了?我只会复制现有的答案,所以我强烈建议阅读这篇文章/教程@eis不记得了,我总是在连接后设置字符集(在PDO中和在mysql_*中之前)…@eis:那么PDO/准备的报表在100%的时间里都是这样吗?PDO/prepared语句到底是如何阻止SQL注入的?@jeroen:不,不是。它易受字符集相关注入的影响。然而,攻击者要做到这一点有些困难,但声称自己不受攻击仍然是错误的。谢谢,这么多相互矛盾的观点。我不使用任何变量来更改表名,我只使用它们来更改值,mysql_real_escape_string在那种情况下就足够了?我只会复制现有的答案,所以我强烈建议阅读这篇文章/教程@eis不记得了,我总是在连接后设置字符集(在PDO中和在mysql_*中之前)…@eis:那么PDO/准备的报表在100%的时间里都是这样吗?PDO/prepared语句到底是如何阻止SQL注入的?这正是您为OP所要求的,所以感谢prodigitalson,但是@user892134我要提醒您阅读PDO:。准备好的语句确实会清理输入,但是还有其他方法可以使用PDO,而PDO则不会,本手册将帮助您理解这些方法。不过,使用PDO是个好主意。不是一个完整的ORM,但足够的抽象层也有助于增加一些安全性。这正是您要求的OP,所以prodigitalson很荣幸,但是@user892134我要提醒您阅读PDO:。准备好的语句确实会清理输入,但是还有其他方法可以使用PDO,而PDO则不会,本手册将帮助您理解这些方法。不过,使用PDO是个好主意。不是一个成熟的ORM,但足够的抽象层也有助于增加一些安全性。因此,第二个示例适用于静态变量,第三个示例适用于动态变量?@user892134:两种情况都可以使用。如果要使用不同的参数值多次执行查询,第三个示例尤其有用:然后只需更改
$keyword
并再次调用$qry->execute()
,而第二个示例则需要bindValue()
每次都是。所以第二个例子是静态变量,第三个例子是动态变量?@user892134:在任何一种情况下都可以使用。如果要使用不同的参数值多次执行查询,则第三个示例尤其有用:然后只需更改$keyword
并再次调用$qry->execute()
,而对于第二个示例,每次都需要bindValue()
。