防止SQL注入-PDO,mysqli


Secure against SQL Injection - PDO, mysqli

可能重复:
防止PHP 中SQL注入的最佳方法

我刚刚发现我的网站是脆弱的。

由于它连接到数据库,并且具有以下功能:注册、更改密码、通知等…以及SUPOSING,因此它完全易受攻击

我应该在代码中查找什么才能开始使其安全?

我的意思是,我做了一些研究,在任何地方,每个人都对安全有不同的看法。

"使用PDO。"

"使用mysql_real_sescape_string。"

"使用斜杠。"

我到底应该找什么

"$_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')";

在每种情况下我应该怎么做?请帮我知道我必须去什么地方。

谢谢。

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

  1. 使用PDO或mysqli
  2. 永远不要相信任何输入。考虑每个变量,即$_POST、$_GET、$_COOKIE、$_SESSION、$_SERVER,就好像它们被污染了一样。对这些变量使用适当的筛选措施
  3. 为了避免XSS攻击,请使用php的内置函数htmlentities,strip_tag等,同时将用户输入数据插入数据库
  4. 禁用PHP中的Register Globals。INI
  5. 在PHP中禁用"allow_url_fopen"。INI
  6. 不允许用户输入超过要求的数据。验证输入到允许最大字符数。同时验证的每个字段相关数据类型
  7. 在开发期后禁用错误报告。它可能会对黑客有用的数据库信息
  8. 张贴表单时使用一次性令牌。如果令牌存在并且匹配表单帖子有效,否则无效
  9. 使用参数化数据库查询
  10. 使用存储过程

你可以在谷歌上搜索每一点以了解更多细节。HOpe这有助于

您应该查找的内容:从客户端/用户发送的任何数据。对该数据进行消毒/转义。

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

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

您提供的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"或示例。}

我一直在使用PDO

在你的例子中:

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