복붙노트

PHP에서 데이터베이스에 문자열을 제출할 때 htmlspecialchars ()를 사용하여 불법 문자를 처리하거나 정규 표현식을 사용해야합니까?

PHP

PHP에서 데이터베이스에 문자열을 제출할 때 htmlspecialchars ()를 사용하여 불법 문자를 처리하거나 정규 표현식을 사용해야합니까?

사용자가 데이터베이스에 제출할 문자열에 불법 / 특수 문자를 사용할 수있는 가능성이있는 양식을 작성 중입니다. 이스케이프 / 문자열에서 이러한 문자를 무효화하고 htmlspecialchars () 사용하고 싶습니다. 그러나 더 나은 / 더 빠른 방법이 있습니까?

해결법

  1. ==============================

    1.이 데이터를 데이터베이스에 제출하면 데이터베이스의 이스케이프 기능을 살펴보십시오.

    이 데이터를 데이터베이스에 제출하면 데이터베이스의 이스케이프 기능을 살펴보십시오.

    즉, MySQL의 경우 mysql_real_escape_string이 있습니다.

    이러한 이스케이프 기능은 악의적 인 문자를 처리하며 사용자가 입력 한 것과 같은 방식으로 데이터를 가져옵니다.

    준비된 명령문을 사용하여 데이터를 관리 할 수도 있습니다.

    $dbPreparedStatement = $db->prepare('INSERT INTO table (htmlcontent) VALUES (?)');
    $dbPreparedStatement->execute(array($yourHtmlData));
    

    또는 조금 더 자기 설명 :

    $dbPreparedStatement = $db->prepare('INSERT INTO table (htmlcontent) VALUES (:htmlcontent)');
    $dbPreparedStatement->execute(array(':htmlcontent' => $yourHtmlData));
    

    다양한 유형의 데이터를 저장하려면 bindParam을 사용하여 각 유형을 정의하십시오. 즉, 정수는 $ db-> bindParam ( ': userId', $ userId, PDO :: PARAM_INT);로 정의 할 수 있습니다. 예:

    $dbPreparedStatement = $db->prepare('INSERT INTO table (postId, htmlcontent) VALUES (:postid, :htmlcontent)');
    $dbPreparedStatement->bindParam(':postid', $userId, PDO::PARAM_INT);
    $dbPreparedStatement->bindParam(':htmlcontent', $yourHtmlData, PDO::PARAM_STR);
    $dbPreparedStatement->execute();
    

    여기서 $ db는 PHP 데이터 객체 (PDO)입니다. PHP 데이터 객체를 사용하고 있지 않다면 PHP 데이터 객체에서 PHP에 대한 자세한 정보를 얻을 수 있습니다.

  2. ==============================

    2.데이터베이스에는 "불법"문자가 없습니다. 일부 문자를 저장할 수없는 데이터베이스는 의미가 없습니다. 문자열을 구분하는 데 사용되는 따옴표와 같은 일부 서비스 문자가 있습니다. 이러한 문자는 제거되지 않고 그냥 이스케이프되어야합니다.

    데이터베이스에는 "불법"문자가 없습니다. 일부 문자를 저장할 수없는 데이터베이스는 의미가 없습니다. 문자열을 구분하는 데 사용되는 따옴표와 같은 일부 서비스 문자가 있습니다. 이러한 문자는 제거되지 않고 그냥 이스케이프되어야합니다.

    데이터베이스에 쿼리를 보내려면 다음 두 가지 옵션이 있습니다.

    위의 모든 내용은 쿼리의 데이터 부분만을 다룹니다. 그러나 연산자 또는 식별자를 추가하여 쿼리를 더욱 동적으로 만들어야하는 경우가 있습니다. 이 경우 모든 동적 매개 변수는 스크립트에서 하드 코딩되어야하며 해당 집합에서 선택해야합니다. 예를 들어 동적 순서 지정을 수행하려면 다음을 수행하십시오.

    $orders  = array("name","price","qty"); //field names
    $key     = array_search($_GET['sort'],$orders)); // see if we have such a name
    $orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :)
    $query   = "SELECT * FROM `table` ORDER BY $orderby"; //value is safe
    

    또는 동적 검색 :

    $w     = array();
    $where = '';
    
    if (!empty($_GET['rooms']))     $w[]="rooms='".mesc($_GET['rooms'])."'";
    if (!empty($_GET['space']))     $w[]="space='".mesc($_GET['space'])."'";
    if (!empty($_GET['max_price'])) $w[]="price < '".mesc($_GET['max_price'])."'";
    
    if (count($w)) $where="WHERE ".implode(' AND ',$w);
    $query="select * from table $where";
    

    이 예에서는 필드 이름이 아닌 사용자가 입력 한 데이터 만 쿼리에 추가합니다.이 데이터는 모두 스크립트에 하드 코드됩니다. 바인딩의 경우 알고리즘은 매우 유사합니다.

    등등.

  3. ==============================

    3.우선 데이터베이스에 삽입하기 전에 표시 할 때 사물을 위생해야합니다. SQL 인젝션은 또 다른 이야기지만, 아마 오프 주제입니다.

    우선 데이터베이스에 삽입하기 전에 표시 할 때 사물을 위생해야합니다. SQL 인젝션은 또 다른 이야기지만, 아마 오프 주제입니다.

    둘째, 사용자가 HTML을 전혀 게시 할 필요가 없으면 htmlspecialchars 만 있으면됩니다. HTML의 모든 특수 문자를 처리합니다.

  4. ==============================

    4.사용자는 실제로 그 이상으로 갈 수 있습니다.

    사용자는 실제로 그 이상으로 갈 수 있습니다.

    HTML 정수기 사용 :

    스스로 결정해라. :)

  5. ==============================

    5.이것은 스스로 해결하려는 문제가 아닙니다. HTML Purifier와 같은 라이브러리가 있습니다.

    이것은 스스로 해결하려는 문제가 아닙니다. HTML Purifier와 같은 라이브러리가 있습니다.

  6. ==============================

    6.이러한 불법 문자가 무엇인지는 명시하지 않았지만 데이터를 이스케이프 처리하기 위해 데이터베이스 API의 제공된 메커니즘을 사용해야합니다. 예를 들어, MySQL을 사용하는 경우 PDO 매개 변수화 된 SQL 문을 사용하십시오.

    이러한 불법 문자가 무엇인지는 명시하지 않았지만 데이터를 이스케이프 처리하기 위해 데이터베이스 API의 제공된 메커니즘을 사용해야합니다. 예를 들어, MySQL을 사용하는 경우 PDO 매개 변수화 된 SQL 문을 사용하십시오.

  7. from https://stackoverflow.com/questions/2993027/in-php-when-submitting-strings-to-the-database-should-i-take-care-of-illegal-cha by cc-by-sa and MIT license