Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何保护项目免受黑客和攻击?_Php_Mysql_Security_Sql Injection - Fatal编程技术网

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

Php 如何保护项目免受黑客和攻击?,php,mysql,security,sql-injection,Php,Mysql,Security,Sql Injection,不久前我开始从事web开发。我现在知道一些事情,但我真的很担心可能出现的安全问题。我知道一些简单的安全解决方案,比如preg_replace,但我对此没有信心 因此,我想请你们提供任何一种可以应用于以下情况的“通用”安全标准。正如我提到的,我不是职业选手,所以如果你能从简单但有用的东西开始,那就太好了。如果可能的话,你能提供一些例子吗 我确实看过php手册,尽管我想从person那里了解更多信息 下面是我在项目中使用的一些典型的MySQL/PHP东西。你能提出一些改进建议让它们更安全吗 $sql

不久前我开始从事web开发。我现在知道一些事情,但我真的很担心可能出现的安全问题。我知道一些简单的安全解决方案,比如preg_replace,但我对此没有信心

因此,我想请你们提供任何一种可以应用于以下情况的“通用”安全标准。正如我提到的,我不是职业选手,所以如果你能从简单但有用的东西开始,那就太好了。如果可能的话,你能提供一些例子吗

我确实看过php手册,尽管我想从person那里了解更多信息

下面是我在项目中使用的一些典型的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...
        }



要记住的最重要的一点是,永远不要相信来自外部来源的任何东西(例如用户输入、来自其他web服务的响应等)。始终清理所有输入,并在可能的情况下使用数据库提供程序中的代码进行清理

在MySQL的情况下,所有查询的参数化都是必不可少的,所以使用一个准备好的语句,例如

$statement = $db->prepare('SELECT * FROM stories WHERE title = :title');
$statement->execute(array(':title' => $title));
$rows = $statement->fetchAll();
当前insert语句易受攻击,请将其修改为更接近:

$username = $_POST['username'];
$statement = $db.prepare("INSERT INTO myMembers (username) VALUES(':username');
$statement->execute(array(':username' => $username));
您还应该确保从不以纯文本形式存储任何密码,始终存储密码的版本(以及salt),并检查哈希匹配而不是实际字符串。这意味着,如果您的数据库遭到破坏,确定用户的凭据将成为一项非常重要的任务


这些只是让你的应用程序更安全的几种方法,我强烈建议你单独阅读和研究这些方法,因为每一种方法本身都是一个很大的话题

许多框架已经有了一套很好的安全措施,这将在防止SQL注入之类的事情方面起到很大作用。Yei,CakePhP,CodeIgnitre所有这些都可能有一些用处。

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

1。将mysql扩展视为已弃用。

请改用或扩展名。纯mysql扩展不支持预处理语句和一些其他功能,例如事务控制。如果有PDO_mysql或mysqli可用,任何人都不应该使用mysql

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

每当你从$GET或$POST中获取一个值时,你应该认为它在任何SQL语句或SHILLIXEXECUTE()中都是不安全的,或者是将字符串作为某种代码执行的其他实例。 3。使用准备好的查询参数而不是插值。

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

请参见此处的示例代码:

4。对于拐角处的情况,请仔细过滤。

查询参数在SQL表达式中代替一个文本值。不是表名,不是列名,不是SQL关键字,不是值列表或完整表达式。对于这些,您确实需要使用字符串插值,但有关如何“白名单”值进行插值的示例,请参见我的演示

还可以查看PHP扩展,它提供了一种灵活的方法来验证输入或去除无效字符,以确保只使用输入的有效部分


看看您的示例,SELECT查询没有从外部源(如$\u GET)插值的动态值。所以那个是安全的

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

还认为SQL注入是PHP中最普遍的两个安全问题之一。另一种是跨站点脚本(XSS)。这与SQL没有直接关系,但您也应该了解它


这里有一个很好的资源来学习更多关于web编程安全性的知识:。

尽管几乎不可能打败Bill,但我觉得我必须澄清“你必须不相信任何用户输入”的答案

事实上,恰恰相反,SQL注入保护只有在它完全不知道数据源的情况下才会起作用。并且将所有数据视为潜在的恶意数据。并据此进行处理

因此,总结所有建议:

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

所以,不要使用“不要将外部数据插入SQL”语句


“2.不要直接在查询中插入值,而只能通过某个代理,执行必要的预防措施”需要始终牢记的一点是,用户提供的所有数据都是潜在的恶意数据。简单地说:在使用它之前,请始终清理用户的输入。请记住,这个问题的答案大多只考虑了sql注入攻击的漏洞类别,因为您的示例是一个mysql调用。要了解其他安全问题,您可能需要从OWASP十大项目或Bill Karwinwow建议的备忘单开始,这让我感到非常震惊;我以前都不知道这件事。是像你写的那样使用,还是我必须有一些像函数这样的语句来清理
$statement = $db->prepare('SELECT * FROM stories WHERE title = :title');
$statement->execute(array(':title' => $title));
$rows = $statement->fetchAll();
$username = $_POST['username'];
$statement = $db.prepare("INSERT INTO myMembers (username) VALUES(':username');
$statement->execute(array(':username' => $username));