草庐IT

php - strip_tags() 和 mysqli_real_escape_string() 的安全性

coder 2024-04-24 原文

我在一个关于信息安全的学校项目中,其中一项作业是用 PHP 编写一些安全页面。我小组中没有人知道 PHP,但这不是什么大问题,我们会学到足够多的知识来创建所需的简单页面。

助教们给出的其中一个技巧是使用strip_tags()mysqli_real_escape_string() 这两个函数。我认为这些是安全的,但在没有深入了解的情况下我不确定。一些简单的谷歌搜索至少揭示了过去存在的漏洞。由于任务的一部分是尝试破坏其他组的系统,所以我们自己的系统是安全的,并且在其他组的系统中找到可能的漏洞是很重要的。而且大部分群体都会盲目地使用这两个功能。所以我的问题是:

  1. strip_tags() 中是否存在任何已知漏洞?
  2. mysqli_real_escape_string() 中是否存在任何已知漏洞?
  3. 是否有一个自然的地方可以搜索此类漏洞(除了询问 StackOverflow)?

最佳答案

首先,我建议您使用 Mysqli Prepared Statements .这些是 more secure而不是转义函数,因为它将查询结构与查询参数完全分开。

您可以使用 either strip_tags 或 htmlentities 以确保没有恶意代码被输出到浏览器。您可能还想运行 all在将动态内容输出到浏览器之前通过某种过滤功能。这是一个组织良好且有凝聚力的 OO 方法可以提供帮助的领域,因为您可以将所有动态内容分配给一个对象,然后该对象负责将输出呈现给浏览器,这样您就可以始终放心地知道您的内容是 XSS无需在多个页面中搜索数百个 echo 语句即可安全。

然而,这两个建议实际上只是涉及 PHP 安全性的冰山一角。还有许多其他问题也需要处理,例如:

我建议您查看以下站点,以了解有关 PHP 安全主题的更多、更全面的处理:

  • shiflett.org
  • phpsecurity.org (这是另一个 Chris Shiflett 网站,但我不确定他是否在这里有他个人网站上没有的其他内容)
  • phpsec.org那里的内容没有我想要的那么多,但有一些有用的东西需要了解,例如让某些包含敏感信息(如数据库密码)的配置文件不存储在公开可用的目录中。

关于最后一项,如果可能的话,您将希望研究使用 .htaccess 文件或其等效的 IIS 文件,以确保只有您打算访问的文件是公开可用的。否则,您所有其他的安全措施都将是徒劳的。

更新:我想到了与您项目中的安全相关的其他几个问题。如果您还记得不久之前 Twitter 管理员帐户被黑客入侵的不幸事件,那么它的发生有多种原因,而这些原因本来可以很容易地解决。

1) 密码登录尝试不受限制。换句话说,如果用户尝试登录但失败,那么来自其 IP 的重复请求可能需要 2 秒来处理第二次,然后是 4 秒,依此类推。这使得机器人连续尝试登录变得不切实际。
2) 不需要安全密码。由于密码有更高的要求(所需字符的长度和类型,如字母数字和特殊字符),因此字典攻击变得完全不切实际,因为在破解密码时抛出字典比随机数字串要容易得多和字母。此外,随着添加更多字符,破解密码的时间呈指数级增长。

可以看到this post从 Jeff Atwood 获取有关此特定主题的更多信息。

关于php - strip_tags() 和 mysqli_real_escape_string() 的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/585358/

有关php - strip_tags() 和 mysqli_real_escape_string() 的安全性的更多相关文章

  1. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  2. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  3. ruby - 从 String#split 返回的零长度字符串 - 2

    在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"

  4. ruby-on-rails - ActiveRecord:除非另有说明,否则在保存之前使所有文本字段都调用 strip - 2

    多年来,我在各种网站上遇到过各种问题,用户在字符串和文本字段的开头/结尾放置空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来不对,但实际上并非如此),有时它们实际上会使应用程序崩溃。我认为这会很有用,而不是像我过去所做的那样放入一堆before_save回调,向ActiveRecord添加一些功能以在保存之前自动调用任何字符串/文本字段上的.strip,除非我告诉它不是,例如do_not_strip:field_x,:field_y或类定义顶部的类似内容。在我去弄清楚如何做到这一点之前,有没有人看到更好的解决方案?明确一点,我已经知道我可以做到这一点:befor

  5. ruby - json 没有将 String 隐式转换为 Integer (TypeError) - 2

    玩转ruby​​,我已经:#!/usr/bin/ruby-w#WorldweatheronlineAPIurlformat:http://api.worldweatheronline.com/free/v1/weather.ashx?q={location}&format=json&num_of_days=1&date=today&key={api_key}require'net/http'require'json'@api_key='xxx'@location='city'@url="http://api.worldweatheronline.com/free/v1/weather.

  6. ruby - 类型错误 : can't convert String into Integer - 2

    我有代码:classScenedefinitialize(number)@number=numberendattr_reader:numberendscenes=[Scene.new("one"),Scene.new("one"),Scene.new("two"),Scene.new("one")]groups=scenes.inject({})do|new_hash,scene|new_hash[scene.number]=[]ifnew_hash[scene.number].nil?new_hash[scene.number]当我启动它时出现错误:freq.rb:11:in`[]'

  7. ruby - 为什么 String::sub!() 会更改 Ruby 中克隆对象的原始对象? - 2

    我的Ruby代码中有一个看起来有点像这样的结构Parameter=Struct.new(:name,:id,:default_value,:minimum,:maximum)稍后,我使用创建了这个结构的一个实例freq=Parameter.new('frequency',15,1000.0,20.0,20000.0)在某些时候,我需要这个结构的精确副本,所以我调用newFreq=freq.clone然后,我更改newFreq的名称newFreq.name.sub!('f','newF')奇迹般地,它也改变了freq.name!像newFreq.name='newFrequency'这样

  8. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  9. ruby - 重构 Ruby : Converting string array to int array - 2

    我正在重构一个西洋跳棋程序,我正在尝试将玩家移动请求(例如以“3、3、5、5”的形式)处理到一个int数组中。我有以下方法,但感觉不像我所知道的那样像Ruby:deftranslate_move_request_to_coordinates(move_request)return_array=[]coords_array=move_request.chomp.split(',')coords_array.each_with_indexdo|i,x|return_array[x]=i.to_iendreturn_arrayend我用它进行了以下RSpec测试。it"translatesa

  10. ruby - "string literal in condition"是什么意思? - 2

    每当我尝试运行该程序时,都会弹出一条错误消息“条件字符串文字(第10行)”。我做错了什么?puts"Welcometothebestcalculatorthereis.Wouldyouliketo(a)calculatetheareaofageometricshapeor(b)calculatetheequationofaparabola?Pleaseenteran'a'ora'b'togetstarted."response=gets.chompifresponse=="a"or"A"puts"ok."elsifresponse=="b"or"B"puts"awesome."else

随机推荐