StringContainsQ And
StringContainsQ[{"abcd", "cdab", "acdb", "abdc"},
("ab" ~~ ___ ~~ "cd")|( "cd" ~~ ___ ~~ "ab")]
{True, True, False, False}
Also
And @@@ Transpose[StringContainsQ[{"abcd", "cdab", "acdb", "abdc"}, #]&/@ {"ab", "cd"}]
{True, True, False, False}
And @@@ Outer[StringContainsQ,{"abcd", "cdab", "acdb", "abdc"}, {"ab","cd"}]
{True, True, False, False}
StringContainsQ[{"abcd", "cdab", "acdb", "abdc"}, RegularExpression["(?=.*ab)(?=.*cd)"]]
{True, True, False, False}
(See Achieving logical “and” with Look-aheads (ie in regular expressions) and this SO answer).
strings = {"fcdeab", "abcdef", "cdefab", "acfdbe", "efabdc"};
joins = StringJoin /@ Partition[#, 2, 1] & /@ Map[Characters, strings];
{"ab", "cd"} == Intersection[#, {"ab", "cd"}] & /@ joins
{True, True, True, False, False}