1. 양식 데이터
양식 데이터를 표시합니다
2.php에서 캡쳐한 폼 데이터
가 자동으로 추가되었습니다
3.mysql 데이터(하단)
은 mysql에 기록되지만 없음
4. mysql 소프트웨어에 의해 숨겨져 있는 것 같습니다. 명령줄을 확인하세요.
저도 못 봤어요
공식 성명에 따르면
http://www.php.net/manual/zh/function.addslashes.php
addlashes()를 사용하는 예는 데이터베이스에 데이터를 입력할 때입니다. 예를 들어 O'reilly라는 이름을 데이터베이스에 삽입하려면 해당 이름을 이스케이프해야 합니다. DBMS별 이스케이프 기능(예: MySQL의 경우 mysqli_real_escape_string(), PostgreSQL의 경우 pg_escape_string())을 사용하는 것이 좋습니다. 그러나 사용 중인 DBMS에 이스케이프 기능이 없고 특수 문자를 이스케이프하는 데 사용하는 경우에는 다음을 수행할 수 있습니다. 이 기능을 사용하세요. 데이터베이스에 데이터를 삽입하기 위해서만 추가 데이터가 삽입되지는 않습니다. PHP 지시문 Magic_quotes_sybase가 on으로 설정되면 '를 삽입하면 '으로 이스케이프된다는 의미입니다.
질문:
1. addleshes() 함수는 어떤 종류의 메커니즘을 사용하여 주입을 방지하나요?
2. 어떤 상황에서 Stripslashes()를 사용하나요?
3. 제출된 데이터를 htmlspecialchars()로 직접 이스케이프하여 데이터베이스에 저장하면 더 좋을까요?
4. SQL 삽입을 방지하는 가장 좋은 방법은 무엇인가요?
.
1. 양식 데이터
양식 데이터를 표시합니다
2.php에서 캡쳐한 폼 데이터
가 자동으로 추가되었습니다
3.mysql 데이터(하단)
은 mysql에 기록되지만 없음
4. mysql 소프트웨어에 의해 숨겨져 있는 것 같습니다. 명령줄을 확인하세요.
저도 못 봤어요
공식 성명에 따르면
http://www.php.net/manual/zh/function.addslashes.php
addlashes()를 사용하는 예는 데이터베이스에 데이터를 입력할 때입니다. 예를 들어 O'reilly라는 이름을 데이터베이스에 삽입하려면 해당 이름을 이스케이프해야 합니다. DBMS별 이스케이프 기능(예: MySQL의 경우 mysqli_real_escape_string(), PostgreSQL의 경우 pg_escape_string())을 사용하는 것이 좋습니다. 그러나 사용 중인 DBMS에 이스케이프 기능이 없고 특수 문자를 이스케이프하는 데 사용하는 경우에는 다음을 수행할 수 있습니다. 이 기능을 사용하세요. 단지 데이터베이스에 데이터를 삽입하기 위해 추가 데이터가 삽입되지는 않습니다. PHP 지시문 Magic_quotes_sybase가 on으로 설정되면 '를 삽입하면 '으로 이스케이프된다는 의미입니다.
질문:
1. addleshes() 함수는 어떤 종류의 메커니즘을 사용하여 주입을 방지하나요?
2. 어떤 상황에서 Stripslashes()를 사용하나요?
3. 제출된 데이터를 htmlspecialchars()로 직접 이스케이프하여 데이터베이스에 저장하면 더 좋을까요?
4. SQL 삽입을 방지하는 가장 좋은 방법은 무엇인가요?
.
문서에 적힌 대로 addslashes
는 매개변수 따옴표 앞에 슬래시만 추가하면 됩니다.
인쇄한 데이터와 마찬가지로 매개변수 앞에 슬래시가 있습니다.
하지만 데이터베이스에는 슬래시가 있어서는 안 됩니다! addslashes
주입을 방지하는 방법은 SQL
작성 시 입력 매개변수가 직접 적용되는 것을 방지하여 주입을 방지할 수 있는 SQL
을 생성하는 것입니다.
예를 들어 $sql = "SELECT * FROM user WHERE id = '$id'";
, 여기서 $id
매개변수를 고의로 1' OR '1 = 1'
에 조작한다면 SQL
의 인젝션이 되지 않을까요?
그리고 슬래시와 함께 addslashes
을 사용하면 $id
안의 따옴표가 번역되어 잘못된 SQL
이 생성되지 않습니다. 그러나 이러한 결과는 데이터 쓰기에 영향을 미치지 않습니다. 왜냐하면 데이터가 실제로 삽입되고 업데이트될 때 이러한 슬래시가 다시 변환되기 때문입니다.
SQL 주입 방지(입력 데이터베이스):
PDO bindParam 또는 mysqli_stmt_bind_param: SQL 주입을 방지합니다.
슬래시 추가: 백슬래시를 사용하여 SQL을 방지하기 위해 모든 작은따옴표, 큰따옴표, 백슬래시 및 NUL을 어느 정도 이스케이프합니다. 주입.
mysqli_real_escape_string: SQL 문에서 특수 문자를 이스케이프합니다.
bind_param을 사용하면 addlashes, mysqli_real_escape_string, Magic_quotes_gpc를 사용할 필요가 없습니다.
예:
<code>PDO MySQL: //方法1(问号占位符) $stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'); $stmt->execute(array($title,$content,$id)); //所有值视作PDO::PARAM_STR处理 //方法2(命名占位符) $stmt = $db->prepare('UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id'); $stmt->execute(array(':title' => $title,':content' => $content,':id' => $id)); //所有值视作PDO::PARAM_STR处理 //方法3 $stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'); $stmt->bindParam(1, $title, PDO::PARAM_STR); $stmt->bindParam(2, $content, PDO::PARAM_STR); $stmt->bindParam(3, $id, PDO::PARAM_INT); $stmt->execute(); //方法4 $stmt = $db->prepare('UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id'); $stmt->bindParam(':title', $title, PDO::PARAM_STR); $stmt->bindParam(':content', $content, PDO::PARAM_STR); $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute(); MySQLi: //MySQLi只需执行一次bind_param,要比PDO简洁一些,MySQLi不支持命名占位符. $stmt->bind_param('ssi', $title, $content, $id);</code>
당신이 언급한 htmlspecialchars는 HTML 출력 시 XSS 공격을 방어하기 위한 것으로 위에서 언급한 SQL 삽입에 대한 방어와 다릅니다.