【发布时间】:2011-04-17 04:56:19
【问题描述】:
我有一个简单的联系表格,其中包含姓名、电子邮件、选择列表和文本区域。在我的邮件 php 脚本中,我试图添加一个简单的过滤器来防止 SQL 注入或其他形式的黑客攻击。
例如,我正在使用
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS);
这样好吗?
【问题讨论】:
标签: php sql forms input filter
我有一个简单的联系表格,其中包含姓名、电子邮件、选择列表和文本区域。在我的邮件 php 脚本中,我试图添加一个简单的过滤器来防止 SQL 注入或其他形式的黑客攻击。
例如,我正在使用
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS);
这样好吗?
【问题讨论】:
标签: php sql forms input filter
要测试有效性,请尝试使用 SQL 注入攻击来攻击您自己的网站。基本上,尝试传递' || 1=1 之类的字符串,看看是否有错误。如果您收到错误或收到意外结果,则您的网站很容易受到攻击。否则,它可能正在工作;但可以肯定的是,请确保进行大量测试。
【讨论】:
' 和get '。所以我想它是有效的:)
`、'、"、&、= 和 ?。
更好的选择是使用 mysqli 扩展和预处理语句。但是,确实存在 mysql_real_escape_string() 函数,它专门“转义字符串中的特殊字符以在 SQL 语句中使用”。
【讨论】:
首先让我告诉你,大约 85% 的保护方法是通过 2 个功能完成的。
首先,如果有人向您的网站发送了一些数据,例如 $_POST['name'],并且您希望在 html 端使用此值,例如 <p>The following string: {$_POST['name']} is invalid</p>,那么您应该始终确保该值已通过 htmlspecialchars,这将保护大多数的 XSS 尝试
接下来是注入,如果 $_POST['name'] 的值要进入您的数据库,请确保您对该值使用 mysql_real_escape_string。
这将为您提供 100% 的 sql 注入保护,但这意味着您的数据库无法运行来自用户的命令,这并不意味着文本应该是这样的。
在将数据插入数据库之前您应该始终使用的函数是
这称为 Validation,仅用于确保用户提交的数据是您想要的,例如 filter_var 将用于验证他们输入的电子邮件是电子邮件,而不仅仅是一些 blah blah
我通常做的是运行一个干净的函数来确保所有估算的数据都是干净的 htmlspecialchars
示例:
function clean($array)
{
foreach($array as $key => $val)
{
if(is_array($val))
{
$array[$key] = clean($val); //Recursive
}else
{
$array[$key] = htmlspecialchars($val, ENT_QUOTES);
}
}
return $array;
}
然后执行以下操作以确保您免受 XSS 攻击:
$_GET = clean($_GET);
$_POST = clean($_POST);
因此,如果有人尝试提交<a href='test'>Test</a>,则该值将转换为&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt
【讨论】:
FILTER_SANITIZE_SPECIAL_CHARS 是该功能的更好替代品还是会产生相同的结果?
FILTER_SANITIZE_SPECIAL_CHARS 执行 HTML 转义 '"& 和 ASCII 值小于 32 的字符。要获得 htmlspecialchars() 的完全等效项,请使用 FILTER_SANITIZE_FULL_SPECIAL_CHARS,这相当于调用 htmlspecialchars() 并设置了 ENT_QUOTES。使用此函数应该使 mysql_real_escape_string() 的使用过时,但安全第一:)
另请参阅:http://php.net/manual/en/filter.filters.sanitize.php 了解更多信息。
【讨论】: