2

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

我刚刚发现我的网站是 vunerable。

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

为了开始使其安全,我应该在代码中寻找什么?

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

“使用 PDO。”

“使用 mysql_real_escape_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')";

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

谢谢你。

4

4 回答 4

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. 使用存储过程

您可以搜索每个点以获取更多详细信息。希望这可以帮助

于 2012-08-07T05:08:01.470 回答
1

您应该查找的内容:从客户端/用户发送的任何数据。清理/转义这些数据。

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

对于 MySQL,请使用MySQLimysqli_real_escape_string如果您使用 MySQL,则用于清理数据的功能。

于 2012-08-07T05:06:40.720 回答
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”或示例。}

于 2012-08-07T05:10:16.557 回答
0

我一直在使用PDO

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

<?php
   $stmt = $dbh->prepare("insert into user (user) values (?)");
   $stmt->bindParam(1, $name);
   $name = 'ValueHere';
   $stmt->execute();
?>
于 2012-08-07T05:25:02.897 回答