表单安全性,php,mysql,utf8

时间:2016-01-02 03:13:44

标签: php mysql forms security

我正在制作一个注册表单,其中一些输入进入数据库而另一些则没有。我的页面使用utf8。对于没有进入db的数据,我使用这个函数(一种htmlspecialchars):

$c = array("'", '"', "/", "<", ">", "$", "%");
$s = str_replace($c, "", $s);

对于db,我将使用mysqli_real_escape_string。 从安全角度看2个问题并假设我想允许符号和unicode(utf8)。

1-对于没有进入数据库的数据,上面的函数是否足够?

2-对于db中的数据,它是mysqli_real_escape_string还是我应该使用上面的函数?或其他什么?

感谢。

Update1 在bobince回答后更新。

$c = array("'", '"', "/", "\\", "<", ">", "$", "%", "&");
$s = str_replace($c, "", $s);

UPDATE2 因此,要在db中插入,我应该使用realescapestring或prepare。然后在每个输出中逃脱,这取决于平台/语言。

2注意:

这种方式我必须多次逃避而不是一次,但也有一些优势......

对于小黑客来说,Php看起来非常强大,看起来它会自动逃脱一些角色......

2 个答案:

答案 0 :(得分:2)

$c = array("'", '"', "/", "<", ">", "$", "%");

这种字符串修改既不必要也不足以防止注入问题进入HTML(因为符号)和MySQL字符串文字(因为反斜杠)。

注入是一个输出转义问题,而不是输入过滤问题。通过尝试在输入阶段全局处理它们,您可以使应用程序中断各种有效输入,而不保证通过其他方式输入的任何数据的安全输出。

为了防止SQL注入,在构建查询字符串时,mysqli_real_escape_string没问题。 (虽然参数化查询通常更容易得到可靠的正确。)

为了防止HTML注入,htmlspecialchars很好,就在您将字符串写入HTML模板时。 (虽然一种自动HTML转义的模板语言是可取的,所以你有时不会忘记这样做。)

其他种类的注射需要自己的特殊处理。例如,如果要输出到URL查询组件,则需要urlencode(),如果要将值输出到JavaScript代码中,则需要json_encode()之类的内容。同样,这是在您为这些事物创建输出时发生的;您无法在输入过滤阶段处理此问题,因为您不知道哪些数据最终会在什么情况下结束。

输入过滤是一个好主意,用于删除您不会想要的字符(例如控制字符),并在特定的输入字段中强制执行业务规则(例如,用户名中有哪些字符有效)。但输入过滤绝对不是担心注射问题的地方。

答案 1 :(得分:0)

  

对于没有进入数据库的数据,我使用这个函数(一种htmlspecialchars):

要将输出转移到网页上,为什么不使用htmlspecialchars()?例如:

function noHTML(string $input): string
{
    return htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}

祝你好运过去。

  

对于db,我将使用mysqli_real_escape_string。

请不要。请参阅this answer

Modified XKCD comic to encourage prepared statements instead of sanitizing inputs

SQLi和XSS的一分钟解决方案

除此之外别无其他。这些是解决的问题。