@@ -41,9 +41,9 @@ export async function isDisposableEmail(email) {
4141export async function checkPasswordBreach ( password ) {
4242 if ( ! password || password . length < 6 ) return { breached : false } ;
4343 try {
44- const sha1 = createHash ( 'sha1 ' ) . update ( password ) . digest ( 'hex' ) . toUpperCase ( ) ;
45- const prefix = sha1 . slice ( 0 , 5 ) ;
46- const suffix = sha1 . slice ( 5 ) ;
44+ const hash = createHash ( 'sha256 ' ) . update ( password ) . digest ( 'hex' ) . toUpperCase ( ) ;
45+ const prefix = hash . slice ( 0 , 5 ) ;
46+ const suffix = hash . slice ( 5 ) ;
4747 const res = await fetchWithTimeout ( `https://api.pwnedpasswords.com/range/${ prefix } ` , { } , 5000 ) ;
4848 const text = await res . text ( ) ;
4949 const found = text . split ( '\n' ) . some ( line => {
@@ -108,11 +108,21 @@ async function checkDnsbl(ip, dnsbl) {
108108 try {
109109 const parts = ip . split ( '.' ) ;
110110 if ( parts . length !== 4 ) return false ;
111- const reverseHost = `${ parts [ 3 ] } .${ parts [ 2 ] } .${ parts [ 1 ] } .${ parts [ 0 ] } .${ dnsbl } ` ;
111+ const octets = parts . map ( Number ) ;
112+ if ( octets . some ( o => isNaN ( o ) || o < 0 || o > 255 ) ) return false ;
113+ if ( octets [ 0 ] === 10 ) return false ;
114+ if ( octets [ 0 ] === 127 ) return false ;
115+ if ( octets [ 0 ] === 169 && octets [ 1 ] === 254 ) return false ;
116+ if ( octets [ 0 ] === 172 && octets [ 1 ] >= 16 && octets [ 1 ] <= 31 ) return false ;
117+ if ( octets [ 0 ] === 192 && octets [ 1 ] === 168 ) return false ;
118+ const reverseHost = `${ octets [ 3 ] } .${ octets [ 2 ] } .${ octets [ 1 ] } .${ octets [ 0 ] } .${ dnsbl } ` ;
112119 const controller = new AbortController ( ) ;
113120 const timer = setTimeout ( ( ) => controller . abort ( ) , 3000 ) ;
114121 try {
115- const res = await fetch ( `http://${ reverseHost } ` , { signal : controller . signal } ) ;
122+ const res = await fetch ( `http://${ reverseHost } ` , {
123+ signal : controller . signal ,
124+ headers : { 'Accept' : 'text/plain' } ,
125+ } ) ;
116126 return res . status >= 127 ;
117127 } catch {
118128 return false ;
@@ -731,11 +741,21 @@ async function resolveTorDnsbl(ip) {
731741 try {
732742 const parts = ip . split ( '.' ) ;
733743 if ( parts . length !== 4 ) return false ;
734- const reverseHost = `${ parts [ 3 ] } .${ parts [ 2 ] } .${ parts [ 1 ] } .${ parts [ 0 ] } .tor.dan.me.uk` ;
744+ const octets = parts . map ( Number ) ;
745+ if ( octets . some ( o => isNaN ( o ) || o < 0 || o > 255 ) ) return false ;
746+ if ( octets [ 0 ] === 10 ) return false ;
747+ if ( octets [ 0 ] === 127 ) return false ;
748+ if ( octets [ 0 ] === 169 && octets [ 1 ] === 254 ) return false ;
749+ if ( octets [ 0 ] === 172 && octets [ 1 ] >= 16 && octets [ 1 ] <= 31 ) return false ;
750+ if ( octets [ 0 ] === 192 && octets [ 1 ] === 168 ) return false ;
751+ const reverseHost = `${ octets [ 3 ] } .${ octets [ 2 ] } .${ octets [ 1 ] } .${ octets [ 0 ] } .tor.dan.me.uk` ;
735752 const controller = new AbortController ( ) ;
736753 const timer = setTimeout ( ( ) => controller . abort ( ) , 3000 ) ;
737754 try {
738- const res = await fetch ( `http://${ reverseHost } ` , { signal : controller . signal } ) ;
755+ const res = await fetch ( `http://${ reverseHost } ` , {
756+ signal : controller . signal ,
757+ headers : { 'Accept' : 'text/plain' } ,
758+ } ) ;
739759 return res . status === 127 ;
740760 } catch {
741761 return false ;
0 commit comments