过滤来自用户的输入(POST 和 GET)以避免 SQL 注入和这种性质的事情的行业标准是什么。到目前为止,我正在使用 filter_input() 和 mysql_real_escape_string() 函数?这是否足够,如果没有,我应该使用哪些其他方法?
5 回答
转义以避免 SQL 注入和过滤或验证输入是两件不同的事情。您不需要过滤输入来避免 SQL 注入,过滤输入不一定有助于防止 SQL 注入。
为避免 SQL 注入,您需要对输入进行转义,这样它就不会弄乱查询的语法,或者您使用准备好的语句来完全避免该问题。这个输入包含什么,不管它是否被过滤,都无关紧要。如果您对数据库使用适当的转义函数或使用准备好的语句将其转义一次,那么您就不必担心 SQL 注入了。
您出于不同的原因过滤或验证输入,主要是因为您不想在数据库中允许某些值。这与将这些值放入数据库(可能发生 SQL 注入的地方)的方式完全不同。
在输出时,您还需要根据输出介质对值进行转义,原因与将它们放入 SQL 查询时转义它们的原因相同:以避免混淆可能被利用的语法。即,当输出到网页时,您的 HTML 会转义您的值。同样,它的价值是什么并不重要。如果它被正确地逃脱,它可以是任何东西。
一个重要的生活规则是FIEO。过滤输入转义输出。
您从用户那里获取和存储的任何信息都必须在服务器端进行过滤,为此您应该使用mysql_real_escape_string
. 在将值添加到数据库之前,它始终应该是您应该做的最后一件事。验证用户输入,确保它是您想要的,如果您需要使用正则表达式,请删除任何符号或标签,检查其长度和任何其他规则 - 完成所有这些,然后最后应用 MySQL 函数mysql_real_escape_string
。
您在网页上显示的任何动态信息(即来自用户生成内容的数据库或直接来自用户输入)都必须进行转义。您必须对任何符号进行 URL 编码,删除(或编码)任何 HTML 标记。
我强烈建议您观看专家 Chris Shiflett 的网络安全演示:
http://www.slideshare.net/shiflett/evolution-of-web-security
我建议你使用数据库库将数据保存到数据库,如 pear db 或 cakephp orm
在这种方法中,您确实注意到可以攻击您的数据库进行注入
您可以在 php 中使用 PDO 进行数据库连接。PDO 代表 PHP 数据对象。它比 mysql_connect 更好。PDO 是面向 Objetc 的,它也确保了更多的保护。
http://www.php.net/manual/en/class.pdo.php
$link = new PDO ( $dsn, $user, $password, $options ) ;
使用htmlspecialchars对可能导致问题的字符进行编码。验证数据是不同的,这取决于您对输入字段的期望。