Heim  >  Artikel  >  PHP-Framework  >  Sicherheitsüberlegungen für ThinkPHP

Sicherheitsüberlegungen für ThinkPHP

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼nach vorne
2019-12-16 17:33:423957Durchsuche

Sicherheitsüberlegungen für ThinkPHP

In diesem Artikel werden hauptsächlich die Sicherheitsvorkehrungen von ThinkPHP besprochen, die als empfohlene Sicherheitsstandardpraxis von ThinkPHP verwendet werden können.

Erstens gibt es keine absolute Sicherheit. Solange Sie über genügend Sicherheitsbewusstsein verfügen, können Sie Sicherheitsrisiken so weit wie möglich ausschließen. Durch die standardmäßige Verwendung des Frameworks können Sie einige scheinbar naive Sicherheitsprobleme vermeiden. Die in diesem Artikel beschriebenen Sicherheitsvorkehrungen beziehen sich hauptsächlich auf die Sicherheitsstrategie in der Produktionsumgebung. Bei der lokalen Entwicklung steht die Sicherheit manchmal nicht im Vordergrund.

Unter Berücksichtigung der Entwicklungserfahrung legt ThinkPHP immer noch großen Wert auf die zugrunde liegende Sicherheit des Frameworks. Obwohl häufig Sicherheitslücken gemeldet werden, werden die Beamten diese und die meisten Schwachstellen so schnell wie möglich beheben Dies kann nur vermieden werden, wenn die Benutzer über ein gewisses Maß an Sicherheitsbewusstsein verfügen. In diesem Jahr haben wir auch Kooperationsbeziehungen mit mehreren inländischen Sicherheitsteams aufgebaut, die dabei helfen, mögliche Schwachstellen oder versteckte Gefahren im Voraus zu erkennen und umgehend zu beheben im Rahmen ausgenutzt werden.

Standardisierte Bereitstellung

Viele Entwickler schenken diesem Problem keine besondere Aufmerksamkeit Im Ernst, die eingesetzte Sicherheitsrichtlinie ist ein grundlegendes Sicherheitsproblem.

Viele Entwickler führen die Bereitstellung häufig nicht gemäß den offiziellen Bereitstellungsspezifikationen durch. Bitte stellen Sie sicher, dass Ihr WEB-Stammverzeichnis auf das öffentliche Verzeichnis und nicht auf das Anwendungsstammverzeichnis verweist, und ändern Sie den Speicherort der Eintragsdatei nicht nach Belieben . Platzieren Sie keine anderen Anwendungsdateien außer Eintragsdateien und Ressourcendateien im öffentlichen Verzeichnis.

Deaktivieren Sie den Debugging-Modus

Stellen Sie bei der Bereitstellung in einer Produktionsumgebung sicher, dass Sie den Debugging-Modus deaktiviert haben, indem Sie Umgebungsvariablen ändern.

APP_DEBUG=false

Unabhängig davon, ob es sich um die Bereitstellung in einer lokalen Entwicklungs- oder Produktionsumgebung handelt, wird nicht empfohlen, den Debugging-Modus direkt durch Ändern der Konfigurationsdatei zu aktivieren/deaktivieren. Stattdessen sollten Sie Umgebungsvariablen verwenden (die lokale Entwicklung kann definiert werden). .env-Dateien).

Nach dem Ausschalten des Debugging-Modus stützen sich der Gesundheitszustand und die Betriebsüberwachung des Systems hauptsächlich auf Protokolle oder den von Ihnen verwendeten Überwachungsdienst. Daher müssen Sie sich angewöhnen, die Protokolle und den Ausführungsstatus regelmäßig zu überprüfen.

Variablenfilterung anfordern

Vertrauen Sie niemals Benutzereingaben, das ist ein weiser Spruch. Durch größtmögliches Filtern von Anforderungsvariablen können die meisten Schwachstellen und versteckten Gefahren wirksam verhindert werden.

