谢谢
虽然zerkms已经回答过这个问题了
对于任何接触数据库的用户输入进行SQL注入的清理,需要使用mysql_real_escape_string($_REQUEST['search'])
如果您要显示用户搜索的内容,例如“您搜索了:”,请使用htmlentities(strip_tags($_REQUEST['search']), ENT_QUOTES);
这样,您就可以保证输入和输出的安全。
我只想在这里讨论中再添加一个观点。你说:
我的意思是,这只是一个搜索输入,用户应该能够在网站上搜索任何想要的内容。
但是有个问题:经常情况下,搜索词将被打印到搜索后呈现的文档中。也就是说,“您搜索了:<搜索内容>”。如果您没有对此进行消毒,那么这就是您的XSS漏洞所在。
如果您认为“但我们不这样做”,请记住,您现在可能不这样做,但未来可能会这样做。如果您现在不封闭此漏洞,您很可能会忘记以后这样做,因此最好在萌芽状态下解决问题。
SQL注入和XSS是两种不同(但有些相关)的攻击。它们之间的关系在于,本质上归结为不受信任的数据从其放置的上下文中逃逸,并随后执行未预料到的操作。
为了遵循最佳实践来构建您的防御措施,我建议您阅读OWASP的SQL注入预防备忘单和他们的XSS预防备忘单。
OWASP提出了ESAPI项目,其中包括用于编码不受信任数据可以使用的不同上下文的工具:
这个库可用于多种语言,包括Java、.NET、PHP、Classic ASP、Cold Fusion、Python和Haskell。如果需要,它还能执行输入验证。
一些使用ESAPI的组织包括美国运通公司、Apache基金会、Booz Allen Hamilton、Aspect Security、Foundstone(麦克菲)、哈特福德、无限校园、洛克希德·马丁公司、MITRE、美国海军-SPAWAR、世界银行、SANS研究所。
最后 - 编码应该在解释之前执行(越接近越好)。例如:在将不受信任的数据提供给UI组件进行呈现之前,您对其进行编码。UI组件不能信任服务器 - 它必须进行编码。
htmlspecialchars
函数;如果要输出到文件或电子邮件,你则不需要应用任何函数等等。因此,在你知道你要输出到哪里之前,你无法知道如何进行清理。另外,如果你在输入时犯了一个错误怎么办?如何“重新清理”数据?如何知道哪些数据被清理得不正确?如果你在输出时进行清理,那么你只需在一个地方修复它一次,就不会有这样的麻烦了。 - zerkms