让我们假装您的任务是创建一个接收输入(例如GET和/或POST)的URL(例如单个网页),并且必须清理并安全地将该输入存储到数据库中。此外,几乎任何应用程序都可以轻松地将数据发送到该URL,无论其编写的语言如何。
您将如何以安全方式完成此任务?
(我正在考虑Pit of Success,而不是轻易地将一个PHP脚本放在一起,让我对SQL injection敞开大门。)
编辑: 我已经更改了标题和一些关键字以回应一些答案。我发布这个问题是为那些可能不熟悉web开发者的人提供安全性和安全性的讨论。我不是在谈论将所有级别保持在偏执程度,只是确保minimum security处理用户输入。除了安全性讨论之外,我设想的答案将是完成所述任务的代码示例。我将提供我自己的答案(在PHP中)作为我的意思的一个例子。
另外,我希望这将成为一个社区维基。
答案 0 :(得分:0)
嗯,安全可能意味着许多不同的事情。有传输(SSL),静止(数据库,可能还有文件系统加密),甚至在查看发布的信息时(XSS和其他)。
现在,请不要使用GET请求将数据传递到您的系统。这不是GET的用途,它应该用于获取资源。因此它的名字。另一方面,POST,将数据发送到您的系统。
最简单的方法是简单地接受常规POST。每种网络语言和其他很多人都可以做到这一点。
网站应该使用SSL来确保数据在您的途中加密。您应该使用参数化查询(至少)来防止SQL注入。你应该擦除任何不允许的字符的数据。接下来在存储之前加密数据。顺便提一下,继续加密您的Web服务器和数据库服务器之间的连接。并且,对于真正的偏执狂,加密数据库正在运行的整个文件系统。
所有人说完了,把它放在一起不应该花费你几个小时;当然,取决于您在服务器上安装SSL以及服务器环境为其他项目提供的设施。
答案 1 :(得分:0)
从来没有一种快速的方法来完成一些也需要安全的事情。
努力工作的主要部分是理解,而不是实施。
这在很大程度上取决于数据的种类。例如,信用卡信息或美国社交dingsbums号码属于某些法律规定,必须安全地存储在数据库中,密码必须加密和散列,以免DB管理员再次检索用户的个人密码等等。这不仅仅是保护技术传输层的问题,以及数据本身。
“安全”是否也意味着您“以几乎所有应用程序”检索的数据都可以以任何方式受到信任?如果app1正在发送数据,但伪装成app2 - 是不安全的?您如何识别数据来源的系统/人? IP可以被欺骗,反向DNS可以被操纵等等。
答案 2 :(得分:0)
正如所承诺的,这里是一个输入并将其存储在mysql数据库中的例子,我认为这是一种安全的方式(至少,它应该可以防止SQL注入问题)。如果我错了,请纠正我。 (注意,唯一的输入来自msg
变量,可能是from GET, POST, or a cookie。)
<?php
try {
$db = new PDO('mysql:host=$hostUri;dbname=$dbName', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
$s = $db->prepare("INSERT INTO $dbName.$tableName (message) VALUES (:msg)");
$dbData = array(':msg' => $_REQUEST['msg']);
$s->execute($dbData);
print "Added to database";
} catch (PDOException $e) {
// Sensitive information can be displayed if this exception isn't handled
//print "Error!: " . $e->getMessage() . "<br/>";
die("PDO error");
}
?>
More information on PDO in PHP.
可以通过简单地在URL中包含变量(例如http://example.com/?msg=MyMessage
)或代码来调用此代码(以下示例在C#中,感谢this answer)。
using (var client = new System.Net.WebClient())
{
byte[] response = client.UploadValues(
"http://example.com/",
new System.Collections.Specialized.NameValueCollection { { "msg", "MyMessage" }});
Console.WriteLine(System.Text.Encoding.UTF8.GetString(response));
}