防止SQL注入 - PDO,mysqli

时间:2012-08-07 05:00:54

标签: php mysql sql pdo sql-injection

  

可能重复:
  Best way to prevent SQL Injection in PHP

我刚发现我的网站很有用。

由于它连接到数据库并具有以下功能:注册,更改密码,通知等......并且使其完全易受攻击。

为了开始安全起见,我应该在代码中查找什么?

我的意思是,我做了一些研究,无处不在,每个人都说不同的安全问题。

  

“使用PDO。”

     

“使用mysql_real_escape_string。”

     

“使用addslashes。”

我到底应该寻找什么?

"$_POST" and "$_GET" variables??
"$_SESSION" variables?

SQL查询?

$sql = "select * from user";
$sql = "update user set user="new_user_name";
$sql = "insert into user (user) values ('userid')";

每种情况下我该怎么办? 请帮助我知道我必须去哪里和哪里。

谢谢。

4 个答案:

答案 0 :(得分:5)

以下是制作安全php应用程序时要考虑的要点。

  1. 使用PDO或mysqli
  2. 永远不要相信任何输入。考虑每个变量,即$ _POST,$ _GET,$ _COOKIE,$ _SESSION,$ _SERVER,就像它们被污染一样。对这些变量使用适当的过滤措施。
  3. 为了避免XSS攻击,使用php的内置函数htmlentities, strip_tags等,同时将用户输入数据插入到 数据库。
  4. 在PHP.INI中禁用注册全局
  5. 在PHP.INI中禁用“allow_url_fopen”
  6. 不允许用户输入超出要求的数据。验证输入 允许最大字符数。同时验证每个字段 相关数据类型。
  7. 在开发期后禁用错误报告。它可能会给 有关数据库的信息对黑客有用。
  8. 发布表单时使用一次性令牌。如果令牌存在且匹配 表格帖子有效,否则无效。
  9. 使用参数化数据库查询
  10. 使用存储过程
  11. 您可以谷歌搜索每个点以获取更多详细信息。 HOpe这有帮助

答案 1 :(得分:1)

您应该寻找的内容:从客户端/用户发送的任何数据。清理/逃避此数据。

PDO可以清理查询(使用PDO::prepare)并支持多个SQL系统。

对于MySQL,请使用MySQLimysqli_real_escape_string是在使用MySQL时用于清理数据的函数。

答案 2 :(得分:1)

您提供的所有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 = ?"

将user_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”或示例。     }

答案 3 :(得分:0)

我一直在使用 PDO

在你的情况下的一个例子:

<?php
   $stmt = $dbh->prepare("insert into user (user) values (?)");
   $stmt->bindParam(1, $name);
   $name = 'ValueHere';
   $stmt->execute();
?>