我同意 mikikg 的观点,即您需要了解 SQL 注入和 XSS 漏洞,然后才能尝试保护应用程序免受这些类型的问题的影响。
但是,我不同意他关于使用正则表达式来验证用户输入作为 SQL 注入防止器的说法。是的,请尽可能验证用户输入。但是不要依赖它来防止注入,因为黑客经常破坏这些过滤器。另外,不要对你的过滤器太严格——很多网站不会让我登录,因为我的名字中有一个撇号,让我告诉你,当这种情况发生时,a** 会很痛苦。
您在问题中提到了两种安全问题。第一个是 SQL 注入。这个漏洞是一个“已解决的问题”。也就是说,如果您使用参数化查询,并且从不将用户提供的数据作为参数传递,那么无论发生什么,数据库都会为您做“正确的事情”。对于许多数据库,如果您使用参数化查询,则没有注入的机会,因为数据实际上并未嵌入在 SQL 中发送——数据以长度前缀或类似的 blob 沿线路未转义地传递。这比数据库转义函数性能要好得多,而且更安全。(注意:如果您使用在数据库上生成动态 SQL 的存储过程,它们也可能存在注入问题!)
The second problem you mention is the cross site scripting problem. If you want to allow the user to supply HTML without entity escaping it first, this problem is an open research question. Suffice to say that if you allow the user to pass some kinds of HTML, it's entirely likely that your system will suffer an XSS problem at some point to a determined attacker. Now, the state of the art for this problem is to "filter" the data on the server, using libraries like HTMLPurifier. Attackers can and do break these filters on a regular basis; but as of yet nobody has found a better way of protecting the application from these kinds of things. You may be better off only allowing a specific whitelist of HTML tags, and entity encoding anything else.