특정 유형의 HTML 태그를 계속 허용하면서 SQL 삽입 및 XSS 공격에 대한 사용자 입력을 삭제하는 데 잘 작동하는 catchall 기능이 있습니까?
PHP로 사용자 입력을 삭제하려면 어떻게 해야 합니까?
질문자 :Brent
사용자 입력을 필터링할 수 있다는 것은 일반적인 오해입니다. PHP에는 이 아이디어를 기반으로 하는 magic-quotes 라고 하는 (지금은 사용되지 않는) "기능"이 있습니다. 말도 안돼 필터링(또는 청소, 또는 사람들이 부르는 것)은 잊어버리십시오.
문제를 피하기 위해 해야 할 일은 매우 간단합니다. 외부 코드에 데이터를 포함할 때마다 해당 코드의 형식 지정 규칙에 따라 처리해야 합니다. 그러나 이러한 규칙은 수동으로 모두 따르기에는 너무 복잡할 수 있음을 이해해야 합니다. 예를 들어, SQL에서 문자열, 숫자 및 식별자에 대한 규칙은 모두 다릅니다. 편의를 위해 대부분의 경우 이러한 포함을 위한 전용 도구가 있습니다. 예를 들어, SQL 쿼리에서 PHP 변수를 사용해야 하는 경우 모든 적절한 형식화/처리를 처리하는 준비된 명령문을 사용해야 합니다.
또 다른 예는 HTML입니다. HTML 마크업 내에 문자열을 포함하는 경우 htmlspecialchars
이스케이프해야 합니다. echo
또는 print
문에서 htmlspecialchars
사용해야 함을 의미합니다.
세 번째 예는 쉘 명령일 수 있습니다. 외부 명령에 문자열(예: 인수)을 포함하고 exec
escapeshellcmd
및 escapeshellarg
를 사용해야 합니다.
또한 매우 매력적인 예는 JSON입니다. 규칙이 너무 많고 복잡하여 수동으로 모두 따를 수는 없습니다. 그렇기 때문에 JSON 문자열을 수동으로 생성해서는 안 되며 모든 데이터 비트를 올바르게 형식화 json_encode()
등등 등등...
데이터를 능동적으로 필터링해야 하는 유일한 경우는 미리 형식이 지정된 입력을 수락하는 경우입니다. 예를 들어 사용자가 HTML 마크업을 게시할 수 있도록 하면 사이트에 표시할 계획입니다. 그러나 아무리 잘 필터링하더라도 항상 잠재적인 보안 허점이 있기 때문에 이를 피하는 것이 현명해야 합니다.
troelskn
입력 데이터를 삭제하여 SQL 주입을 방지하려고 하지 마십시오.
대신 SQL 코드를 생성하는 데 데이터가 사용되지 않도록 하십시오 . 바인딩된 변수를 사용하는 준비된 명령문(예: 템플릿 쿼리에서 매개변수 사용)을 사용합니다. SQL 인젝션에 대해 보장할 수 있는 유일한 방법입니다.
SQL 주입 방지에 대한 자세한 내용은 내 웹 사이트 http://bobby-tables.com/을 참조하십시오.
Andy Lester
아니요. 데이터의 용도에 대한 컨텍스트 없이 데이터를 일반적으로 필터링할 수 없습니다. 때로는 SQL 쿼리를 입력으로 사용하고 때로는 HTML을 입력으로 사용하려고 합니다.
화이트리스트에서 입력을 필터링해야 합니다. 데이터가 예상한 사양과 일치하는지 확인하세요. 그런 다음 사용하는 컨텍스트에 따라 사용하기 전에 이스케이프해야 합니다.
SQL 인젝션을 방지하기 위해 SQL 데이터를 이스케이프하는 프로세스는 XSS를 방지하기 위해 (X)HTML 데이터를 이스케이프하는 프로세스와 매우 다릅니다.
Daniel Papasian
FILTER_VALIDATE_EMAIL
유형이 내장되어 있으므로 '궁극의 이메일 정규식'을 찾지 filter_input
되는 새로운 멋진 filter_input 기능이 있습니다.
내 자신의 필터 클래스(JavaScript를 사용하여 잘못된 필드 강조 표시)는 ajax 요청 또는 일반 양식 게시물에 의해 시작될 수 있습니다. (아래 예 참조) <? /** * 돼지고기 Formvalidator. 정규식으로 필드의 유효성을 검사하고 삭제할 수 있습니다. PHP filter_var 내장 함수 및 추가 정규식 사용 * @package 돼지고기 */
/** * Pork.FormValidator * Validates arrays or properties by setting up simple arrays. * Note that some of the regexes are for dutch input! * Example: * * $validations = array('name' => 'anything','email' => 'email','alias' => 'anything','pwd'=>'anything','gsm' => 'phone','birthdate' => 'date'); * $required = array('name', 'email', 'alias', 'pwd'); * $sanitize = array('alias'); * * $validator = new FormValidator($validations, $required, $sanitize); * * if($validator->validate($_POST)) * { * $_POST = $validator->sanitize($_POST); * // now do your saving, $_POST has been sanitized. * die($validator->getScript()."<script type='text/javascript'>alert('saved changes');</script>"); * } * else * { * die($validator->getScript()); * } * * To validate just one element: * $validated = new FormValidator()->validate('blah@bla.', 'email'); * * To sanitize just one element: * $sanitized = new FormValidator()->sanitize('<b>blah</b>', 'string'); * * @package pork * @author SchizoDuckie * @copyright SchizoDuckie 2008 * @version 1.0 * @access public */ class FormValidator { public static $regexes = Array( 'date' => "^[0-9]{1,2}[-/][0-9]{1,2}[-/][0-9]{4}\$", 'amount' => "^[-]?[0-9]+\$", 'number' => "^[-]?[0-9,]+\$", 'alfanum' => "^[0-9a-zA-Z ,.-_\\s\?\!]+\$", 'not_empty' => "[a-z0-9A-Z]+", 'words' => "^[A-Za-z]+[A-Za-z \\s]*\$", 'phone' => "^[0-9]{10,11}\$", 'zipcode' => "^[1-9][0-9]{3}[a-zA-Z]{2}\$", 'plate' => "^([0-9a-zA-Z]{2}[-]){2}[0-9a-zA-Z]{2}\$", 'price' => "^[0-9.,]*(([.,][-])|([.,][0-9]{2}))?\$", '2digitopt' => "^\d+(\,\d{2})?\$", '2digitforce' => "^\d+\,\d\d\$", 'anything' => "^[\d\D]{1,}\$" ); private $validations, $sanatations, $mandatories, $errors, $corrects, $fields; public function __construct($validations=array(), $mandatories = array(), $sanatations = array()) { $this->validations = $validations; $this->sanitations = $sanitations; $this->mandatories = $mandatories; $this->errors = array(); $this->corrects = array(); } /** * Validates an array of items (if needed) and returns true or false * */ public function validate($items) { $this->fields = $items; $havefailures = false; foreach($items as $key=>$val) { if((strlen($val) == 0 || array_search($key, $this->validations) === false) && array_search($key, $this->mandatories) === false) { $this->corrects[] = $key; continue; } $result = self::validateItem($val, $this->validations[$key]); if($result === false) { $havefailures = true; $this->addError($key, $this->validations[$key]); } else { $this->corrects[] = $key; } } return(!$havefailures); } /** * * Adds unvalidated class to thos elements that are not validated. Removes them from classes that are. */ public function getScript() { if(!empty($this->errors)) { $errors = array(); foreach($this->errors as $key=>$val) { $errors[] = "'INPUT[name={$key}]'"; } $output = '$$('.implode(',', $errors).').addClass("unvalidated");'; $output .= "new FormValidator().showMessage();"; } if(!empty($this->corrects)) { $corrects = array(); foreach($this->corrects as $key) { $corrects[] = "'INPUT[name={$key}]'"; } $output .= '$$('.implode(',', $corrects).').removeClass("unvalidated");'; } $output = "<script type='text/javascript'>{$output} </script>"; return($output); } /** * * Sanitizes an array of items according to the $this->sanitations * sanitations will be standard of type string, but can also be specified. * For ease of use, this syntax is accepted: * $sanitations = array('fieldname', 'otherfieldname'=>'float'); */ public function sanitize($items) { foreach($items as $key=>$val) { if(array_search($key, $this->sanitations) === false && !array_key_exists($key, $this->sanitations)) continue; $items[$key] = self::sanitizeItem($val, $this->validations[$key]); } return($items); } /** * * Adds an error to the errors array. */ private function addError($field, $type='string') { $this->errors[$field] = $type; } /** * * Sanitize a single var according to $type. * Allows for static calling to allow simple sanitization */ public static function sanitizeItem($var, $type) { $flags = NULL; switch($type) { case 'url': $filter = FILTER_SANITIZE_URL; break; case 'int': $filter = FILTER_SANITIZE_NUMBER_INT; break; case 'float': $filter = FILTER_SANITIZE_NUMBER_FLOAT; $flags = FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND; break; case 'email': $var = substr($var, 0, 254); $filter = FILTER_SANITIZE_EMAIL; break; case 'string': default: $filter = FILTER_SANITIZE_STRING; $flags = FILTER_FLAG_NO_ENCODE_QUOTES; break; } $output = filter_var($var, $filter, $flags); return($output); } /** * * Validates a single var according to $type. * Allows for static calling to allow simple validation. * */ public static function validateItem($var, $type) { if(array_key_exists($type, self::$regexes)) { $returnval = filter_var($var, FILTER_VALIDATE_REGEXP, array("options"=> array("regexp"=>'!'.self::$regexes[$type].'!i'))) !== false; return($returnval); } $filter = false; switch($type) { case 'email': $var = substr($var, 0, 254); $filter = FILTER_VALIDATE_EMAIL; break; case 'int': $filter = FILTER_VALIDATE_INT; break; case 'boolean': $filter = FILTER_VALIDATE_BOOLEAN; break; case 'ip': $filter = FILTER_VALIDATE_IP; break; case 'url': $filter = FILTER_VALIDATE_URL; break; } return ($filter === false) ? false : filter_var($var, $filter) !== false ? true : false; } }
물론 사용 중인 db 유형에 따라 SQL 쿼리 이스케이프도 수행해야 한다는 점을 염두에 두십시오(예를 들어 SQL Server에서는 mysql_real_escape_string()이 쓸모가 없습니다). ORM과 같은 적절한 애플리케이션 계층에서 이를 자동으로 처리하고 싶을 것입니다. 또한 위에서 언급했듯이 html로 출력하려면 htmlspecialchars와 같은 다른 PHP 전용 기능을 사용하십시오.)
제거된 클래스 및/또는 태그와 같은 HTML 입력을 실제로 허용하려면 전용 xss 유효성 검사 패키지 중 하나에 의존합니다. HTML을 구문 분석하기 위해 자신의 정규식을 작성하지 마십시오!
SchizoDuckie
아니 없어.
우선 SQL 주입은 입력 필터링 문제이고 XSS는 출력 이스케이프이므로 코드 수명 주기에서 이 두 작업을 동시에 실행하지도 않습니다.
기본 경험 법칙
- SQL 쿼리의 경우 매개변수를 바인딩하거나(PDO에서와 같이) 쿼리 변수에 드라이버 네이티브 이스케이프 함수를 사용합니다(예:
mysql_real_escape_string()
). -
strip_tags()
를 사용하여 원치 않는 HTML 필터링 -
htmlspecialchars()
하여 다른 모든 출력을 이스케이프하고 여기에서 두 번째 및 세 번째 매개변수에 유의하십시오.
Peter Bailey
XSS 문제를 해결하려면 HTML Purifier를 살펴보십시오. 그것은 상당히 구성 가능하고 괜찮은 실적을 가지고 있습니다.
SQL 인젝션 공격의 경우 사용자 입력을 확인하고 mysql_real_escape_string()을 통해 실행한다. 하지만 이 기능이 모든 주입 공격을 물리치는 것은 아니므로 쿼리 문자열에 데이터를 덤프하기 전에 데이터를 확인하는 것이 중요합니다.
더 나은 솔루션은 준비된 문을 사용하는 것입니다. PDO 라이브러리 와 mysqli 확장은 이를 지원합니다.
jasonbar
PHP 5.2에는 filter_var
함수가 도입되었습니다.
SANITIZE
, VALIDATE
필터를 많이 지원합니다.
dangel
PHP로 사용자 입력을 삭제하는 방법:
최신 버전의 MySQL 및 PHP를 사용하십시오.
charset을 명시적으로 설정합니다.
$mysqli->set_charset("utf8");
설명서$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);
설명서$pdo->exec("설정 이름 utf8");
설명서$pdo = 새로운 PDO( "mysql:host=$host;dbname=$db", $user, $pass, 정렬( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "이름 utf8 설정" ) );
설명서mysql_set_charset('utf8')
보안 문자 집합 사용:
- utf8, latin1, ascii..를 선택하고 취약한 문자 집합 big5, cp932, gb2312, gbk, sjis를 사용하지 마십시오.
공간화 함수 사용:
- MySQLi 준비된 명령문:
$stmt = $mysqli->prepare('SELECT * FROM test WHERE name = ? LIMIT 1');
$param = "' OR 1=1 /*";
$stmt->bind_param('s', $param);
$stmt->실행(); PDO::quote() - 기본 드라이버에 적합한 인용 스타일을 사용하여 입력 문자열 주위에 따옴표를 배치하고(필요한 경우) 입력 문자열 내에서 특수 문자를 이스케이프합니다.
$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password); 명시적 세트 문자 세트
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, 거짓); MySQL이 기본적으로 준비할 수 없는 에뮬레이션 명령문으로의 폴백을 방지하기 위해 준비된 명령문 에뮬레이션 비활성화(주입 방지)
$var = $pdo->quote("' OR 1=1 /*"); 리터럴을 이스케이프할 뿐만 아니라 따옴표로 묶습니다(작은 따옴표 ' 문자로). $stmt = $pdo->query("SELECT * FROM 테스트 WHERE 이름 = $var LIMIT 1");PDO 준비된 명령문 : vs MySQLi 준비된 명령문은 더 많은 데이터베이스 드라이버와 명명된 매개변수를 지원합니다.
$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password); 명시적 세트 문자 세트
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, 거짓); MySQL이 기본적으로 준비할 수 없는 에뮬레이션 명령문으로의 폴백을 방지하기 위해 준비된 명령문 에뮬레이션 비활성화(주입 방지) $stmt = $pdo->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $stmt->execute(["' OR 1=1 /*"]);-
mysql_real_escape_string[PHP 5.5.0에서 더 이상 사용되지 않음, PHP 7.0.0에서 제거됨]. - mysqli_real_escape_string 연결의 현재 문자 집합을 고려하여 SQL 문에서 사용하기 위해 문자열의 특수 문자를 이스케이프합니다. 그러나 단순히 이스케이프된 문자열이 아니기 때문에 준비된 문을 사용하는 것이 좋습니다. 문은 사용할 테이블과 인덱스를 포함하여 완전한 쿼리 실행 계획을 제시하므로 최적화된 방법입니다.
- 쿼리 내에서 변수 주위에 작은따옴표(' ')를 사용합니다.
- MySQLi 준비된 명령문:
변수에 예상한 내용이 포함되어 있는지 확인하십시오.
- 정수가 필요하면 다음을 사용하십시오.
ctype_digit — 숫자를 확인합니다.
$값 = (int) $값;
$값 = intval($값);
$var = filter_var('0755', FILTER_VALIDATE_INT, $옵션); - 문자열의 경우:
is_string() — 변수의 유형이 문자열인지 여부를 찾습니다.
필터 함수 사용 filter_var() — 지정된 필터로 변수를 필터링합니다.$email = filter_var($email, FILTER_SANITIZE_EMAIL);
더 많은 사전 정의 필터
$newstr = filter_var($str, FILTER_SANITIZE_STRING); - filter_input() — 이름으로 특정 외부 변수를 가져오고 선택적으로 필터링합니다.
$search_html = filter_input(INPUT_GET, '검색', FILTER_SANITIZE_SPECIAL_CHARS);
- preg_match() — 정규식 일치를 수행합니다.
- 자신의 유효성 검사 기능을 작성하십시오.
- 정수가 필요하면 다음을 사용하십시오.
Mark Martin
/mypage?id=53
과 같은 페이지가 있고 WHERE 절에서 id를 사용하는 특정 상황에서 도움이 될 수 있는 한 가지 트릭은 다음과 같이 id가 확실히 정수인지 확인하는 것입니다.
if (isset($_GET['id'])) { $id = $_GET['id']; settype($id, 'integer'); $result = mysql_query("SELECT * FROM mytable WHERE id = '$id'"); # now use the result }
그러나 물론 그것은 하나의 특정 공격만 차단하므로 다른 모든 답변을 읽으십시오. (그리고 예, 위의 코드가 훌륭하지 않다는 것을 알고 있지만 구체적인 방어를 보여줍니다.)
Hamish Downer
여기에서 설명하는 것은 두 가지 별개의 문제입니다.
- 사용자 입력 데이터의 살균/필터링.
- 이스케이프 출력.
1) 사용자 입력은 항상 나쁜 것으로 가정해야 합니다.
준비된 명령문을 사용하거나 mysql_real_escape_string으로 필터링하는 것은 확실히 필수입니다. PHP에는 시작하기에 좋은 filter_input이 내장되어 있습니다.
2) 이것은 큰 주제이며 출력되는 데이터의 컨텍스트에 따라 다릅니다. HTML의 경우 htmlpurifier와 같은 솔루션이 있습니다. 일반적으로 출력하는 것은 항상 이스케이프 처리하십시오.
두 문제 모두 단일 게시물에 다루기에는 너무 크지만 더 자세히 설명하는 게시물이 많이 있습니다.
Andrew
해결해야 할 여러 문제가 있기 때문에 포괄 기능은 없습니다.
- SQL 주입 - 오늘날 일반적으로 모든 PHP 프로젝트는 모범 사례로 PHP 데이터 개체(PDO) 를 통해 준비된 명령문을 사용해야 하며, 주입에 대한 모든 기능을 갖춘 솔루션은 물론 잘못된 인용으로 인한 오류를 방지해야 합니다 . 또한 데이터베이스에 액세스하는 가장 유연하고 안전한 방법입니다.
PDO에 대해 알아야 할 거의 모든 것을 보려면 (유일하게 적절한) PDO 튜토리얼 을 확인하십시오. (이 주제에 대한 훌륭한 리소스를 제공한 최고 SO 기고자 @YourCommonSense에 진심으로 감사드립니다.)
- XSS - 가는 길에 데이터 삭제...
HTML Purifier 는 오랫동안 사용되어 왔으며 여전히 활발히 업데이트되고 있습니다. 이를 사용하여 악의적인 입력을 삭제하는 동시에 태그의 관대하고 구성 가능한 화이트리스트를 허용할 수 있습니다. 많은 WYSIWYG 편집기에서 잘 작동하지만 일부 사용 사례에서는 무거울 수 있습니다.
HTML/Javascript를 전혀 받아들이고 싶지 않은 다른 경우에는 이 간단한 기능이 유용하다는 것을 알았습니다(XSS에 대한 여러 감사를 통과했습니다).
/* Prevent XSS input */ function sanitizeXSS () { $_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); $_REQUEST = (array)$_POST + (array)$_GET + (array)$_REQUEST; }
- XSS - 나가는 길 에 데이터 삭제... 데이터베이스에 데이터를 추가하기 전에 데이터가 제대로 삭제되었음을 보장하지 않는 한 사용자에게 표시하기 전에 데이터를 삭제해야 합니다. 다음과 같은 유용한 PHP 기능을 활용할 수 있습니다.
- 사용자가 제공한 값을 표시하기 위해
echo
또는print
를 호출할 때 데이터가 적절하게 삭제되고 HTML을 표시할 수 있는 경우가 아니면htmlspecialchars
-
json_encode
는 PHP에서 Javascript로 사용자 제공 값을 제공하는 안전한 방법입니다.
-
exec()
또는system()
함수를 사용하거나backtick
연산자를 사용하여 외부 쉘 명령을 호출합니까? 그렇다면 SQL 주입 및 XSS 외에도 서버에서 악의적인 명령을 실행하는 사용자 를 처리해야 하는 추가 문제가 있을 수 있습니다. 당신은 사용해야escapeshellcmd
는 전체 명령을 탈출하고 싶은 경우, 또는escapeshellarg
개별 인수를 탈출.
webaholik
PostgreSQL을 사용하는 경우 PHP의 입력을 pg_escape_literal()
$username = pg_escape_literal($_POST['username']);
문서에서 :
pg_escape_literal()
은 PostgreSQL 데이터베이스 쿼리를 위한 리터럴을 이스케이프합니다. PostgreSQL 형식으로 이스케이프된 리터럴을 반환합니다.
Alejandro Silva
입력을 삭제하고 데이터를 이스케이프하는 실수를 피하는 가장 쉬운 방법은 Symfony , Nette 등과 같은 PHP 프레임워크 또는 해당 프레임워크의 일부(템플릿 엔진, 데이터베이스 계층, ORM)를 사용하는 것입니다.
Twig 또는 Latte와 같은 템플릿 엔진에는 기본적으로 출력 이스케이프가 켜져 있습니다. 컨텍스트(웹 페이지의 HTML 또는 Javascript 부분)에 따라 출력을 올바르게 이스케이프 처리했다면 수동으로 해결할 필요가 없습니다.
프레임워크는 입력을 자동으로 삭제하므로 $_POST, $_GET 또는 $_SESSION 변수를 직접 사용해서는 안 되며 라우팅, 세션 처리 등과 같은 메커니즘을 통해 사용해야 합니다.
그리고 데이터베이스(모델) 레이어에는 Doctrine과 같은 ORM 프레임워크나 Nette Database와 같은 PDO를 둘러싼 래퍼가 있습니다.
여기에서 자세히 읽을 수 있습니다 . 소프트웨어 프레임워크란 무엇입니까?
Ondřej Šotek
출력 이스케이프의 주제에 추가하고 싶었습니다. php DOMDocument를 사용하여 html 출력을 만드는 경우 올바른 컨텍스트에서 자동으로 이스케이프됩니다. 속성(value="")과 <span>의 내부 텍스트가 같지 않습니다. XSS로부터 안전하려면 다음을 읽으십시오. OWASP XSS 예방 치트 시트
user138720
입력을 위생 처리하지 않습니다.
항상 출력을 살균합니다.
SQL 문에 안전하게 포함하기 위해 데이터에 적용하는 변환은 HTML에 포함을 신청하는 것과 완전히 다릅니다. Javascript에 포함을 신청하는 것과 완전히 다릅니다. LDIF에 포함을 신청하는 것과 완전히 다릅니다. CSS에 포함하기 위해 적용한 것과 완전히 다릅니다. 이메일에 포함하기 위해 적용한 것과 완전히 다릅니다....
반드시 입력을 확인 하십시오. 추가 처리를 위해 입력을 수락할지 아니면 사용자에게 허용되지 않음을 알릴지 결정합니다. 그러나 PHP 영역을 떠날 때까지 데이터 표현에 변경 사항을 적용하지 마십시오.
오래 전에 누군가가 데이터를 이스케이프하기 위한 획일적인 메커니즘을 발명하려고 했고 우리는 모든 출력 대상에 대한 데이터를 제대로 이스케이프하지 않고 작동하는 데 다른 코드가 필요한 다른 설치 결과를 초래하는 " magic_quotes "로 끝났습니다.
symcbean
이 공백을 자르고 인쇄할 수 없는 문자를 제거합니다.
$data = trim(preg_replace('/[[:^print:]]/', '', $data));
Anmol Mourya
모든 GPC 변수와 잘 작동하는 필터 확장( howto-link , manual )이 있습니다. 모든 것을 할 수 있는 마법은 아니지만 여전히 사용해야 합니다.
Till
사용자 데이터를 절대 신뢰하지 마십시오.
function clean_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; }
trim()
함수는 문자열의 양쪽에서 공백 및 기타 미리 정의된 문자를 제거합니다.
stripslashes()
함수는 백슬래시를 제거합니다.
htmlspecialchars()
함수는 미리 정의된 일부 문자를 HTML 엔터티로 변환합니다.
미리 정의된 문자는 다음과 같습니다.
& (ampersand) becomes & " (double quote) becomes " ' (single quote) becomes ' < (less than) becomes < > (greater than) becomes >
Erik Thiart
출처 : http:www.stackoverflow.com/questions/129677/how-can-i-sanitize-user-input-with-php