草庐IT

php - 验证用户输入?

coder 2024-04-07 原文

我对某件事感到很困惑,想知道是否有人可以解释一下。

在 PHP 中,我验证用户输入,所以 htmlentitiies,mysql_real_escape_string 在插入数据库之前使用,而不是在所有东西上使用,因为我更喜欢尽可能使用正则表达式,尽管我发现它们很难使用。现在显然我将使用 mysql_real_escape_string 作为数据进入数据库但不确定我是否应该仅在从数据库获取数据并将其显示在网页上时才使用 htmlentities() 因为这样做之前会改变一个人输入的数据没有保持它的原始形式,如果我以后想将该数据用于其他用途,可能会导致问题。

例如,我有一个包含 3 个字段名称、主题和消息的留言簿。现在很明显,这些字段可以包含任何东西,比如 js 标签中的恶意代码,基本上任何东西,现在让我感到困惑的是,假设我是一个恶意的人,我决定使用 js 标签和一些恶意的 js 代码并提交表单,现在基本上我有恶意我的数据库中无用的数据。现在通过在将恶意代码输出到网页(留言簿)时使用 htmlentities,这不是问题,因为 htmlentities 已将其转换为安全的等效代码,但同时我在数据库中有无用的恶意代码,我不想拥有。

所以在说完所有这些之后,我的问题是我是否应该接受这样一个事实,即数据库中的某些数据可能是恶意的、无用的数据,只要我在输出上使用 htmlentities,一切都会好起来的,还是我应该做其他事情?

我读了很多书说在接收数据时过滤数据并在输出数据时转义数据以便保留原始形式,但他们只给出了例子,比如确保一个字段只是一个使用已经内置到 php 等中的函数的 int 但我从来没有发现任何关于确保像留言簿这样的东西,你希望用户在其中键入他们想要的任何东西,但也没有找到任何东西,除了 mysql_real_escape_string() 之外,如何过滤这些数据以确保它不会破坏数据库查询?

最后有人能帮我解决这个困惑并告诉我我应该做什么以及什么是最佳实践吗?

感谢任何可以解释的人。

干杯!

最佳答案

这是一个很长的问题,但我认为您实际上要问的是:

“我应该在将 HTML 插入我的数据库之前转义它,还是在我要显示它时转义它?”

这个问题的普遍接受的答案是,当您要向用户显示它时,您应该转义 HTML(通过 htmlspecialchars),并且在放置它之前进入数据库。

原因是这样的:数据库存储数据。您输入的内容就是用户输入的内容。当您调用 mysql_real_escape_string 时,它不会改变插入数据库的内容;它只是避免将用户的输入解释为 SQL 语句。 htmlspecialchars 对 HTML 做同样的事情;当您打印用户的输入时,它将避免将其解释为 HTML。如果您要在插入之前调用 htmlspecialchars,那么您就不再忠实了。

您应该始终努力获得尽可能高的保真度。由于将“恶意”代码存储在数据库中没有任何危害(事实上,它为您节省了一些空间,因为转义的 HTML 比未转义的 HTML 更长!),并且您将来可能想要那个 HTML(如果您对用户评论使用 XML 解析器,或者有一天让受信任的用户在他们的评论中包含 HTML 的子集,或者类似的东西,会怎么样?),为什么不让它成为现实呢?

您还询问了一些其他类型的输入验证(整数约束等)。您的数据库模式应该强制执行这些,它们也可以在应用程序层进行检查(最好是通过 JS 输入,然后再在服务器端检查)。

另一方面,使用 PHP 进行数据库转义的最佳方法可能是使用 PDO,而不是直接调用 mysql_real_escape_string。 PDO 具有更高级的功能,包括类型检查。

关于php - 验证用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3638592/

有关php - 验证用户输入?的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  6. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  7. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  8. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  9. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  10. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

随机推荐