คำถามติดแท็ก sql-injection

การฉีด SQL เป็นเทคนิคการแทรกโค้ดที่ใช้เพื่อโจมตีแอปพลิเคชันที่ขับเคลื่อนด้วยข้อมูลซึ่งคำสั่ง SQL ที่เป็นอันตรายจะถูกแทรกลงในช่องป้อนข้อมูลเพื่อดำเนินการ

28
ฉันจะป้องกันการฉีด SQL ใน PHP ได้อย่างไร?
คำตอบของคำถามนี้เป็นความพยายามของชุมชน แก้ไขคำตอบที่มีอยู่เพื่อปรับปรุงโพสต์นี้ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ วิธีนี้จะช่วยให้คุณเข้าถึงสแต็คโอเวอร์โฟลว์ที่ซ้อนทับกันบน: การจัดการกับ SQL หรือไม่ SQL-инъекцийв PHP? หากการป้อนข้อมูลของผู้ใช้ถูกแทรกโดยไม่มีการดัดแปลงลงในแบบสอบถาม SQL แอปพลิเคชันจะเสี่ยงต่อการฉีด SQLเช่นในตัวอย่างต่อไปนี้: $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')"); นั่นเป็นเพราะผู้ใช้สามารถป้อนสิ่งที่ชอบvalue'); DROP TABLE table;--และแบบสอบถามจะกลายเป็น: INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--') สิ่งที่สามารถทำได้เพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้น?

17
ฉันจะฆ่าเชื้ออินพุตของผู้ใช้ด้วย PHP ได้อย่างไร
มีฟังก์ชั่น catchall บางแห่งที่ทำงานได้ดีสำหรับฆ่าเชื้ออินพุตของผู้ใช้สำหรับการฉีด SQL และการโจมตี XSS ในขณะที่ยังอนุญาตแท็ก HTML บางประเภทอยู่?

13
การฉีด SQL จากการ์ตูน "Bobby Tables" XKCD ทำงานอย่างไร
แค่มองไปที่: (ที่มา: https://xkcd.com/327/ ) SQL นี้ทำอะไร: Robert'); DROP TABLE STUDENTS; -- ฉันรู้ว่าทั้งสอง'และ--สำหรับความคิดเห็น แต่คำไม่DROPได้รับความเห็นเช่นกันเพราะมันเป็นส่วนหนึ่งของบรรทัดเดียวกันหรือไม่

7
PDO มีการจัดทำงบที่เพียงพอเพื่อป้องกันการฉีด SQL หรือไม่?
สมมติว่าฉันมีรหัสเช่นนี้: $dbh = new PDO("blahblah"); $stmt = $dbh->prepare('SELECT * FROM users where username = :username'); $stmt->execute( array(':username' => $_REQUEST['username']) ); เอกสาร PDO พูดว่า: ไม่จำเป็นต้องอ้างพารามิเตอร์ของคำสั่งที่เตรียมไว้ คนขับจัดการกับมันให้คุณ นั่นคือทั้งหมดที่ฉันต้องทำเพื่อหลีกเลี่ยงการฉีด SQL? มันง่ายจริงๆเหรอ? คุณสามารถสมมติว่า MySQL ถ้ามันสร้างความแตกต่าง นอกจากนี้ฉันแค่อยากรู้เกี่ยวกับการใช้งบเตรียมกับการฉีด SQL ในบริบทนี้ฉันไม่สนใจ XSS หรือช่องโหว่อื่น ๆ

4
การฉีด SQL ที่ได้รับรอบ mysql_real_escape_string ()
มีความเป็นไปได้ในการฉีด SQL แม้ว่าจะใช้mysql_real_escape_string()ฟังก์ชันอยู่หรือไม่ พิจารณาสถานการณ์ตัวอย่างนี้ SQL ถูกสร้างใน PHP ดังนี้: $login = mysql_real_escape_string(GetFromPost('login')); $password = mysql_real_escape_string(GetFromPost('password')); $sql = "SELECT * FROM table WHERE login='$login' AND password='$password'"; ฉันเคยได้ยินคนจำนวนมากพูดกับฉันว่ารหัสเช่นนั้นยังคงเป็นอันตรายและเป็นไปได้ที่จะแฮ็กแม้จะmysql_real_escape_string()ใช้ฟังก์ชั่น แต่ฉันไม่สามารถคิดถึงการหาประโยชน์ที่เป็นไปได้ใด ๆ การฉีดแบบคลาสสิคเช่นนี้: aaa' OR 1=1 -- ไม่ทำงาน. คุณรู้หรือไม่ว่าการฉีดใด ๆ ที่เป็นไปได้ซึ่งจะได้รับผ่านโค้ด PHP ข้างต้น?

9
งบที่เตรียมไว้สามารถป้องกันการโจมตีจากการฉีด SQL ได้อย่างไร
วิธีการทำงบเตรียมช่วยเราป้องกันการฉีด SQLการโจมตี? Wikipedia พูดว่า: คำสั่งที่เตรียมไว้มีความยืดหยุ่นต่อการฉีด SQL เนื่องจากค่าพารามิเตอร์ซึ่งถูกส่งในภายหลังโดยใช้โปรโตคอลที่แตกต่างกันจึงไม่จำเป็นต้องหลบหนีอย่างถูกต้อง หากเทมเพลตคำสั่งดั้งเดิมไม่ได้มาจากอินพุตภายนอกการฉีด SQL จะไม่เกิดขึ้น ฉันไม่เห็นเหตุผลที่ดีมาก อะไรจะเป็นคำอธิบายที่ง่ายในภาษาอังกฤษง่าย ๆ และตัวอย่างบางส่วน?

12
Java - สตริงการยกเว้นเพื่อป้องกันการฉีด SQL
ฉันพยายามใส่ anti sql injection ใน java และฉันพบว่ามันยากมากที่จะทำงานกับฟังก์ชั่นสตริง "replaceAll" ในที่สุดฉันต้องฟังก์ชั่นที่จะแปลงใด ๆ ที่มีอยู่\ในการ\\ใด ๆ"เพื่อ\"ใด ๆ'ไป\'และใด ๆ\nไป\\nเพื่อที่ว่าเมื่อสตริงจะถูกประเมินโดยการฉีด MySQL SQL จะถูกปิดกั้น ฉันได้เพิ่มโค้ดบางส่วนที่ฉันทำงานด้วยและ\\\\\\\\\\\ฟังก์ชั่นทั้งหมดทำให้ตาของฉันแย่ลง หากใครเกิดขึ้นมีตัวอย่างของเรื่องนี้ฉันจะขอบคุณมันมาก

18
ฉันสามารถป้องกันการฉีด SQL ด้วยการหลีกเลี่ยงการอ้างคำพูดเดียวและป้อนข้อมูลผู้ใช้โดยรอบด้วยคำพูดเดียว?
ฉันรู้ว่าการสืบค้น SQL แบบแปรผันเป็นวิธีที่ดีที่สุดในการฆ่าเชื้ออินพุตของผู้ใช้เมื่อสร้างเคียวรีที่มีการป้อนข้อมูลของผู้ใช้ แต่ฉันสงสัยว่าเกิดอะไรขึ้นกับการป้อนข้อมูลผู้ใช้และหลีกเลี่ยงคำพูดเดี่ยว ๆ นี่คือรหัส: sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'" เครื่องหมายคำพูดเดี่ยวใด ๆ ที่ผู้ใช้ป้อนจะถูกแทนที่ด้วยเครื่องหมายคำพูดเดี่ยวสองชั้นซึ่งจะช่วยลดความสามารถของผู้ใช้ในการวางสตริงดังนั้นสิ่งอื่น ๆ ที่พวกเขาอาจพิมพ์เช่นอัฒภาคเครื่องหมายเปอร์เซ็นต์และอื่น ๆ ทั้งหมดจะเป็นส่วนหนึ่งของสตริงและ ไม่ได้ดำเนินการจริง ๆ เป็นส่วนหนึ่งของคำสั่ง เรากำลังใช้ Microsoft SQL Server 2000 ซึ่งฉันเชื่อว่า single-quote เป็นตัวคั่นสตริงเท่านั้นและวิธีเดียวที่จะหลีกเลี่ยงตัวคั่นสตริงดังนั้นจึงไม่มีวิธีดำเนินการใด ๆ กับผู้ใช้ประเภทใด ๆ ฉันไม่เห็นวิธีใดที่จะเปิดการโจมตีด้วยการฉีด SQL เพื่อต่อต้านสิ่งนี้ แต่ฉันรู้ว่าถ้านี่เป็นกระสุนที่ดูเหมือนกับฉันคนอื่นจะคิดว่ามันแล้วและมันจะเป็นเรื่องธรรมดา เกิดอะไรขึ้นกับรหัสนี้ มีวิธีการโจมตี SQL injection ผ่านเทคนิคการฆ่าเชื้อนี้หรือไม่ ตัวอย่างอินพุตของผู้ใช้ที่ใช้ประโยชน์จากเทคนิคนี้จะเป็นประโยชน์ UPDATE: ฉันยังไม่รู้วิธีการเปิดใช้การโจมตี SQL injection …

10
PreparedStatement จะหลีกเลี่ยงหรือป้องกันการแทรก SQL ได้อย่างไร
ฉันรู้ว่า PreparedStatements หลีกเลี่ยง / ป้องกัน SQL Injection มันทำได้อย่างไร? แบบสอบถามฟอร์มสุดท้ายที่สร้างโดยใช้ PreparedStatements จะเป็นสตริงหรืออย่างอื่น?

6
htmlspecialchars และ mysql_real_escape_string ทำให้โค้ด PHP ของฉันปลอดภัยจากการแทรกหรือไม่
คำถามในวันนี้ก่อนหน้านี้ถูกถามเกี่ยวกับกลยุทธ์การเข้าตรวจสอบในเว็บแอป คำตอบด้านบนในขณะที่เขียนแสดงให้เห็นในPHPเพียงแค่ใช้และhtmlspecialcharsmysql_real_escape_string คำถามของฉันคือเพียงพอหรือไม่? มีอะไรมากกว่านี้ที่เราควรรู้? ฟังก์ชันเหล่านี้พังตรงไหน?

7
เหตุใดเราจึงชอบใช้พารามิเตอร์ในคำสั่ง SQL เสมอ
ฉันยังใหม่มากกับการทำงานกับฐานข้อมูล ตอนนี้ฉันสามารถเขียนSELECT, UPDATE, DELETEและINSERTคำสั่ง แต่ฉันเคยเห็นฟอรัมมากมายที่เราชอบเขียน: SELECT empSalary from employee where salary = @salary ...แทน: SELECT empSalary from employee where salary = txtSalary.Text เหตุใดเราจึงชอบใช้พารามิเตอร์อยู่เสมอและฉันจะใช้พารามิเตอร์อย่างไร ฉันต้องการทราบการใช้งานและประโยชน์ของวิธีแรก ฉันเคยได้ยินเกี่ยวกับการแทรก SQL แต่ฉันไม่เข้าใจทั้งหมด ฉันไม่รู้ด้วยซ้ำว่าการฉีด SQL เกี่ยวข้องกับคำถามของฉันหรือไม่

12
ปลอดภัยไหมที่จะไม่กำหนดพารามิเตอร์แบบสอบถาม SQL เมื่อพารามิเตอร์ไม่ใช่สตริง
ในแง่ของการแทรก SQLฉันเข้าใจดีถึงความจำเป็นในการstringกำหนดพารามิเตอร์พารามิเตอร์ นั่นเป็นหนึ่งในเทคนิคที่เก่าแก่ที่สุดในหนังสือเล่มนี้ แต่เมื่อใดที่จะมีเหตุผลที่จะไม่กำหนดพารามิเตอร์SqlCommand? ประเภทข้อมูลใดบ้างที่ถือว่า "ปลอดภัย" ที่จะไม่กำหนดพารามิเตอร์ ตัวอย่างเช่นฉันไม่คิดว่าตัวเองอยู่ใกล้ผู้เชี่ยวชาญใน SQL แต่ฉันไม่สามารถนึกถึงกรณีใด ๆ ที่อาจเสี่ยงต่อการฉีด SQL เพื่อยอมรับboolหรือintและเพียงแค่เชื่อมต่อเข้ากับแบบสอบถามโดยตรง สมมติฐานของฉันถูกต้องหรืออาจทำให้เกิดช่องโหว่ด้านความปลอดภัยขนาดใหญ่ในโปรแกรมของฉัน? เพื่อความกระจ่างคำถามนี้ถูกแท็ก ค#ซึ่งเป็นภาษาที่พิมพ์ยาก เมื่อผมบอกว่า "พารามิเตอร์" public int Query(int id)คิดว่าสิ่งที่ต้องการ

21
การหลีกเลี่ยงการฉีด SQL โดยไม่มีพารามิเตอร์
เรากำลังมีการอภิปรายอีกครั้งในที่ทำงานเกี่ยวกับการใช้การสืบค้น sql ที่เป็นพารามิเตอร์ในโค้ดของเรา เรามีสองด้านในการสนทนา: ฉันและคนอื่น ๆ บางคนที่บอกว่าเราควรใช้พารามิเตอร์เพื่อป้องกันการฉีด sql และคนอื่น ๆ ที่ไม่คิดว่าจำเป็น แต่พวกเขาต้องการแทนที่เครื่องหมายวรรคตอนเดี่ยวด้วยเครื่องหมายอะพอสทรอฟีสองตัวในทุกสตริงเพื่อหลีกเลี่ยงการฉีด sql ฐานข้อมูลของเรากำลังรัน Sql Server 2005 หรือ 2008 และฐานรหัสของเราทำงานบน. NET framework 2.0 ขอยกตัวอย่างง่ายๆใน C #: ฉันต้องการให้เราใช้สิ่งนี้: string sql = "SELECT * FROM Users WHERE Name=@name"; SqlCommand getUser = new SqlCommand(sql, connection); getUser.Parameters.AddWithValue("@name", userName); //... blabla - do something here, …

11
ฉันต้องป้องกันการแทรก SQL หรือไม่ถ้าฉันใช้ดรอปดาวน์?
ฉันเข้าใจว่าคุณไม่ควรเชื่อถือการป้อนข้อมูลของผู้ใช้จากแบบฟอร์มเนื่องจากมีโอกาสเกิดการแทรก SQL อย่างไรก็ตามสิ่งนี้ใช้กับแบบฟอร์มที่อินพุตเพียงรายการเดียวมาจากดรอปดาวน์ (ดูด้านล่าง) หรือไม่ ฉันกำลังบันทึก$_POST['size']ลงในเซสชันซึ่งจะใช้ทั่วทั้งไซต์เพื่อสืบค้นฐานข้อมูลต่างๆ (ด้วยmysqliSelect query) และการฉีด SQL ใด ๆ จะเป็นอันตรายอย่างแน่นอน (อาจลดลง) ไม่มีพื้นที่สำหรับการป้อนข้อมูลของผู้ใช้ที่พิมพ์เพื่อสืบค้นฐานข้อมูลมีเพียงดรอปดาวน์ <form action="welcome.php" method="post"> <select name="size"> <option value="All">Select Size</option> <option value="Large">Large</option> <option value="Medium">Medium</option> <option value="Small">Small</option> </select> <input type="submit"> </form>

5
การป้องกันการแทรก SQL ใน Node.js
เป็นไปได้หรือไม่ที่จะป้องกันการแทรก SQL ใน Node.js (โดยเฉพาะอย่างยิ่งกับโมดูล) ในลักษณะเดียวกับที่ PHP มีคำสั่งที่เตรียมไว้ซึ่งป้องกันพวกเขา ถ้าเป็นเช่นนั้นอย่างไร? หากไม่เป็นเช่นนั้นตัวอย่างใดบ้างที่อาจข้ามรหัสที่ฉันให้ไว้ (ดูด้านล่าง) บริบทบางส่วน: ฉันกำลังสร้างเว็บแอปพลิเคชันที่มี back-end stack ซึ่งประกอบด้วย Node.js + MySql โดยใช้โมดูลnode-mysql จากมุมมองด้านการใช้งานโมดูลนี้ยอดเยี่ยมมาก แต่ยังไม่ได้ใช้บางสิ่งที่คล้ายกับคำสั่งเตรียมการของ PHP (แม้ว่าฉันจะทราบว่าเป็นสิ่งที่ต้องทำ ) จากความเข้าใจของฉันการใช้ PHP ของคำสั่งที่เตรียมไว้เหนือสิ่งอื่นใดช่วยอย่างมากในการป้องกันการแทรก SQL อย่างไรก็ตามฉันกังวลว่าแอป node.js ของฉันอาจเปิดรับการโจมตีที่คล้ายกันแม้ว่าจะมีการหลีกเลี่ยงสตริงที่ให้ไว้โดยค่าเริ่มต้นก็ตาม (ดังในข้อมูลโค้ดด้านล่าง) node-mysql ดูเหมือนจะเป็นตัวเชื่อมต่อ mysql ที่ได้รับความนิยมมากที่สุดสำหรับ node.js ดังนั้นฉันจึงสงสัยว่าคนอื่นอาจทำอะไร (ถ้ามี) เพื่ออธิบายปัญหานี้ - หรือแม้ว่าจะเป็นปัญหากับ node.js ที่จะเริ่มต้นด้วย (ไม่แน่ใจว่าจะไม่เป็นเช่นไรเนื่องจากอินพุตฝั่งผู้ใช้ / ไคลเอ็นต์เกี่ยวข้อง) ฉันควรเปลี่ยนไปใช้node-mysql-nativeในขณะนี้เนื่องจากมีคำสั่งที่เตรียมไว้หรือไม่ ฉันลังเลที่จะทำสิ่งนี้เพราะดูเหมือนว่าจะไม่ทำงานเท่า …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.