Php 针对SQL注入的安全性-PDO、mysqli
可能重复:Php 针对SQL注入的安全性-PDO、mysqli,php,mysql,sql,pdo,sql-injection,Php,Mysql,Sql,Pdo,Sql Injection,可能重复: 我刚刚发现我的网站是不可攻击的 因为它连接到数据库,并且具有诸如:注册、更改密码、通知等功能。。。而且它是完全脆弱的 为了使代码变得安全,我应该在代码中寻找什么 我的意思是,我做了一些研究,到处都有人谈论安全问题 “使用PDO。” “使用mysql\u real\u escape\u字符串。” “使用添加斜杠。” 我到底应该寻找什么?? "$_POST" and "$_GET" variables?? "$_SESSION" variables? $sql = "select *
我刚刚发现我的网站是不可攻击的 因为它连接到数据库,并且具有诸如:注册、更改密码、通知等功能。。。而且它是完全脆弱的 为了使代码变得安全,我应该在代码中寻找什么 我的意思是,我做了一些研究,到处都有人谈论安全问题 “使用PDO。” “使用mysql\u real\u escape\u字符串。” “使用添加斜杠。” 我到底应该寻找什么??
"$_POST" and "$_GET" variables??
"$_SESSION" variables?
$sql = "select * from user";
$sql = "update user set user="new_user_name";
$sql = "insert into user (user) values ('userid')";
SQL查询?
"$_POST" and "$_GET" variables??
"$_SESSION" variables?
$sql = "select * from user";
$sql = "update user set user="new_user_name";
$sql = "insert into user (user) values ('userid')";
在每种情况下我应该怎么做?
请帮我知道我必须去哪里,去什么地方
谢谢。您应该查找的内容:从客户端/用户发送的任何数据。清理/转义此数据
可以清理查询(使用)并支持多个SQL系统
对于MySQL,使用。是在使用MySQL时用于清理数据的函数。以下是创建安全php应用程序时需要考虑的要点
希望这有帮助您提供的SQL查询实际上都不易受SQL注入的攻击 SQL注入漏洞的发生是因为SQL输入未正确转义 例如:
$sql = "select * from users where user_id =" . $_GET['user_id'];
考虑我是否通过了以下考试:
http://some_server.com/some_page.php?user_id=123%20or%201=1
执行时的查询将最终为:
select * from users where user_id = 123 or 1=1
要解决此问题,请使用参数化查询:
$query = "select * from users where user_id = ?"
将用户id值绑定到查询时,数据访问层将正确转义输入字符串,并执行以下操作:
select * from users where user_id = '123 or 1=1' which would not return any rows, preventing the injection
如果使用PHP和mysql扩展:
$sql = "select * from users where user_id = '" . mysql_real_escape_string($_GET['user_id']) . "'";
请记住,您需要转义进入SQL查询的所有输入:
$sql = "select id_column from some_table where id = 1";
$stmt = mysqli_query($conn, $sql);
if($stmt === false) die(mysqli_error($conn) . "\n");
while($row = mysqli_fetch_assoc($conn, $stmt) {
$sql = "update some_other_table set some_value = 'new value' where some_column = '" . mysqli_real_escape_string($conn, $row['id_column']) . "'";
....
}
这是因为从数据库中选择的值可能包含在SQL语句中执行不安全的字符,如名称“O'Hara”或示例。
}我一直在使用
在您的案例中,有一个例子:
<?php
$stmt = $dbh->prepare("insert into user (user) values (?)");
$stmt->bindParam(1, $name);
$name = 'ValueHere';
$stmt->execute();
?>
在保护自己之前,您需要知道原因。尝试(愚蠢的名字,严肃的话题)-1,建议PDO以某种方式自动清理查询。。。我应该说“PDO可以清理数据库查询”。编辑了我的答案。谢谢你提到@Vatev!您的意思是“PDO自动转义参数字符串(但仅转义参数,如果将它们连接到查询字符串中则不会转义)”#2不应为“不信任任何输入”,句号为。完全可以在没有任何“用户”数据的情况下注入自己。@MarcB,你就在那里,伙计:)你为什么不提到mysqli\u real\u escape\u string
或提供任何东西的链接?@ShaquinTrifonoff,我认为第二点解释了这一点。当然mysqli\u real\u escape\u string
将是“适当的过滤措施”。:-)为了简单起见,我使用了mysql()扩展。同样适用于PDO或mysqli扩展。如果使用PDO,那么请确保您使用的是准备好的语句。MySQLi可以使用预先准备好的语句或MySQLi::real\u escape\u string。在您的示例中,为什么不使用MySQLi
?从搜索中找到这个的人可能会复制并粘贴代码。我喜欢mysql扩展。我所有的代码仍然使用它,所以我自然地使用它。在PHP mysql的最新版本中,mysqli和PDO都使用mysqlnd驱动程序,因此实际上不同的扩展之间没有区别。不鼓励使用mysqli.*
函数。见和。请使用MySQLi。如果要使用mysqli,请使用mysqli。仅仅因为mysql扩展是“不推荐的”(即不推荐的),并不意味着它不能作为一个简单的例子工作。如果您想更改扩展名,请随意编辑我的答案。