Инжекторлық қорғаныспен веб-сайтты іске қосу

Мен жаңа PHP «әзірлеуші» және СОФ сайтының жаңа мүшесі. Мен веб-сайтты алғаш рет іске қосып жатырмын және менің онлайн-зерттеулерімде PHP-тің бетінде оңай болуы мүмкін екендігін айтқан болатын, ал әзірлеушілер назардан тыс қалдырады.

SOF мәлімдегендей, сіз мұнда сұрақ қоймас бұрын зерттеуіңіз керек, мен жасадым және mysql_real_escape_string (); дерекқорға зиян келтіруі мүмкін таңбалардан құтылу қажет. Содан кейін мен сіздердің мәлімдемелеріңізді дайындағанын білдім. Дегенмен, SOF және Google-ді іздейтін болсаңыз, сіз пайдаланатын екі жолдың қайсысы аз екенін анықтадым, себебі пайдаланушының енгізген деректерінің біреуі db-ге сұрау/кірістіру үшін пайдаланылады.

Сондықтан енді мен шынымен шатастырып жатырмын, себебі мен escape_string мәлімдемелерін көп адамдар мен бірнеше дайындалған мәлімдемелерді таптым.

Міне, мен:

 For Post variables: 

 $thething = mysql_real_escape_string($_POST['field']);


 For Get variables: 

 $thething = mysql_real_escape_string($_GET['id']);


 For Request variables: 

 $thething = mysql_real_escape_string($_REQUEST['id']);

Сіздің балаларыңыз туралы не ойлайтынын біліп беріңіз.

1
@ рахмет рахмет, бірақ егер мен шатастырып алсам, онда бұл жақсы
қосылды автор Sam Khan, көзі
@ col.shrapnel Қауіпсіздік туралы айтсаңыз, айнымалы мәндерді дұрыс байланыстырсаңыз немесе пішімдесеңіз, екі әдіс арасындағы айырмашылық жоқ. Байланыстыру қарапайым, өйткені ол кез келген жағдайда ғана қолданыла алады, ал қашып кету мүмкін емес (сондықтан, құтылудан/цитата келтірместен емес, кейбір айнымалыларды шығарып алу керек). Сондай-ақ, ешқандай байланыстыру немесе қашып кету идентификаторды қауіпсіз ете алмайтынын есте сақтаңыз. Осылайша, сұрауыңызда өріс атауын немесе операторды пайдалану қажет болса, сценарийде қатал кодталған мәнді пайдалану керек. ////Сонымен, мен дұрыс болдым? қайсысын пайдаланатыны маңызды емес пе?
қосылды автор Sam Khan, көзі
ықтимал көшірмесі PHP айнымалы мәнін қалай қосуға болады MySQL кірістіру мәлімдемесі
қосылды автор Your Common Sense, көзі
иә, сіз не істеп жатқаныңызды және ережелерді ұстанғаныңызды білсеңіз, қайда пайдалануға болатыны маңызды емес.
қосылды автор Your Common Sense, көзі
PHP ішіндегі SQL инъекциясын тоқтатудың ең жақсы жолы ықтимал көшірмесі
қосылды автор Quentin, көзі
Кем дегенде жаңа PHP әзірлеушісі ретінде MySQL-ді инъекциядан қорғауды іздестіру мағынасы болды! Құдіретіңіз, сэр. Сіз оны күн сайын көрмейсіз.
қосылды автор Tom, көзі
жаңа әзірлеуші ​​ретінде сіз жолдардан құтылуға сенесіз, ары қарай жалғасаңыз, инъекциядан аулақ болуға көмектесетін және өміріңізді әлдеқайда жеңілдететін кітапхананы қолданасыз, мысалы pdo_mysql. Бұл SELECT, INSERT, UPDATE-ті жазу өзіңізде ауырсыну. Менiң сенiмiмiз :) Мүмкін, біраз уақыттан бері Сізге көп көмектесетін тұтас шеңберді қолданасыз.
қосылды автор evildead, көзі

5 жауаптар

Мен барлық параметрлердің қалыпты түрде аман қалғанына көз жеткізу үшін әрдайым дайындалған мәлімдемелерді пайдалануды есте сақтау оңайырақ екенін түсінемін. Мен дайындалған мәлімдемелерді ұсынамын.

Байланысты сұрақтар:

mysqli дайындалған мәлімдемелер мен mysqli_real_escape_string

real_escape_string және дайындалған мәлімдемелер

1
қосылды

Мүмкін, зиянды пайдаланушы енгізуден құтылу үшін mysql_real_escape_string қолданамын.

Дайындалған мәлімдемелер де бірдей болады, сондықтан пайдаланушыға қолмен кіруді ұмытып кететіндігіңізді анықтасаңыз, дайындалған мәлімдемелерді қолдануға болады, бірақ бастапқы деректерден құтылудан кейін бұл екінші сипатқа айналады.

Егер CakePHP немесе CodeIgniter сияқты PHP негізін пайдалансаңыз, олар әдетте бірдей функцияларды қамтамасыз етеді. Мысалы, CodeIgniter-дің Белсенді жазбалар сіздер үшін барлық кіріс санитария туралы қамқорлық жасайды.

Қосымша қауіпсіздік туралы ақпарат:

Веб-әзірлеумен айналысқандықтан (мен сияқты), сонымен қатар XSS инъекцияларына a>, осалдықтың тағы бір нүктесі.

Соңында, қорғаныс коды. Веб-сайтты жұртшылыққа қолжетімді болғандықтан, бұл веб-әзірлеу кезінде әлдеқайда маңызды. Сіз пішін деректерін Javascript арқылы тексерген жағдайларда,

