1

为了保护我的项目免受攻击(例如:SQL 注入),我使用以下查询参数页面(*.php?query=value):

$id=strip_tags($id);
$id=mysql_real_escape_string($id);    
if(is_numeric($id) && strlen($id)<=3) //id are numbers maximum of 3 digits
  • 除此之外,我还使用客户端(JavaScript)和服务器端(php)验证,strip_tags()根据需要过滤数据。
  • 密码使用加密bcrypt()
  • 所有消息都使用加密mcrypt_ecb()
  • isset($_SESSION["id"])只有登录后才能访问页面。
  • error_reporting(0);隐藏错误。
  • $_POST代替$_REQUEST
  • mysql_real_escape_string();对于每个输入

实际上我的项目将被大学使用,我对安全性感到紧张,因为回溯很容易渗透,所以我努力让它安全。(我知道这是一个很大的问题,但任何形式的帮助都会非常有用)但作为一名学生,我想知道我还缺少什么来确保它的安全?

4

3 回答 3

10

首先:

避免像瘟疫一样使用 PHP 的 MySQL 函数

至少使用 PHP 的 MySQLi 函数,或者使用PDO 代替MySQLi,尤其是 PDO 函数,在安全方面更好。但是,在这两者中,PDO 是最好的选择,因为它们通过预准备语句为您提供了更高的抽象,从而大大提高了您对 SQL 注入攻击的防御

PHP 应用程序中的大多数 SQL 语句都使用变量输入来确定 SQL 语句的结果。要将用户提供的输入安全地传递给 SQL 语句,请使用参数标记 (?) 或表示变量输入的命名变量来准备语句。当您执行准备好的语句时,您将输入值绑定到参数标记。数据库引擎确保每个输入值都被视为单个参数,从而防止针对您的应用程序的 SQL 注入攻击。与通过 PDO::exec() 发出的语句相比,预准备语句提供了性能优势,因为数据库管理系统为每个预准备语句创建一个访问计划,如果随后重新发出该语句,它可以重用该计划。

此外,请避免使用一些旧的折旧 PHP 函数。

接下来,一般来说,如果您使用 PHP 或任何创建动态请求的语言,这意味着用户在某个级别上的输入,并且通常是与数据库的后续交互。Web 编程的规则 1:在任何情况下都绝不信任用户输入。完全没有。输入的所有内容都必须经过清理和验证,以避免出现安全问题。您可以使用 PHP 在本地完成此操作,但老实说,这需要大量工作和对细节的大量关注——这当然会延长您的开发时间。

如果这不是一项学术练习或处理自我训练的练习——如果可以的话,尝试使用一个框架——它可能会在以后为你省去很多麻烦,因为好的框架可以处理一些处理逃逸的开销,验证等。这意味着如果你在没有框架的情况下使用突击队并编写自己的代码:你将要实现的大部分(如果不是全部)功能都将为你完成,而且很有可能——在框架中做得更好。

另外,它们使 PHP 开发更容易,而且偶尔也有趣。当然,并非所有框架都是平等的,所有框架也都有安全问题。但是,您必须牢记这一点,并始终如一地了解情况。

如果这是一项学术练习或自学练习,请阅读以下内容:

不使用 PHP 框架的原因?

许多顶级 StackOverflow PHP 帖子和 Programmers.StackExchange 帖子可以帮助您完成您的旅程。

这里有几个开始:

(这更多是对大多数这些链接讨论的内容的概述)

阅读您所在领域的安全实践。它一直在发展。

如果您对框架感兴趣,这里有一些流行的框架可以引起您的兴趣:

但是,无论哪种方式 - 祝你好运!

于 2013-08-10T00:21:36.257 回答
3

我建议审查OWASP 的网站以获取网络安全相关信息(甚至加入OWASP)。

OWASP 部分提供与 PHP 相关的信息

于 2013-08-10T01:01:52.717 回答
2

使 PHP 应用程序安全是一个相当复杂的过程。编写应用程序时需要考虑很多事情,而 SQL 注入并不是唯一的威胁。

我建议参考以下有用的文章:

系统管理员的 25 个 PHP 安全最佳实践

如何保护您的 php 应用程序?

PHP 安全备忘单

于 2014-06-18T04:30:15.443 回答