Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поймать спец-sql-символы и строго указать (https://javascript.ru/forum/misc/50915-pojjmat-spec-sql-simvoly-i-strogo-ukazat.html)

kostyanet 16.10.2014 18:25

Поймать спец-sql-символы и строго указать
 
Из справки функции экранирования, набор символов для экранирования экраном \

NUL (ASCII 0), \n, \r, \, ', ", and Control-Z

Пароль я не могу экранировать, мне его надо проверить и, если что-то из перечисленного нашлось - отвергнуть такой ввод.

Раньше я вообще ничего кроме длины не проверял, а тут задумалсо что надо бы запрос защитить. "Так-то" люди не конченые идиоты, но есть же некоторые, специально такие.

В срач-паде набил с полдюжины нерабочих вариантов (два процитирую), третий самый похожий на правду вот такой

var pass='пароль1';

//var pattern = new RegExp('[^\PC\s]');
//new RegExp('\p{Cc}+');

pass.match(/\0|\'|\"|\b|\n|\r|\t|\Z|\\|\%|\_/);

/*

*/


Но почему-то на цифру выдает пустую строку, а не null. Помогите люди добрые с регой для проверки на символы по списку (выше).

Aetae 16.10.2014 18:31

Для внесения в базу юзай sql параметры и не парь мозги.
Если строка в юникоде то можно инжектить не только указанными символами.

kostyanet 16.10.2014 18:36

Я же говорю - так и делал, не проверяя можно ли будет войти по паролю типа Паро(тут табулятор)ль, или там Пар"о"ль. То есть password(экранированная строка) будет идентично password(экранированная строка)?

ЗЫ Во блин, ну да, так и должно быть... запара.

Aetae 16.10.2014 18:39

kostyanet, какая те разница какой пароль у юзера? В базу он кладётся экранированным, забирается разэкранипровнным и все довольны.(а вообще пасс юзера принято хранить в виде хэша с солью, в открытом виде хранят только мудаки)

Проверить можно так:
/[\0'"\n\r\\\u001A]/.test(pass)
только на серваке всё равно надо нормально обрабатывать.

kostyanet 16.10.2014 19:21

Я понял когда рядом поставил:

Цитата:

Сообщение от kostyanet
password(экранированная строка) будет идентично password(экранированная строка)?

У меня заклинило что функция password() захерачит хэш со всего что прилетит, с экранов в том числе.

Так на серваке и проверяется и оттуда же отвергается если юзверь проник через JS-сервис. Тут как раз случай наоборот. Канонично через перезагрузку и редирект мне все это проверить и написать как два пальца - а вот этот сервис модный, на JS всю кровь выпивает.

Все равно щас проверю что вы отпостили и воткну. Хоть немного на человека буду похож. :) Спасибо.

kostyanet 16.10.2014 19:46

Пердимонокль

pattern="[\0'\"\n\r\\u001A]"

Теперь не могу записать его в тэг. Видимо надо вместо " - " то есть паттерны в рендере надо пропускать через htmlentities...

kostyanet 16.10.2014 20:06

Пропустил

pattern="[\0'"\n\r\\u001A]"

уму непостижимо как из этой бнопни JS получает паттерн и все работает.

Наверно их вообще все можно через код символа перечислить, да? Это было бы лучше чем бегать за каждым паттерном с ентитькой наперевес. А может и так хорошо, все равно после рендера они не нужны в php.


Часовой пояс GMT +3, время: 04:04.