PHP сценарийінде де валидацияны орындаңыз. Қажетсіз көрінуі мүмкін, бірақ JS-ден айналып өтуге болады (бір жолы браузерде JS-ны өшіру керек).

Salt passwords at the time of hashing, avoid md5 hash. Go for either sha256, sha512 or bcrypt.

Қауіпсіздік жағдайында сіз егер сізде қауіп төндіретін болса, керісінше сіз бұзылатын боласыз. Қауіпсіздік жалғасуда, ешқашан аяқталмаған процесс болуы керек.

0
қосылды
haha ... енді мені таң қалдырды. Жоғарыдағы түсініктемеде жіберген сілтемедегі № 2 мысалда құпия сөзге кіруге тыйым салынбаған пайдаланушының кіруі рұқсат етілгенін көрсетеді. көзқараспен қарасаңдар, мүмкін, мен сені сүрініп жатқан нәрсеге біраз жарық түсіре аласыз
қосылды автор xbonez, көзі
mysql_real_escape_string пайдаланушы кірісін санитариялаудың қажеті жоқ, бірақ дәлел ретінде берілген кез келген жолды санитариялауға мүмкіндік береді. Пайдаланушы енгізуін ұстайтын $ _ POST айнымалысын өткізген болсаңыз, сіз пайдаланушы енгізуін санитаризациялайсыз, солай емес пе? Мысалы, # 2 мысалында php.net/manual/ en/function.mysql-real-escape-string.php - олар пайдаланушы енгізуін жанама түрде саналандырмайды (ол $ _ POST ['password'] түрінде сақталады))?
қосылды автор xbonez, көзі
рахмет @xbonez сіздің барлық ұсыныстарыңызды қарастырады.
қосылды автор Sam Khan, көзі
сізге хабарлау үшін, mysql_real_escape_string пайдаланушының енгізуімен ешқандай қатысы жоқ.
қосылды автор Your Common Sense, көзі
Сізге хабарлау үшін, mysql_real_escape_string-де санитаризациямен байланысты ештеңе жоқ :)
қосылды автор Your Common Sense, көзі
Әрине. Бұл функция «санитарлық тазалау» емес. Бұл функция тек escape delimiters болып табылады. Осылайша, ешқандай шектегіштер - mysql_real_escape_string үшін пайдаланбайды. мысалға келтіріңіз: «ЖӘНЕ облысы = $ _POST ['аймақ']» `(инъекция мәнімен бірге) және қараңыз.
қосылды автор Your Common Sense, көзі

Sql инъекциясына арналған өте осал деп ойлаймын:

$ thething = mysql_real_escape_string ($ _ GET ['id']); mysql_query («select * from user where id =». $ thething);

Тұжырымдаманың дәлелі: http: //localhost/index.php? id = sleep (30 )

Бұл бет жүктеу үшін 30 секундты алады, себебі ол sql инъекциясына осал.

Sql инжекциясынан өзін қорғау үшін қауіпсіз әдіс PDO немесе mysqli сияқты сұрау кітапханаларының параметрленген сұрақтары болып табылады. Сіз бәрін сынауыңыз керек. Sitewatch немесе ашық бастапқы жоба сияқты skipfish .

0
қосылды
Бұл нәрсені менің веб-сайтымда сынап көрдім. ұйқы (30) жұмыс істемеді.
қосылды автор Sam Khan, көзі

біз сіздің қорғаныс идеяңыз өте дұрыс деп санаймыз.

  1. ешқандай таңба дерекқорға зиян келтіруі мүмкін емес. Бірақ кейбір таңбалар сұрау сындыруы мүмкін. Мұны рұқсат етпеу керек.

  2. осылайша mysql_real_escape_string (); жолды бұзуы мүмкін таңбалардан құтылу.

  3. осылайша mysql_real_escape_string (); тек жолдардан шығу үшін қажет. Және бұл сұраудың кез-келген бөлігімен біраз көмектеспейді.

  4. Сонымен қатар, жолдар тек POST GET және REQUEST сұранымына ғана емес, сонымен қатар әлемдегі кез-келген көзден сұрауға да келуі мүмкін. сіз кейбір көзден емес, сұраққа кіретін жолдан қашып кетуіңіз керек. Тағайындалу көзі емес, себебі.

  5. Түсініктемелердегі сұраққа қосымша түсініктемелерді қараңыз

0
қосылды
Ал сонда полковник. Кешірім үшін кешірім сұрағым үшін # 1 болдым.
қосылды автор Sam Khan, көзі

PrepareedStatements толтырғышпен пайдаланған кезде сіз үшін кірісті босатады

SELECT * FROM myTable WHERE `id` = ?

Алайда, оның MySQL процедуралық кеңейтіліміне қолдау көрсетілмейді, себебі көптеген сайттар бұрыннан бар mysql_ (real_) escape_string() күйінде қалады, бірақ сіз оны Mysqli немесе PDO арқылы пайдалана аласыз. Мен әзірше дамудың басында болғанда дайындалған мәлімдемелерді пайдалануды ұсынамын.

0
қосылды
сіз менің MySQL escape жолымен де ұстанасыз ба?
қосылды автор Sam Khan, көзі
шын мәнінде парантты қосқан кез келген себеп: mysql_ (real_) escape_string() ??
қосылды автор Sam Khan, көзі
Сондай-ақ, mysql_escape_string() функциясы бар.
қосылды автор KingCrunch, көзі
Жоқ, Жеке жобадағы дайындалғанStatements ( SQLite3 жоғарғы жағында) және менің компаниямыз PDO_Mysql .
қосылды автор KingCrunch, көзі