繁体   English   中英

如何保护项目免受黑客攻击和攻击?

[英]How to secure project against hacks and attacks?

不久前我已经开始进行Web开发了。 我现在知道一些事情,但我真的很担心可能出现的安全问题。 我知道像preg_replace这样的简单安全解决方案,但我对此并不自信。

因此,我想问你任何可以在以下情况下应用的“通用”安全标准。 正如我所提到的,我不是专业人士,所以如果你能从一些简单但有用的东西开始,那将会很棒。 如果可能,请提供示例吗?

我确实看过php手册,虽然我想知道人的其他信息。

以下是我在项目中使用的一些典型的MySQL / PHP内容。 您能否提出任何改进措施以使其更安全?

$sql = mysql_query("SELECT * FROM stories WHERE showing = 1 ORDER BY cr_date DESC LIMIT 5") or die (mysql_error("There was an error in connection"));
        while($row = mysql_fetch_assoc($sql)){
            $story_id = $row["id"];
            // etc...
        }

$username = $_POST['username'];
$sql = mysql_query("INSERT INTO myMembers (username, //etc... ) 
VALUES('$username' //etc.. ")or die (mysql_error());

$username = $_GET['username']; 
//gets username from url like http://myweb.com/profile.php?username=blabla

首先,感谢您关心网络安全。 许多PHP开发人员对此一无所知,也不在乎学习。 他们是将我们的密码和银行账户暴露给黑客的人。 成为解决方案的一部分! :-)

1.将mysql扩展视为不推荐使用。

请改用PDOmysqli扩展。 普通的mysql扩展不支持预准备语句和一些其他功能,例如事务控制。 没有人应该使用mysql,如果他们有PDO_mysql或mysqli可用。

2.不要将外部数据插入SQL。

无论何时从$ _GET或$ _POST获取值,您都应该认为在任何SQL语句或shell_exec()或其他将字符串作为某种代码执行的实例中使用是不安全的。

3.使用准备好的查询参数而不是插值。

这真的很容易。 事实上,使用查询参数比将变量插入SQL字符串更容易 您不必担心转义或长复杂的字符串连接。

请参阅此处的示例代码: http//us.php.net/manual/en/pdo.prepare.php

4.对于转角情况,请使用仔细过滤。

查询参数取代SQL表达式中的一个文字值 不是表名,不是列名,不是SQL关键字,不是值列表或完整表达式。 对于那些,你需要使用字符串插值,但请参阅我的演示文稿SQL注入神话和谬误 ,以获取如何“白名单”值进行插值的示例。

另请查看PHP 过滤器扩展,它提供了一种灵活的方法来验证输入或剥离无效字符,以确保只使用输入的有效部分。


查看示例,SELECT查询没有从外部源(如$ _GET)插入的动态值。 这样一来就是安全的。

INSERT查询从请求中获取一个值,该值可能包含更改查询运行方式的恶意内容。 这个是使用查询参数的一个很好的候选者。

还要考虑SQL注入是PHP最常见的两个安全问题之一。 另一个是跨站点脚本(XSS)。 这与SQL没有直接关系,但您也应该了解它。

这是学习Web编程安全性的一个很好的资源: OWASP.org备忘单

许多框架都有一套很好的安全措施,可以很好地防止像SQL注入这样的事情。 Yii,CakePhP,CodeIgnitre都可能有用。

虽然几乎不可能击败比尔,但我觉得我必须澄清答案,说明“你必须信任没有用户输入”。

实际上,完全相反 - 只有在完全不了解数据源的情况下 ,SQL注入保护才会有用。 并将所有数据视为潜在恶意数据。 并相应地处理它。

因此,总结一下所有的建议:

准备好的陈述是一种很好的方法, 但不是一个完整的方法。
它有一个很棒的想法,即使用一些占位符 ,一个代理来表示查询中的实际值。 因此,可以适当地消毒该值。
但正如比尔所说,这些占位符仅限于字符串和数字。 因此,添加自己的另一个占位符(对于标识符)是个好主意。 但您仍需要手动注意SQL语法关键字。

因此,而不是“不要将外部数据插入SQL”。 声明一必须使用

“2.不要直接将值插入到查询中,只能通过某些代理插入,执行必要的预防措施”

要记住的最重要的事情是永远不要相信外部来源 (例如用户输入,来自其他Web服务的响应等)。 始终清理所有输入,并尽可能使用数据库提供程序中的代码执行此操作。

在MySQL参数化的情况下,所有查询都是必不可少的,因此请使用预准备语句,例如

$statement = $db->prepare('SELECT * FROM stories WHERE title = :title');
$statement->execute(array(':title' => $title));
$rows = $statement->fetchAll();

您当前的insert语句容易受到SQL注入攻击 ,将其修改为更接近:

$username = $_POST['username'];
$statement = $db.prepare("INSERT INTO myMembers (username) VALUES(':username');
$statement->execute(array(':username' => $username));

您还应该确保永远不会以纯文本形式存储任何密码,始终存储密码的散列版本(以及盐)并检查散列是否匹配而不是实际的字符串。 这意味着如果您的数据库受到损害,找出您的用户凭据将成为一项非常重要的任务。

这些只是让您的应用程序更安全的两种方法,我强烈建议您阅读OWASP十大网站漏洞并单独研究这些漏洞 ,因为每个漏洞本身都是一个很大的话题!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM