我PHP配置,以便魔术的报价是在和注册globals关闭。

我尽我所以一直叫htmlentities()为什么我输出,来自用户的投入。

我偶尔也会搜索我的数据库,用于公共事物中使用的xss附如...

<script

还有什么我应该做和如何,我可以确定的事情,我试图做的是 总是 完成。

有帮助吗?

解决方案

逃离的输入不是你能做的最好的为成功的XSS预防。还出必须逃跑。如果你使用自作聪明的模板发动机,可以使用 |escape:'htmlall' 改性剂转换所有敏感字HTML实体(I使用自己的 |e 修改其别名以上)。

我的方法的输入/输出安全是:

  • 存储用户输入不修改(没有HTML转输入,只有DB-知道逃避通过公设辩护准备的发言)
  • 逃离上输出,根据什么产出的格式使用(例如HTML。需要不同的逃规则)

其他提示

我认为,一个不应该逃避任何输入期间,只有在输出。由于(大部分时间),你不能假设你知道这个数据是怎么回事。例如,如果有形式,需要数据后来出现在一个电子邮件发送出去,你需要不同的逃逸(无恶意用户无法重写你的电子邮件的标题).

换句话说,你只能逃脱在最后一刻的数据"离开"你的应用程序:

  • 列项目
  • 写信给XML文件,逃避对XML
  • 写信给数据库,逃出(对特定DBMS)
  • 写电子邮件、逃脱的电子邮件
  • 等等

去短:

  1. 你不知道你的数据是会
  2. 数据实际上可能最终超过一个地方,需要不同的逃机构的但不是两个
  3. 数据逃出错误的目标真的是不好的。(E g。收到一封电子邮件与问题"去汤米\'s酒吧"。)

Esp#3会发生,如果你逃跑的数据在输入层(或者你要逃跑,等等)。

PS:我第二个建议不使用magic_quotes,这些都是纯粹的恶!

有很多方法可以做到的XSS(见 http://ha.ckers.org/xss.html)和它的很难赶上。

我亲自委派此,目前的框架,我使用的(代码的点火器用于例)。虽然还不完善,它可能会赶上超过我的手工制作的程序永远做。

这是一个很大的问题。

首先,不要逃避上的文字输入,除了使它的安全存储器(例如,被投入一个数据库)。为此原因是你想要保留什么是输入因此可以根据上下文在不同的方式和地点。改变在这里可以妥协你的后来介绍。

当你走出你的数据筛选出什么不应该存在。例如,如果没有一个原因javascript须在那里搜索它,并将其删除。一个简单的方法就是使用 strip_tags 功能和只有本html标记,你是允许。

接下来,你有什么,并通过它认为htmlentities或htmlspecialchars改变有什么好ascii characters.这样做基于的背景下和什么你想出去。

我还建议关闭魔术的报价。它已经从PHP6和被认为是不好实践中使用它。详细信息 http://us3.php.net/magic_quotes

欲了解更多详情请查看 http://ha.ckers.org/xss.html

这不是一个完整的答案,但是,希望这足以帮助你开始。

rikh写道:

我尽我所以一直叫htmlentities()为什么我输出,来自用户的投入。

看见乔尔的文章 使代码看起来是错误的 为帮助这个

我依赖 PHPTAL 为。

不同于智者的和平PHP,it escapes所有输出的默认。这是一个巨大的胜利对于安全,因为你的网站将不会成为vurnelable如果你忘记了 htmlspecialchars()|escape 在某个地方。

XSS是HTML特定的攻击,所以HTML输出是合适的地方,以防止它。你不应该试图预先筛选数据库中的数据,因为你可能需要输出数据的另一个媒体不接受HTML,但有其自身的风险。

模板图书馆。 或至少,那是什么样的模板图书馆应该做的。防止XSS 所有 输出应编码。这不是任务的主要应用程序/控制的逻辑,它应该仅仅处理输出方法。

如果你撒htmlentities()酒店各处都设有代码,整体设计是错误的。并且如你建议,你可能会错过一个或两个点。这就是为什么唯一的解决办法是严格html编码 ->的时候 输出变量写入html/xml流。

不幸的是,大多数php模板图书馆只会增加他们自己的模板法,但不关注自己的输出编码,或本地化,或html验证,或者任何重要的。也许别人知道一个适当的模板图书馆php?

逃避所有用户输入足够为大多数网站。还要确保会议Id不会结束的URL,使他们不可能是被偷的 Referer 链接到另一个网站。此外,如果您允许用户提交的链接,确保没有 javascript: 协议链接是允许的;这些将执行一个脚本,尽快使用者点击的链接。

如果你关心的XSS攻击编码输出串HTML是解决方案。如果你还记得以编码的每一单个输出符HTML格式,也没有办法来执行一个成功的XSS攻击。

详细阅读:消毒用户的数据:如何以及在哪里做

就个人而言,我将禁用magic_quotes.在PHP5+它是默认,它是更好地代码,如果是不存在的,因为它不能逃脱一切,并且它将从PHP6.

接下来,取决于什么类型的用户数据筛选将决定下一步该怎么做如如果这只是文字如一个名字,然后 strip_tags(trim(stripslashes())); 它或检查的范围内使用普通的表达方式。

如果你期待一定的数值范围之内,创建一系列有效的价值观和只允许这些价值观通过(in_array($userData, array(...))).

如果你检查的数字使用is_numeric执行整个号码或者转换为特定类型,即应防止人们试图发送串利。

如果你有PHP5.2+然后再考虑看看 过滤器() 和使用,扩展其能够过滤器的各种数据类型包括电子邮件地址。文件不是特别好,但是在改善。

如果你要处理HTML那么你应该考虑的东西喜欢 PHP输入过滤器HTML净化器.HTML净化器也将验证HTML一致性。我不知道,如果输入的过滤器仍然是正在开发之中。都会让你定义的标签,可用于和哪些属性都是允许的。

不管你怎么决定时,始终牢记,永远不要相信任何东西进入你的PHP script从用户(包括你自己!).

所有这些问题的答案是巨大的,但从根本上讲,解决XSS将停止产生HTML文档串通过操纵。

筛选输入是始终是一个好主意,对于任何应用程序。

逃避你的输出,使用htmlentities()和朋友应工作,只要它是使用正确的,但这是HTML相当于创建一个SQL query通过连串mysql_real_escape_string($var)-应该的工作,但较少的事情可以验证你的工作,可以这么说,比较的办法,如使用参数化的询问。

长期解决应该应用程序建造的页面内部,也许使用标准接口像DOM,然后向使用图书馆(如用于)以处理的化XHTML/HTML/等。当然,我们是一个长期的方式离开,正在流行,速度不够快,但与此同时,我们必须建立我们HTML文档串通过操作,这是固有的风险更大。

我发现,使用这种功能有助于带来很多可能的xss的攻击:http://www.codebelay.com/killxss.phps

"魔术的报价"是治标不治本的补救办法的一些最糟糕的XSS缺陷,其运作由逃避上的一切输入,这是错的设计。唯一的情况下一个人会想到使用它的时候你绝对必须使用现有的PHP应用程序称为是写不小心方面的XSS.(在这种情况下你在一个严重的麻烦,甚至与"魔法行情"。) 当发展中你自己的应用程序,应禁止"魔术的报价",并按照XSS-安全的做法,而不是。

XSS,截站脚本脆弱性、应用程序包括串从外部来源(用户输入、取从其他网站等),在其第[X]HTML,CSS写或其他浏览器分析产出没有适当的逃跑,希望特别的人物,如小于(在[X]HTML),单一或双引号(写)将永远不会出现。适当的解决方案,它是总是逃串根据本规则的输出语言:使用实体在[X]HTML,反斜杠,在写法等。

因为它可能难以跟踪的什么是不可信的和具有可以逃脱,这是一个好主意,以永远逃脱一切,这是一个"文本串的"相对于"文本标记"一语言HTML。一些编程的环境,使它更容易通过引入几项不相容的串的类型:"string"(法文本),"HTML string"(HTML markup)等。这样,一个直接的隐性转换"string"到"HTML string"将是不可能的,并且只有这样一串可能成为HTML标是通过一个逃脱的功能。

"注册的全局",虽然禁止这绝对是一个很好的想法,涉及一个问题完全不同的XSS.

让你的任何一届会议饼干(或所有cookie)使用HttpOnly.大多数浏览器将隐藏cookie值从JavaScript在这种情况。用户手动仍然可以复制的饼干,但是这有助于防止直接的脚本访问。计算器了这个问题德宁测试阶段。

这不是一个解决方案,只是另一个砖砌的墙

  • 不要信任用户输入
  • 逃避所有的自由文本输出
  • 不用magic_quotes;看看有没有DBMS具体变体,或使用公设辩护人
  • 考虑使用HTTP只有饼干在可能避免任何恶意脚本能够劫持一届会议

你至少应该验证所有数据进入数据库。并尝试验的所有数据而使数据库。

mysql_real_escape_string是良好的,以防止SQL注,但XSS是棘手。你应该preg_match,stip_tags,或htmlentities在可能的!

目前最好的方法防止XSS在PHP应用程序是HTML净化器(http://htmlpurifier.org/).一个小小的缺点是,它是一个相当大的图书馆是最好使用与运码缓像APC。你会用这在任何地方,不受信任的内容被输出到屏幕上。这是更彻底的,htmlentities,htmlspecialchars,filter_input,filter_var,strip_tags,等等。

使用现有用户输入清理库干净 所有 用户输入。除非你把一个 很多 的努力,执行它自己会永远不会的工作。

我找到最好的办法是使用一个类,允许你绑定你的代码这样你也不用担心手逃避你的数据。

这是难以实现彻底sql注入/xss注射预防在一个网站,不会导致错误的警报。在CMS终端用户可能想要使用 <script><object> 链接的项目从另一个网站。

我建议具有所有用户都安装火狐与计算机;-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top