关于数据库:防止不良数据输入

关于数据库:防止不良数据输入

Preventing bad data input

将数据验证完全委托给数据库引擎约束是一种好习惯吗?

验证来自应用程序的数据不会阻止来自另一个软件的无效插入(可能由另一个团队用另一种语言编写)。使用数据库约束可以减少需要担心无效输入数据的点。

如果你同时在数据库和应用程序中进行验证,维护变得很无聊,因为你必须为谁知道有多少应用程序更新代码,增加了人为错误的可能性。

我只是没有看到很多人这样做,查看来自自由软件项目的代码。


在输入时验证。在将其放入数据库之前再次验证。并具有数据库约束以防止错误输入。尽管如此,您可以打赌,不良数据仍会进入您的数据库,因此请在使用时再次验证它。

似乎每天都有一些网络应用程序被黑客入侵,因为他们在表单中进行了所有验证,或者更糟的是,使用 Javascript,人们找到了绕过它的方法。你必须提防这种情况。

偏执狂?我?没有,只是有经验。


如果可能,最好在数据库中指定验证规则,并使用或编写一个框架,使这些规则冒泡到您的前端。 ASP.NET 动态数据对此有所帮助,并且有一些商业库可以使它变得更加容易。

这既可以用于简单的输入验证(如数字或日期),也可以用于受外键约束的相关数据。

总而言之,这个想法是在一个地方(大多数时候是数据库)定义规则,并在其他层中有代码来执行这些规则。


当数据到达您的数据库时,为您的用户和应用程序提供有意义的验证已经太晚了。您不希望您的数据库进行所有验证,因为那样会大大降低速度,并且数据库不会清楚地表达逻辑。同样,随着您的成长,您将编写更多应用程序级事务来补充您的数据库事务。


除了带有输入的 SQL 注入之外,还有其他问题。每当接受用户输入时,您都应该采取最防御的姿态。例如,用户可能能够将指向图像的链接输入到文本框中,这实际上是一个运行令人讨厌的 PHP 脚本。

如果您的应用程序设计得很好,您就不必费力地检查所有输入。例如,您可以使用为您处理大部分工作的 Forms API,以及执行相同工作的数据库层。

这是基本检查漏洞的好资源:

http://ha.ckers.org/xss.html


将逻辑留给数据库的缺点是会增加特定服务器的负载。 Web 和应用程序服务器相对容易向外扩展,但数据库需要特殊技术。作为一般规则,将尽可能多的计算逻辑放入应用程序层并保持与数据库的交互尽可能简单是一个好主意。

话虽如此,您的应用程序可能不需要担心如此严重的可扩展性问题。如果您确定在可预??见的将来数据库服务器负载不会成为问题,那么请继续对数据库进行约束。您说得很对,通过将验证逻辑保存在一个中心位置,这提高了整个系统的组织性和简单性。


我认为没有一个正确的答案,这取决于您的使用。

如果您将拥有一个使用率非常高的系统,并且数据库性能可能会成为瓶颈,那么您可能希望将验证责任转移到前端,这样更容易扩展多个服务器。

如果您有多个应用程序与数据库交互,那么您可能不想跨多个应用程序复制和维护验证规则,那么数据库可能是更好的地方。

您可能想要一个更流畅的输入屏幕,它不仅会在用户尝试保存记录时向用户发出验证警告,也许您希望在输入数据并且失去焦点后验证字段;甚至在用户键入时,在验证失败/通过时更改字体颜色。

同样与约束有关的是可疑数据的警告。在我的应用程序中,我在数据库中有严格的限制(例如,某人无法在出生日期之前开始工作),但随后在前端对可能正确但可疑的数据发出警告(例如八岁开始工作)。


我发现在应用程序中而不是在数据库中进行验证效果很好。当然,所有的交互都需要通过你的应用程序。如果您有其他应用程序处理您的数据,您的应用程序将需要支持某种 API(希望是 REST)。


从数据库进行数据验证的另一个缺点是您通常不会在每种情况下都以相同的方式进行验证。事实上,它通常取决于应用程序逻辑(用户角色),有时您可能希望完全绕过验证(cron 作业和维护脚本)。


在不影响其他目标的情况下,在数据库端实施尽可能多的数据验证。例如,如果速度是一个问题,您可能需要考虑不使用外键等。此外,某些数据验证只能在应用程序端执行,例如,确保电子邮件地址具有有效的域。


我会说这可能是一种不好的做法,具体取决于查询失败时会发生什么。例如,如果您的数据库可能会抛出由应用程序智能处理的错误,那么您可能没问题。

另一方面,如果您未在应用中进行任何验证,则您可能没有任何错误数据,但您可能会让用户认为他们输入了未保存的内容。


推荐阅读

    linux操作数据库命令?

    linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参

    linux下载数据命令?

    linux下载数据命令?,软件,工具,数据,系统,代理,官网,网络,名称,网址,盘中,在l

    输入linux命令行参数?

    输入linux命令行参数?,工作,系统,地址,数据,流程,电脑,信息,命令,工具,管理,l

    做数据linux常用命令?

    做数据linux常用命令?,工作,系统,基础,网络,数据,标准,管理,工具,地址,命令,l

    linux查重复数据命令?

    linux查重复数据命令?,工具,数据,系统,电脑,名字,资料,代码,百度,标准,技术,

    linux数据库升级命令?

    linux数据库升级命令?,系统,信息,时间,最新,网络,名字,地址,管理,简介,传播,l

    linux命令中文输入?

    linux命令中文输入?,系统,单位,软件,管理,权威,音乐,命令,模式,录像带,短片,l

    linux输入命令星号?

    linux输入命令星号?,密码,网络,系统,通讯,概念,情况,数据,术语,网关,表示,如

    linux命令界面输入法?

    linux命令界面输入法?,系统,工具,信息,第三,软件,输入法,名字,盘后,语言,区

    linux输入空格的命令?

    linux输入空格的命令?,系统,密码,工作,命令,管理,环境,电脑,终端,空格,指令,l

    linux终端命令输入?

    linux终端命令输入?,系统,工具,电脑,工作,密码,命令,终端,照片,第一,管理,lin

    linux命令行输入取消?

    linux命令行输入取消?,系统,档案,命令,情况,管理,状态,信息,环境,百度,目录,L

    linux的图形输入命令?

    linux的图形输入命令?,系统,密码,工作,地址,工具,信息,环境,终端,电脑,地方,l

    linux界面输入命令?

    linux界面输入命令?,工作,系统,信息,地址,平台,软件,位置,环境,盘中,设计,lin

    数据库导出linux命令?

    数据库导出linux命令?,密码,数据,数据库,情况,地址,系统,工具,网上,名字,命

    linux命令行输入汉字?

    linux命令行输入汉字?,系统,软件,发行,管理,终端,命令,模式,编辑,文件,文本,L

    linux命令与数据流?

    linux命令与数据流?,工作,地址,系统,信息,命令,目录,标准,网络,管理,常用命

    linux命令输入格式化?

    linux命令输入格式化?,电脑,设备,系统,管理,位置,环境,名称,数据,磁盘,命令,l

    linux恢复数据库命令?

    linux恢复数据库命令?,工具,系统,软件,数据,盘中,密码,命令,备份,数据库,文