如何在PHP中为哈希转换器消毒输入?


How can I sanitise input for a hash converter in PHP?

我做了一个网站,从用户输入纯文本生成哈希,用户可以输入一个单词/短语,并从MD5或SHA1(或两者)中选择。然后,该站点接受此输入并将其转换为MD5;SHA1并将其存储在数据库中,然后返回给用户。用户也可以在搜索栏中输入哈希值,如果数据库有哈希值,它将返回原始单词,目的是生成众包哈希表,同时为用户提供好处。我已经得到了主要功能的工作,但我有关于我应该消毒的困境,我希望用户能够输入特殊字符,因为它将提高搜索功能返回结果的机会,任何建议将不胜感激,谢谢。

如果只是要散列,则不应该对任何内容进行消毒,因为散列函数通常不容易受到注入攻击。

当然,您应该对所有数据库输入(插入和搜索)进行消毒。但是,除非您使用的是不支持参数化查询的过时数据库API(例如mysql_*函数;

我看不出您的应用程序有任何理由对内容进行消毒。您对用户输入所做的一切就是将其提供给加密散列函数,这些函数将很高兴地接受任何字节序列。

当然,如果要在结果页面上显示输入字符串,则应该在将其嵌入HTML代码之前使用htmlspecialchars()对其进行转义。同样,如果你把它作为URL的一个参数,你应该用urlencode()转义它,如果你把它存储在SQL数据库中,你应该用数据库驱动程序的合适的转义函数(例如mysqli::escape_string())转义它,或者只使用带占位符的准备好的SQL语句。

还要注意,加密散列函数对字节字符串进行操作,而不是对字符串进行操作。这意味着,特别是对于包含非ascii字符的文本,哈希值将取决于用于将其编码为字节的字符编码。对于Unicode文本,它还可能取决于所使用的规范化形式。目前,UTF-8(带有规范化格式C或D,或者用户浏览器发送的任何格式)可能是一种相当普遍的选择,但如果您希望有所帮助,您可能希望为用户提供不同编码的选择。