Die vom Framework empfohlene Methode zum Abrufen von Anforderungsvariablen ist die param-Methode der Request-Klasse (verwenden Sie nicht die Methode get oder post, um sie abzurufen, es sei denn, dies ist erforderlich, geschweige denn die nativen Methoden $_GET/$_POST und andere Methoden, um es zu erhalten).

public function index(Request $request)
{
    $name = $request->param('name');
    // 在这里可以根据你的业务需求进行更严谨的过滤
    // 例如 $name = $request->param('name','','htmlentities,strtolower');
    // 或者使用验证器进行专门的验证
}

Für Anforderungsvariablen mit eindeutigen Typen können Sie Typumwandlung verwenden, wenn Sie die param-Methode verwenden, zum Beispiel:

public function index(Request $request)
{
    // 强制转换字符串数据
    $name = $request->param('name/s');
    // 强制转换整型数据
    $name = $request->param('id/d');
    // 强制转换浮点型数据
    $name = $request->param('score/f');
}

oder direkt Methodenparameter verwenden, um die Anforderungsvariable

public function index(string $name)
{
    // 在这里可以根据你的业务需求进行更严谨的过滤
    // 或者使用验证器进行专门的验证
}
Wenn Sie alle Daten verarbeiten müssen, können Sie eine globale Filtermethode festlegen. Legen Sie Standardfilter-Filterregeln für verschiedene Anwendungsanforderungen fest (standardmäßig keine Filterregeln). Zu den allgemeinen Sicherheitsfilterfunktionen gehören Stripslashes, HTMLentities, HTMLSpecialchars, Strip_Tags usw. Wählen Sie bitte die am besten geeignete Filtermethode entsprechend dem Geschäftsszenario.

Wenn Sie mehrere Daten abrufen müssen, wird empfohlen, die einzige Methode zur Angabe des abzurufenden Variablennamens zu verwenden, um Berechtigungsprobleme zu vermeiden, die durch die Übermittlung böswilliger Daten verursacht werden.

public function index(Request $request)
{
    // 指定表单数据名称
    $data = $request->only(['name','title']);
}

Wenn Sie Datenbank- oder Modelloperationen zum Schreiben von Daten verwenden, können Sie auch Felder angeben, um zu verhindern, dass illegale und unerwünschte Felder in die Datenbank geschrieben werden.

// 模型
User::allowField(['name','title'])
    ->save($data);
// 数据库
Db::name('user')
    ->field(['name','title'])
    ->insert($data);

Das Modell verfügt außerdem über eine schreibgeschützte Feldfunktion, um zu verhindern, dass Ihre Daten von außen verändert werden.

Upload-Erkennung

Die Upload-Funktion der Website ist auch ein sehr einfacher Einstiegspunkt für Angriffe, daher ist die Sicherheitsüberprüfung der Upload-Funktion besonders wichtig.

Die thinkFile-Klasse des Systems bietet Sicherheitsunterstützung für Datei-Uploads, einschließlich Legalitätsprüfungen für Dateisuffixe, Dateitypen, Dateigrößen und hochgeladene Bilddateien. Stellen Sie sicher, dass Sie diese Legalitätsprüfungen während des Upload-Vorgangs aktiviert haben Weitere Informationen finden Sie im Upload-Kapitel des Handbuchs.

SQL-Injection

Die Abfrage von ThinkPHP nutzt einheitlich den Vorbereitungs-Vorabfrage- und Parameterbindungsmechanismus von PDO, wodurch das Auftreten einer SQL-Injection effektiv vermieden werden kann. Das bedeutet jedoch nicht, dass es absolut sicher ist, wenn Ihnen gute Codierungsstandards fehlen, können Sie dennoch ausgebeutet werden.

Eines der einfachsten Prinzipien besteht darin, Benutzern nicht die Entscheidung über Ihre Abfragebedingungen (oder Feldsortierung) und die Kontrolle über Ihre Abfragedaten zu überlassen.

