我已经阅读了许多关于如何将字符串过滤到"字母数字"的许多其他问题,但所有这些问题都建议使用preg_replace()
方法。
根据OWASP:
函数preg_replace()不应与未经过授权的用户一起使用 输入,因为有效载荷将是eval()'ed13。
preg_replace(" /.*/ e"," system('echo / etc / passwd')");
反思也可以 有代码注入缺陷。请参阅相应的反射 文件,因为它是一个高级主题。
那么现在如何在没有preg_replace的情况下实现这一目标?
$result = preg_replace("/[^a-zA-Z0-9]+/", "", $_POST['data']);
// Notice the $_POST['data']
答案 0 :(得分:5)
使用preg_replace()
过滤用户输入没问题。您引用的OWASP建议是谈论模式本身不是用户输入。
但是,我说使用过滤输入本身就是一个问题 - 您应该进行验证。如同,请勿接受无效输入。
答案 1 :(得分:2)
示例:强>
$result = ctype_alnum($_POST['data']) ? $_POST['data'] : null;
答案 2 :(得分:1)
你可以选择这样的东西:
<?php
$unsafe_input = 'some"""\'t&%^$@!`hing~~ unsafe \':[]435^%$^%*$^#'; // input from user
$safe_input = ''; // final sanitized string
// we want to allow 0-9 A-Z and a-z
// merge and flip so that we can use isset() later
$allowed_chars = array_flip(array_merge(range(0, 9), range('A', 'Z'), range('a', 'z')));
// loop each byte of the string
for($i = 0; $i < strlen($unsafe_input); ++$i)
{
// isset() is lightyears faster than in_array()
if(isset($allowed_chars[$unsafe_input[$i]]))
{
// good, sanitized, data
$safe_input.= $unsafe_input[$i];
}
}
echo $safe_input;
答案 3 :(得分:1)
我们有类似的情况,我们使用以下内容:
if ( ! preg_match('/^[a-z0-9:_\/|-]+$/i', $str))
{
//do your stuff
}