Bei der typischen PHP-Anwendungsentwicklung umfasst der größte Teil der Logik Datenverarbeitungsaufgaben, z. B. die Bestätigung, ob sich der Benutzer erfolgreich angemeldet hat, das Hinzufügen von Artikeln zum Warenkorb und die Verarbeitung von Kreditkartentransaktionen.
Daten können aus unzähligen Quellen stammen. Als sicherheitsbewusster Entwickler müssen Sie einfach und zuverlässig zwischen zwei Arten von Daten unterscheiden:
l Gefilterte Daten
l Kontaminierte Daten
Alle vertrauenswürdigen Daten, die Sie selbst festlegen, können als gefilterte Daten betrachtet werden. Bei den Daten, die Sie selbst festlegen, handelt es sich um alle fest codierten Daten, wie beispielsweise die folgenden E-Mail-Adressdaten:
$email = 'chris@example.org';
Die oben angegebene E-Mail-Adresse chris@example.org stammt nicht aus einer entfernten Datenquelle. Es ist offensichtlich glaubwürdig. Alle Daten, die von einer Remote-Datenquelle stammen, werden eingegeben. Alle Eingabedaten sind fehlerhaft und müssen vor der Verwendung gefiltert werden.
Kontaminierte Daten beziehen sich auf alle Daten, deren Rechtmäßigkeit nicht garantiert werden kann, wie z. B. von Benutzern übermittelte Formulare, von Mailservern empfangene E-Mails und von anderen Webanwendungen gesendete XML-Dokumente. Im vorherigen Beispiel ist $email eine Variable, die gefilterte Daten enthält. Die Daten sind der Schlüssel, nicht die Variablen. Variablen sind lediglich Datencontainer, die bei der Ausführung des Programms häufig durch kontaminierte Daten überschrieben werden:
$email = $_POST['email'];
Von Aus diesem Grund wird $email natürlich als Variable bezeichnet. Wenn Sie nicht möchten, dass sich die Daten ändern, können Sie stattdessen Konstanten verwenden:
CODE:
define('EMAIL', 'chris@example.org');
Wenn EMAIL mit der obigen Anweisung definiert wird, ist es im gesamten Skript eine unveränderliche Konstante mit dem Wert chris@example.org und ändert sich nicht, selbst wenn Sie versuchen, es neu zuzuweisen (normalerweise versehentlich). Der folgende Code gibt beispielsweise chris@example.org aus
(Der Versuch, eine Konstante neu zu definieren, führt zu einer Fehlermeldung mit der Stufe „Hinweis“).
CODE:
Tipps
Weitere Informationen zu Konstanten finden Sie unter http://www.php. cn/
Wie in Kapitel 1 besprochen, kann register_globals es schwierig machen, den Ursprung einer Variablen wie $email zu bestimmen. Alle Daten aus externen Quellen sollten als kontaminiert betrachtet werden, bis ihre Legitimität nachgewiesen ist.
Obwohl ein Benutzer Daten auf verschiedene Arten senden kann, führen die meisten Anwendungen die wichtigsten Vorgänge basierend auf den Ergebnissen der Formularübermittlung durch. Ein anderer Angreifer kann einfach dadurch kompromittieren, dass er die übermittelten Daten manipuliert (die Grundlage, auf der Ihre Anwendung funktioniert), und das Formular öffnet ihnen bequem das Design Ihrer Anwendung und die Daten, die Sie verwenden müssen. Aus diesem Grund ist die Formularverarbeitung das erste Anliegen aller Sicherheitsprobleme bei Webanwendungen.
Ein Benutzer kann Daten auf drei Arten an Ihre App übertragen:
l Durch die URL (z. B. GET-Datenmethode)
l Durch den Inhalt einer Anfrage (z. B. POST-Datenmethode)
l Über HTTP Header-Informationen (z. B. Cookie)
Da HTTP-Header-Informationen nicht direkt mit der Formularverarbeitung zusammenhängen, werden sie in diesem Kapitel nicht behandelt. Im Allgemeinen kann der Verdacht auf GET- und POST-Daten auf alle Eingaben ausgeweitet werden, einschließlich HTTP-Header-Informationen.
表单通过GET或POST请求方式传送数据。当你建立了一个HTML表单,你需要在form标签的method属性中指定请求方式:
<form action="http://example.org/register.php" method="GET">
在前例中,请求方式被指定为GET,浏览器将通过URL的请求串部分传输数据,例如,考虑下面的表单:
CODE:
<form action="http://example.org/login.php" method="GET"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" /></p> </form>
如果我输入了用户名chris和密码mypass,在表单提交后,我会到达URL为http://www.php.cn/的页面。该URL最简单的合法HTTP/1.1请求信息如下:
CODE:
GET /login.php?username=chris&password=mypass HTTP/1.1 Host: example.org
并不是必须要使用HTML表单来请求这个URL,实际上通过HTML表单的GET请求方式发送数据与用户直接点击链接并没有什么不同。
记住如果你在GET方式提交的表单中的action中试图使用请求串,它会被表单中的数据所取代。
而且,如果你指定了一个非法的请求方式,或者请求方式属性未写,浏览器则会默认以GET方式提交数据。
为说明POST请求方式,只对上例进行简单的更改,考虑把GET请求方式更改为POST的情况:
CODE:
<form action="http://example.org/login.php" method="POST"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" /></p> </form>
如果我再次指定用户名chris和密码mypass,在提交表单后,我会来到http://www.php.cn/页面。表单数据在请求的内部而不是一个URL的请求串。该方式最简单的合法HTTP/1.1请求信息如下
CODE:
POST /login.php HTTP/1.1 Host: example.org Content-Type: application/x-www-form-urlencoded Content-Length: 30 username=chris&password=mypass
现在你已看到用户向你的应用提供数据的主要方式。在下面的小节中,我们将会讨论攻击者是如何利用你的表单和URL作为进入你的应用的缺口的。
以上就是PHP安全-表单与数据的内容,更多相关内容请关注PHP中文网(www.php.cn)!