Für einige String-Abfragebedingungen (einschließlich nativer Abfragen) oder spezielle Abfragen (einschließlich des ORDER-Teils) ist eine manuelle Parameterbindung erforderlich.

// 错误的
Db::query("select * from think_user where id=$id AND status=$statis");
// 正确的
Db::query("select * from think_user where id=? AND status=?", [ $id, $status]);
// 正确的
Db::execute("update think_user set name=:name where status=:status", [
    'name'     => 'thinkphp', 
    'status'   => 1
]);

Für Abfragen mit den Methoden whereExp und whereRaw müssen Sie auch die Parameterbindung verwenden.

Db::name('user')
    ->whereRaw('id > ? AND status = ?',[10, 1])
    ->select();

Validator verwenden

Für Situationen, in denen eine große Anzahl von Formularen überprüft werden muss, wird empfohlen, die Validatorfunktion zu verwenden, um die Datenkonformität einheitlich zu überprüfen. Der Validierungsvorgang des Validators sollte mit der Validierungsmethode in der Controller- oder Routing-Phase durchgeführt werden. Die Datenvalidierungsfunktion des Modells wurde in der neuen Version abgebrochen und wird nicht mehr empfohlen Modell und Datenbank.

XSS-Angriff

跨站脚本攻击(cross-site scripting,简称 XSS),XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

在渲染输出的页面中,要对一些数据进行安全处理,防止被恶意利用造成XSS攻击,如果是5.1版本的话,所有的输出都已经经过了htmlentities 转义输出,确保安全。如果是5.0版本的话,你可以自定义一个xss过滤函数,在模板文件中对一些关键内容变量进行函数处理。

CSRF

CSRF 跨站请求伪造是 Web 应用中最常见的安全威胁之一,攻击者伪造目标用户的HTTP请求,然后此请求发送到有CSRF漏洞的网站,网站执行此请求后,引发跨站请求伪造攻击。攻击者利用隐蔽的HTTP连接,让目标用户在不注意的情况下单击这个链接,由于是用户自己点击的,而他又是合法用户拥有合法权限,所以目标用户能够在网站内执行特定的HTTP链接,从而达到攻击者的目的。

开启表单令牌验证,尽量开启强制路由并严格规范每个URL请求,定义单独的MISS路由规则。

遵循请求类型的使用规范并做好权限验证,删除操作必须使用DELETE请求,数据更改操作必须使用POST、PUT 或者 PATCH 请求方法,GET请求不应该更改任何数据。

会话劫持

会话劫持是指攻击者利用各种手段来获取目标用户的session id。一旦获取到session id,那么攻击者可以利用目标用户的身份来登录网站,获取目标用户的操作权限。

有效的防护策略包括:

在每次会话启动的时候,调用regenerate方法。

Session::start();
Session::regenerate(true);

更改session配置参数,开启安全选项:

'use_trans_sid' => 0,
'httponly' => true,
'secure' => true,

升级到安全版本

官方会对一些安全隐患和潜在漏洞进行修复,并且发布一个更为安全的版本。请确认你升级到更安全的版本,确保底层的安全和健壮性。

目前各个版本的建议版本如下:

Sicherheitsüberlegungen für ThinkPHP

业务逻辑安全

这个属于应用层面的安全,很多漏洞源于某个业务逻辑自身的安全隐患,包括没有做合理的数据验证和权限检查,尤其是涉及资金及财务层面的,一定要做更多的安全检查,并且开启事务。一个好的建议是更多的对应用进行分层设计,减少每层的复杂性,独立的分层设计便于提高安全性。

服务器安全

最后一点是运维阶段需要特别注意的,及时更新服务器的安全补丁,确保没有可利用的公开系统漏洞,包括你的数据库系统安(尤其是数据备份工作)。

PHP中文网,有大量免费的ThinkPHP入门教程,欢迎大家学习!

本文转自:https://blog.thinkphp.cn/789333

Das obige ist der detaillierte Inhalt vonSicherheitsüberlegungen für ThinkPHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:thinkphp.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen