保护我的项目免受攻击(例如: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
strip_tags()
根据需要过滤数据。bcrypt()
mcrypt_ecb()
isset($_SESSION["id"])
即登录时才能访问页面。error_reporting(0);
隐藏错误。$_POST
代替$_REQUEST
mysql_real_escape_string();
实际上我的项目将被大学使用,并且我会对安全性感到紧张,因为回溯使其易于渗透,因此我努力使其安全。 (我知道这是一个很大的问题,但任何一种帮助都会非常有用)但作为一名学生,我想知道我还缺少什么才能使它安全?
答案 0 :(得分:10)
首先:
<强> Avoid PHP's MySQL functions like a plague 强>
使用PHP的MySQLi函数代替非常,非常小或 PDO instead 。 MySQLi and especially PDO functions, are better security-wise.但是,在这两者中,PDO是最好的交易,因为它们通过预备语句为您提供更高的抽象,这大大增加了defense against SQL injection attacks:
PHP应用程序中的大多数SQL语句都使用变量输入 确定SQL语句的结果。传递用户提供的 安全地输入SQL语句,使用参数准备语句 标记(?)或表示变量输入的命名变量。什么时候 你执行准备好的语句,你将输入值绑定到 参数标记。数据库引擎确保每个输入值 被视为单个参数,防止SQL注入攻击 反对你的申请。与通过发布的声明相比 PDO :: exec(),预处理语句提供了性能优势,因为 数据库管理系统为每个人创建一个访问计划 准备好的声明,如果重新发布声明,它可以重复使用 随后
另外,请避免使用一些较旧的折旧PHP函数。
接下来,通常,如果您使用的是PHP或任何创建动态请求的语言,那么这意味着用户在某个级别上输入,并且通常是与数据库的后续交互。 网络编程的规则1:永远不会在任何情况下信任用户输入。完全。输入的所有内容都必须经过清理和验证,以避免出现安全问题。您可以使用PHP本机执行此操作,但老实说,它需要大量工作并且需要对细节进行大量关注 - 这当然会扩展您的开发时间。
如果这不是一个学术练习或者是一个处理自我训练的练习 - try to use a framework if you can - 它可能会为你节省很多麻烦,因为好的框架可以take care of some of the overhead处理逃避,验证等等。这意味着如果你去突击队并编写你自己的代码而没有框架:大多数,如果不是你将要实现的所有功能都将为你完成,并且很有可能 - 在框架中做得更好。
另外,它们使PHP开发更容易,偶尔,有趣。当然,并非所有框架都是平等的,所有框架也都存在安全问题。但是,这是你必须记住的事情,并且在任何时候都要保持自己的信息。
如果这是学术练习或自学习练习,请阅读:
Reasons to NOT use a PHP Framework?
许多顶级StackOverflow PHP帖子和Programmers.StackExchange帖子可以帮助您完成旅程。
以下是一些开头的内容:
(这是对大多数链接讨论内容的概述)
阅读您所在领域的安全措施。它一直在发展。
如果您对框架感兴趣,可以参考以下几个受欢迎的框架:
但是,无论哪种方式 - 祝你好运!
答案 1 :(得分:3)
答案 2 :(得分:2)
使PHP应用程序安全是一个非常复杂的过程。在编写应用程序时,需要考虑很多事情,而SQL注入并不是唯一的威胁。
我建议参考以下有用的文章:
25 PHP Security Best Practices For Sys Admins