mysql_real_escape_string / Говнокод #13824 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
create procedure pwqgen @length int =3 
as 
/* pwqgen is a t-sql implementation of passwdqc's pwqgen password generator http://www.openwall.com/passwdqc/ */
/* inspired by https://github.com/iphoting/pwqgen.rb */
BEGIN 
create table #separators (id int identity, s char(1))
insert into #separators 
       select "-" union select "_" union select "+" union select "=" union select "2" union select "3" 
union select "4" union select "5" union select "6" union select "7" union select "8" union select "9"

declare @maxsep int, @s varchar(1)
select @maxsep=max(id) from #separators   
declare @maxid int, @w varchar(30) , @pw varchar(31) 
select @maxid=max(id) from words  -- =4096

select @w=w from words where id=convert(int,round(rand()*@maxid,0) )
-- capitalize 1st letter
if rand() > 0.5 
	select @w= UPPER(LEFT(@w,1))+SUBSTRING(@w,2,LEN(@w)) 
set @pw=@w
set @length = @length-1 

while @length > 0  
begin 
	select @s=s from #separators   where id=convert(int,round(rand()*@maxsep,0) )
	delete from #separators where s=@s

	select @w=w from words where id=convert(int,round(rand()*@maxid,0) )
	-- capitalize 1st letter
	if (rand() > 0.5 or @s is null)
		select @w= UPPER(LEFT(@w,1))+SUBSTRING(@w,2,LEN(@w)) 
	set @pw=@pw+@s+@w
set @length = @length -1 
end 

-- if no one number in @pw - append or replace last letter to random number
if PATINDEX('%[0-9]%', @pw ) > 0 
begin 
	set @s=convert(char(1), 2+convert(int,round(rand()*7,0)) )
	if len(@pw)<30 set @pw=@pw+@s
	else 	set @pw=UPPER(RIGHT(@pw,1))+SUBSTRING(@pw,1,LEN(@pw)-1)+@s
end 
drop table  #separators 
print @pw
END 

-- требует существования таблички со словами
-- create table words (id int identity , w varchar(7))
-- 4 тыс слов взял отсюда: https://github.com/iphoting/pwqgen.rb/blob/develop/lib/pwqgen/wordlist.rb

паролегенератор на tsql.
при тестах понял что возможна ситуация, когда пароль не имеет ниодной цифры, что запрещено политикой.
наговнокодил кучу charindex-ов. впринципе то работало, но вспомнил этот сайт, условие переписал под patindex, но треш в ветке с условием if PATINDEX('%[0-9]%', @pw ) > 0 остался.

Запостил: bliznezz bliznezz, (Updated )

Комментарии (5) RSS

  • 1. декларативный язык запросов не очень подходит для императивного по сути алгоритма. точнее, вру, здесь бы было бы кстати ФП.
    2. отсюда довольно странная, бажная и неэстетичная реализация.
    3. сомнителен сам алгоритм, а особенно использование словаря - что делает его уязвимым атакам брута по словарю. есть алгоритмы генерации случайных, но легкозапоминающихся паролей.
    Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8